xref: /freebsd-src/contrib/llvm-project/clang/lib/Sema/TreeTransform.h (revision 0eae32dcef82f6f06de6419a0d623d7def0cc8f6)
1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
139   static inline ExprResult Owned(Expr *E) { return E; }
140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is useful when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Subclasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define GEN_CLANG_CLAUSE_CLASS
735 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
736   LLVM_ATTRIBUTE_NOINLINE                                                      \
737   OMPClause *Transform##Class(Class *S);
738 #include "llvm/Frontend/OpenMP/OMP.inc"
739 
740   /// Build a new qualified type given its unqualified type and type location.
741   ///
742   /// By default, this routine adds type qualifiers only to types that can
743   /// have qualifiers, and silently suppresses those qualifiers that are not
744   /// permitted. Subclasses may override this routine to provide different
745   /// behavior.
746   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
747 
748   /// Build a new pointer type given its pointee type.
749   ///
750   /// By default, performs semantic analysis when building the pointer type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
753 
754   /// Build a new block pointer type given its pointee type.
755   ///
756   /// By default, performs semantic analysis when building the block pointer
757   /// type. Subclasses may override this routine to provide different behavior.
758   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
759 
760   /// Build a new reference type given the type it references.
761   ///
762   /// By default, performs semantic analysis when building the
763   /// reference type. Subclasses may override this routine to provide
764   /// different behavior.
765   ///
766   /// \param LValue whether the type was written with an lvalue sigil
767   /// or an rvalue sigil.
768   QualType RebuildReferenceType(QualType ReferentType,
769                                 bool LValue,
770                                 SourceLocation Sigil);
771 
772   /// Build a new member pointer type given the pointee type and the
773   /// class type it refers into.
774   ///
775   /// By default, performs semantic analysis when building the member pointer
776   /// type. Subclasses may override this routine to provide different behavior.
777   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
778                                     SourceLocation Sigil);
779 
780   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
781                                     SourceLocation ProtocolLAngleLoc,
782                                     ArrayRef<ObjCProtocolDecl *> Protocols,
783                                     ArrayRef<SourceLocation> ProtocolLocs,
784                                     SourceLocation ProtocolRAngleLoc);
785 
786   /// Build an Objective-C object type.
787   ///
788   /// By default, performs semantic analysis when building the object type.
789   /// Subclasses may override this routine to provide different behavior.
790   QualType RebuildObjCObjectType(QualType BaseType,
791                                  SourceLocation Loc,
792                                  SourceLocation TypeArgsLAngleLoc,
793                                  ArrayRef<TypeSourceInfo *> TypeArgs,
794                                  SourceLocation TypeArgsRAngleLoc,
795                                  SourceLocation ProtocolLAngleLoc,
796                                  ArrayRef<ObjCProtocolDecl *> Protocols,
797                                  ArrayRef<SourceLocation> ProtocolLocs,
798                                  SourceLocation ProtocolRAngleLoc);
799 
800   /// Build a new Objective-C object pointer type given the pointee type.
801   ///
802   /// By default, directly builds the pointer type, with no additional semantic
803   /// analysis.
804   QualType RebuildObjCObjectPointerType(QualType PointeeType,
805                                         SourceLocation Star);
806 
807   /// Build a new array type given the element type, size
808   /// modifier, size of the array (if known), size expression, and index type
809   /// qualifiers.
810   ///
811   /// By default, performs semantic analysis when building the array type.
812   /// Subclasses may override this routine to provide different behavior.
813   /// Also by default, all of the other Rebuild*Array
814   QualType RebuildArrayType(QualType ElementType,
815                             ArrayType::ArraySizeModifier SizeMod,
816                             const llvm::APInt *Size,
817                             Expr *SizeExpr,
818                             unsigned IndexTypeQuals,
819                             SourceRange BracketsRange);
820 
821   /// Build a new constant array type given the element type, size
822   /// modifier, (known) size of the array, and index type qualifiers.
823   ///
824   /// By default, performs semantic analysis when building the array type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildConstantArrayType(QualType ElementType,
827                                     ArrayType::ArraySizeModifier SizeMod,
828                                     const llvm::APInt &Size,
829                                     Expr *SizeExpr,
830                                     unsigned IndexTypeQuals,
831                                     SourceRange BracketsRange);
832 
833   /// Build a new incomplete array type given the element type, size
834   /// modifier, and index type qualifiers.
835   ///
836   /// By default, performs semantic analysis when building the array type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildIncompleteArrayType(QualType ElementType,
839                                       ArrayType::ArraySizeModifier SizeMod,
840                                       unsigned IndexTypeQuals,
841                                       SourceRange BracketsRange);
842 
843   /// Build a new variable-length array type given the element type,
844   /// size modifier, size expression, and index type qualifiers.
845   ///
846   /// By default, performs semantic analysis when building the array type.
847   /// Subclasses may override this routine to provide different behavior.
848   QualType RebuildVariableArrayType(QualType ElementType,
849                                     ArrayType::ArraySizeModifier SizeMod,
850                                     Expr *SizeExpr,
851                                     unsigned IndexTypeQuals,
852                                     SourceRange BracketsRange);
853 
854   /// Build a new dependent-sized array type given the element type,
855   /// size modifier, size expression, and index type qualifiers.
856   ///
857   /// By default, performs semantic analysis when building the array type.
858   /// Subclasses may override this routine to provide different behavior.
859   QualType RebuildDependentSizedArrayType(QualType ElementType,
860                                           ArrayType::ArraySizeModifier SizeMod,
861                                           Expr *SizeExpr,
862                                           unsigned IndexTypeQuals,
863                                           SourceRange BracketsRange);
864 
865   /// Build a new vector type given the element type and
866   /// number of elements.
867   ///
868   /// By default, performs semantic analysis when building the vector type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
871                              VectorType::VectorKind VecKind);
872 
873   /// Build a new potentially dependently-sized extended vector type
874   /// given the element type and number of elements.
875   ///
876   /// By default, performs semantic analysis when building the vector type.
877   /// Subclasses may override this routine to provide different behavior.
878   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
879                                            SourceLocation AttributeLoc,
880                                            VectorType::VectorKind);
881 
882   /// Build a new extended vector type given the element type and
883   /// number of elements.
884   ///
885   /// By default, performs semantic analysis when building the vector type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
888                                 SourceLocation AttributeLoc);
889 
890   /// Build a new potentially dependently-sized extended vector type
891   /// given the element type and number of elements.
892   ///
893   /// By default, performs semantic analysis when building the vector type.
894   /// Subclasses may override this routine to provide different behavior.
895   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
896                                               Expr *SizeExpr,
897                                               SourceLocation AttributeLoc);
898 
899   /// Build a new matrix type given the element type and dimensions.
900   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
901                                      unsigned NumColumns);
902 
903   /// Build a new matrix type given the type and dependently-defined
904   /// dimensions.
905   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
906                                            Expr *ColumnExpr,
907                                            SourceLocation AttributeLoc);
908 
909   /// Build a new DependentAddressSpaceType or return the pointee
910   /// type variable with the correct address space (retrieved from
911   /// AddrSpaceExpr) applied to it. The former will be returned in cases
912   /// where the address space remains dependent.
913   ///
914   /// By default, performs semantic analysis when building the type with address
915   /// space applied. Subclasses may override this routine to provide different
916   /// behavior.
917   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
918                                             Expr *AddrSpaceExpr,
919                                             SourceLocation AttributeLoc);
920 
921   /// Build a new function type.
922   ///
923   /// By default, performs semantic analysis when building the function type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildFunctionProtoType(QualType T,
926                                     MutableArrayRef<QualType> ParamTypes,
927                                     const FunctionProtoType::ExtProtoInfo &EPI);
928 
929   /// Build a new unprototyped function type.
930   QualType RebuildFunctionNoProtoType(QualType ResultType);
931 
932   /// Rebuild an unresolved typename type, given the decl that
933   /// the UnresolvedUsingTypenameDecl was transformed to.
934   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
935 
936   /// Build a new type found via an alias.
937   QualType RebuildUsingType(UsingShadowDecl *Found, QualType Underlying) {
938     return SemaRef.Context.getUsingType(Found, Underlying);
939   }
940 
941   /// Build a new typedef type.
942   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
943     return SemaRef.Context.getTypeDeclType(Typedef);
944   }
945 
946   /// Build a new MacroDefined type.
947   QualType RebuildMacroQualifiedType(QualType T,
948                                      const IdentifierInfo *MacroII) {
949     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
950   }
951 
952   /// Build a new class/struct/union type.
953   QualType RebuildRecordType(RecordDecl *Record) {
954     return SemaRef.Context.getTypeDeclType(Record);
955   }
956 
957   /// Build a new Enum type.
958   QualType RebuildEnumType(EnumDecl *Enum) {
959     return SemaRef.Context.getTypeDeclType(Enum);
960   }
961 
962   /// Build a new typeof(expr) type.
963   ///
964   /// By default, performs semantic analysis when building the typeof type.
965   /// Subclasses may override this routine to provide different behavior.
966   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
967 
968   /// Build a new typeof(type) type.
969   ///
970   /// By default, builds a new TypeOfType with the given underlying type.
971   QualType RebuildTypeOfType(QualType Underlying);
972 
973   /// Build a new unary transform type.
974   QualType RebuildUnaryTransformType(QualType BaseType,
975                                      UnaryTransformType::UTTKind UKind,
976                                      SourceLocation Loc);
977 
978   /// Build a new C++11 decltype type.
979   ///
980   /// By default, performs semantic analysis when building the decltype type.
981   /// Subclasses may override this routine to provide different behavior.
982   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
983 
984   /// Build a new C++11 auto type.
985   ///
986   /// By default, builds a new AutoType with the given deduced type.
987   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
988                            ConceptDecl *TypeConstraintConcept,
989                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
990     // Note, IsDependent is always false here: we implicitly convert an 'auto'
991     // which has been deduced to a dependent type into an undeduced 'auto', so
992     // that we'll retry deduction after the transformation.
993     return SemaRef.Context.getAutoType(Deduced, Keyword,
994                                        /*IsDependent*/ false, /*IsPack=*/false,
995                                        TypeConstraintConcept,
996                                        TypeConstraintArgs);
997   }
998 
999   /// By default, builds a new DeducedTemplateSpecializationType with the given
1000   /// deduced type.
1001   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
1002       QualType Deduced) {
1003     return SemaRef.Context.getDeducedTemplateSpecializationType(
1004         Template, Deduced, /*IsDependent*/ false);
1005   }
1006 
1007   /// Build a new template specialization type.
1008   ///
1009   /// By default, performs semantic analysis when building the template
1010   /// specialization type. Subclasses may override this routine to provide
1011   /// different behavior.
1012   QualType RebuildTemplateSpecializationType(TemplateName Template,
1013                                              SourceLocation TemplateLoc,
1014                                              TemplateArgumentListInfo &Args);
1015 
1016   /// Build a new parenthesized type.
1017   ///
1018   /// By default, builds a new ParenType type from the inner type.
1019   /// Subclasses may override this routine to provide different behavior.
1020   QualType RebuildParenType(QualType InnerType) {
1021     return SemaRef.BuildParenType(InnerType);
1022   }
1023 
1024   /// Build a new qualified name type.
1025   ///
1026   /// By default, builds a new ElaboratedType type from the keyword,
1027   /// the nested-name-specifier and the named type.
1028   /// Subclasses may override this routine to provide different behavior.
1029   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1030                                  ElaboratedTypeKeyword Keyword,
1031                                  NestedNameSpecifierLoc QualifierLoc,
1032                                  QualType Named) {
1033     return SemaRef.Context.getElaboratedType(Keyword,
1034                                          QualifierLoc.getNestedNameSpecifier(),
1035                                              Named);
1036   }
1037 
1038   /// Build a new typename type that refers to a template-id.
1039   ///
1040   /// By default, builds a new DependentNameType type from the
1041   /// nested-name-specifier and the given type. Subclasses may override
1042   /// this routine to provide different behavior.
1043   QualType RebuildDependentTemplateSpecializationType(
1044                                           ElaboratedTypeKeyword Keyword,
1045                                           NestedNameSpecifierLoc QualifierLoc,
1046                                           SourceLocation TemplateKWLoc,
1047                                           const IdentifierInfo *Name,
1048                                           SourceLocation NameLoc,
1049                                           TemplateArgumentListInfo &Args,
1050                                           bool AllowInjectedClassName) {
1051     // Rebuild the template name.
1052     // TODO: avoid TemplateName abstraction
1053     CXXScopeSpec SS;
1054     SS.Adopt(QualifierLoc);
1055     TemplateName InstName = getDerived().RebuildTemplateName(
1056         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1057         AllowInjectedClassName);
1058 
1059     if (InstName.isNull())
1060       return QualType();
1061 
1062     // If it's still dependent, make a dependent specialization.
1063     if (InstName.getAsDependentTemplateName())
1064       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1065                                           QualifierLoc.getNestedNameSpecifier(),
1066                                                                     Name,
1067                                                                     Args);
1068 
1069     // Otherwise, make an elaborated type wrapping a non-dependent
1070     // specialization.
1071     QualType T =
1072     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1073     if (T.isNull()) return QualType();
1074 
1075     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1076       return T;
1077 
1078     return SemaRef.Context.getElaboratedType(Keyword,
1079                                        QualifierLoc.getNestedNameSpecifier(),
1080                                              T);
1081   }
1082 
1083   /// Build a new typename type that refers to an identifier.
1084   ///
1085   /// By default, performs semantic analysis when building the typename type
1086   /// (or elaborated type). Subclasses may override this routine to provide
1087   /// different behavior.
1088   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1089                                     SourceLocation KeywordLoc,
1090                                     NestedNameSpecifierLoc QualifierLoc,
1091                                     const IdentifierInfo *Id,
1092                                     SourceLocation IdLoc,
1093                                     bool DeducedTSTContext) {
1094     CXXScopeSpec SS;
1095     SS.Adopt(QualifierLoc);
1096 
1097     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1098       // If the name is still dependent, just build a new dependent name type.
1099       if (!SemaRef.computeDeclContext(SS))
1100         return SemaRef.Context.getDependentNameType(Keyword,
1101                                           QualifierLoc.getNestedNameSpecifier(),
1102                                                     Id);
1103     }
1104 
1105     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1106       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1107                                        *Id, IdLoc, DeducedTSTContext);
1108     }
1109 
1110     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1111 
1112     // We had a dependent elaborated-type-specifier that has been transformed
1113     // into a non-dependent elaborated-type-specifier. Find the tag we're
1114     // referring to.
1115     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1116     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1117     if (!DC)
1118       return QualType();
1119 
1120     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1121       return QualType();
1122 
1123     TagDecl *Tag = nullptr;
1124     SemaRef.LookupQualifiedName(Result, DC);
1125     switch (Result.getResultKind()) {
1126       case LookupResult::NotFound:
1127       case LookupResult::NotFoundInCurrentInstantiation:
1128         break;
1129 
1130       case LookupResult::Found:
1131         Tag = Result.getAsSingle<TagDecl>();
1132         break;
1133 
1134       case LookupResult::FoundOverloaded:
1135       case LookupResult::FoundUnresolvedValue:
1136         llvm_unreachable("Tag lookup cannot find non-tags");
1137 
1138       case LookupResult::Ambiguous:
1139         // Let the LookupResult structure handle ambiguities.
1140         return QualType();
1141     }
1142 
1143     if (!Tag) {
1144       // Check where the name exists but isn't a tag type and use that to emit
1145       // better diagnostics.
1146       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1147       SemaRef.LookupQualifiedName(Result, DC);
1148       switch (Result.getResultKind()) {
1149         case LookupResult::Found:
1150         case LookupResult::FoundOverloaded:
1151         case LookupResult::FoundUnresolvedValue: {
1152           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1153           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1154           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1155                                                                << NTK << Kind;
1156           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1157           break;
1158         }
1159         default:
1160           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1161               << Kind << Id << DC << QualifierLoc.getSourceRange();
1162           break;
1163       }
1164       return QualType();
1165     }
1166 
1167     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1168                                               IdLoc, Id)) {
1169       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1170       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1171       return QualType();
1172     }
1173 
1174     // Build the elaborated-type-specifier type.
1175     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1176     return SemaRef.Context.getElaboratedType(Keyword,
1177                                          QualifierLoc.getNestedNameSpecifier(),
1178                                              T);
1179   }
1180 
1181   /// Build a new pack expansion type.
1182   ///
1183   /// By default, builds a new PackExpansionType type from the given pattern.
1184   /// Subclasses may override this routine to provide different behavior.
1185   QualType RebuildPackExpansionType(QualType Pattern,
1186                                     SourceRange PatternRange,
1187                                     SourceLocation EllipsisLoc,
1188                                     Optional<unsigned> NumExpansions) {
1189     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1190                                         NumExpansions);
1191   }
1192 
1193   /// Build a new atomic type given its value type.
1194   ///
1195   /// By default, performs semantic analysis when building the atomic type.
1196   /// Subclasses may override this routine to provide different behavior.
1197   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1198 
1199   /// Build a new pipe type given its value type.
1200   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1201                            bool isReadPipe);
1202 
1203   /// Build a bit-precise int given its value type.
1204   QualType RebuildBitIntType(bool IsUnsigned, unsigned NumBits,
1205                              SourceLocation Loc);
1206 
1207   /// Build a dependent bit-precise int given its value type.
1208   QualType RebuildDependentBitIntType(bool IsUnsigned, Expr *NumBitsExpr,
1209                                       SourceLocation Loc);
1210 
1211   /// Build a new template name given a nested name specifier, a flag
1212   /// indicating whether the "template" keyword was provided, and the template
1213   /// that the template name refers to.
1214   ///
1215   /// By default, builds the new template name directly. Subclasses may override
1216   /// this routine to provide different behavior.
1217   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1218                                    bool TemplateKW,
1219                                    TemplateDecl *Template);
1220 
1221   /// Build a new template name given a nested name specifier and the
1222   /// name that is referred to as a template.
1223   ///
1224   /// By default, performs semantic analysis to determine whether the name can
1225   /// be resolved to a specific template, then builds the appropriate kind of
1226   /// template name. Subclasses may override this routine to provide different
1227   /// behavior.
1228   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1229                                    SourceLocation TemplateKWLoc,
1230                                    const IdentifierInfo &Name,
1231                                    SourceLocation NameLoc, QualType ObjectType,
1232                                    NamedDecl *FirstQualifierInScope,
1233                                    bool AllowInjectedClassName);
1234 
1235   /// Build a new template name given a nested name specifier and the
1236   /// overloaded operator name that is referred to as a template.
1237   ///
1238   /// By default, performs semantic analysis to determine whether the name can
1239   /// be resolved to a specific template, then builds the appropriate kind of
1240   /// template name. Subclasses may override this routine to provide different
1241   /// behavior.
1242   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1243                                    SourceLocation TemplateKWLoc,
1244                                    OverloadedOperatorKind Operator,
1245                                    SourceLocation NameLoc, QualType ObjectType,
1246                                    bool AllowInjectedClassName);
1247 
1248   /// Build a new template name given a template template parameter pack
1249   /// and the
1250   ///
1251   /// By default, performs semantic analysis to determine whether the name can
1252   /// be resolved to a specific template, then builds the appropriate kind of
1253   /// template name. Subclasses may override this routine to provide different
1254   /// behavior.
1255   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1256                                    const TemplateArgument &ArgPack) {
1257     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1258   }
1259 
1260   /// Build a new compound statement.
1261   ///
1262   /// By default, performs semantic analysis to build the new statement.
1263   /// Subclasses may override this routine to provide different behavior.
1264   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1265                                        MultiStmtArg Statements,
1266                                        SourceLocation RBraceLoc,
1267                                        bool IsStmtExpr) {
1268     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1269                                        IsStmtExpr);
1270   }
1271 
1272   /// Build a new case statement.
1273   ///
1274   /// By default, performs semantic analysis to build the new statement.
1275   /// Subclasses may override this routine to provide different behavior.
1276   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1277                                    Expr *LHS,
1278                                    SourceLocation EllipsisLoc,
1279                                    Expr *RHS,
1280                                    SourceLocation ColonLoc) {
1281     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1282                                    ColonLoc);
1283   }
1284 
1285   /// Attach the body to a new case statement.
1286   ///
1287   /// By default, performs semantic analysis to build the new statement.
1288   /// Subclasses may override this routine to provide different behavior.
1289   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1290     getSema().ActOnCaseStmtBody(S, Body);
1291     return S;
1292   }
1293 
1294   /// Build a new default statement.
1295   ///
1296   /// By default, performs semantic analysis to build the new statement.
1297   /// Subclasses may override this routine to provide different behavior.
1298   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1299                                       SourceLocation ColonLoc,
1300                                       Stmt *SubStmt) {
1301     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1302                                       /*CurScope=*/nullptr);
1303   }
1304 
1305   /// Build a new label statement.
1306   ///
1307   /// By default, performs semantic analysis to build the new statement.
1308   /// Subclasses may override this routine to provide different behavior.
1309   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1310                               SourceLocation ColonLoc, Stmt *SubStmt) {
1311     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1312   }
1313 
1314   /// Build a new attributed statement.
1315   ///
1316   /// By default, performs semantic analysis to build the new statement.
1317   /// Subclasses may override this routine to provide different behavior.
1318   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1319                                    ArrayRef<const Attr *> Attrs,
1320                                    Stmt *SubStmt) {
1321     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1322   }
1323 
1324   /// Build a new "if" statement.
1325   ///
1326   /// By default, performs semantic analysis to build the new statement.
1327   /// Subclasses may override this routine to provide different behavior.
1328   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1329                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1330                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1331                            SourceLocation ElseLoc, Stmt *Else) {
1332     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1333                                  Then, ElseLoc, Else);
1334   }
1335 
1336   /// Start building a new switch statement.
1337   ///
1338   /// By default, performs semantic analysis to build the new statement.
1339   /// Subclasses may override this routine to provide different behavior.
1340   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1341                                     SourceLocation LParenLoc, Stmt *Init,
1342                                     Sema::ConditionResult Cond,
1343                                     SourceLocation RParenLoc) {
1344     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1345                                             RParenLoc);
1346   }
1347 
1348   /// Attach the body to the switch statement.
1349   ///
1350   /// By default, performs semantic analysis to build the new statement.
1351   /// Subclasses may override this routine to provide different behavior.
1352   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1353                                    Stmt *Switch, Stmt *Body) {
1354     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1355   }
1356 
1357   /// Build a new while statement.
1358   ///
1359   /// By default, performs semantic analysis to build the new statement.
1360   /// Subclasses may override this routine to provide different behavior.
1361   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1362                               Sema::ConditionResult Cond,
1363                               SourceLocation RParenLoc, Stmt *Body) {
1364     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1365   }
1366 
1367   /// Build a new do-while statement.
1368   ///
1369   /// By default, performs semantic analysis to build the new statement.
1370   /// Subclasses may override this routine to provide different behavior.
1371   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1372                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1373                            Expr *Cond, SourceLocation RParenLoc) {
1374     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1375                                  Cond, RParenLoc);
1376   }
1377 
1378   /// Build a new for statement.
1379   ///
1380   /// By default, performs semantic analysis to build the new statement.
1381   /// Subclasses may override this routine to provide different behavior.
1382   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1383                             Stmt *Init, Sema::ConditionResult Cond,
1384                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1385                             Stmt *Body) {
1386     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1387                                   Inc, RParenLoc, Body);
1388   }
1389 
1390   /// Build a new goto statement.
1391   ///
1392   /// By default, performs semantic analysis to build the new statement.
1393   /// Subclasses may override this routine to provide different behavior.
1394   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1395                              LabelDecl *Label) {
1396     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1397   }
1398 
1399   /// Build a new indirect goto statement.
1400   ///
1401   /// By default, performs semantic analysis to build the new statement.
1402   /// Subclasses may override this routine to provide different behavior.
1403   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1404                                      SourceLocation StarLoc,
1405                                      Expr *Target) {
1406     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1407   }
1408 
1409   /// Build a new return statement.
1410   ///
1411   /// By default, performs semantic analysis to build the new statement.
1412   /// Subclasses may override this routine to provide different behavior.
1413   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1414     return getSema().BuildReturnStmt(ReturnLoc, Result);
1415   }
1416 
1417   /// Build a new declaration statement.
1418   ///
1419   /// By default, performs semantic analysis to build the new statement.
1420   /// Subclasses may override this routine to provide different behavior.
1421   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1422                              SourceLocation StartLoc, SourceLocation EndLoc) {
1423     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1424     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1425   }
1426 
1427   /// Build a new inline asm statement.
1428   ///
1429   /// By default, performs semantic analysis to build the new statement.
1430   /// Subclasses may override this routine to provide different behavior.
1431   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1432                                bool IsVolatile, unsigned NumOutputs,
1433                                unsigned NumInputs, IdentifierInfo **Names,
1434                                MultiExprArg Constraints, MultiExprArg Exprs,
1435                                Expr *AsmString, MultiExprArg Clobbers,
1436                                unsigned NumLabels,
1437                                SourceLocation RParenLoc) {
1438     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1439                                      NumInputs, Names, Constraints, Exprs,
1440                                      AsmString, Clobbers, NumLabels, RParenLoc);
1441   }
1442 
1443   /// Build a new MS style inline asm statement.
1444   ///
1445   /// By default, performs semantic analysis to build the new statement.
1446   /// Subclasses may override this routine to provide different behavior.
1447   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1448                               ArrayRef<Token> AsmToks,
1449                               StringRef AsmString,
1450                               unsigned NumOutputs, unsigned NumInputs,
1451                               ArrayRef<StringRef> Constraints,
1452                               ArrayRef<StringRef> Clobbers,
1453                               ArrayRef<Expr*> Exprs,
1454                               SourceLocation EndLoc) {
1455     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1456                                     NumOutputs, NumInputs,
1457                                     Constraints, Clobbers, Exprs, EndLoc);
1458   }
1459 
1460   /// Build a new co_return statement.
1461   ///
1462   /// By default, performs semantic analysis to build the new statement.
1463   /// Subclasses may override this routine to provide different behavior.
1464   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1465                                  bool IsImplicit) {
1466     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1467   }
1468 
1469   /// Build a new co_await expression.
1470   ///
1471   /// By default, performs semantic analysis to build the new expression.
1472   /// Subclasses may override this routine to provide different behavior.
1473   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1474                                 bool IsImplicit) {
1475     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1476   }
1477 
1478   /// Build a new co_await expression.
1479   ///
1480   /// By default, performs semantic analysis to build the new expression.
1481   /// Subclasses may override this routine to provide different behavior.
1482   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1483                                          Expr *Result,
1484                                          UnresolvedLookupExpr *Lookup) {
1485     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1486   }
1487 
1488   /// Build a new co_yield expression.
1489   ///
1490   /// By default, performs semantic analysis to build the new expression.
1491   /// Subclasses may override this routine to provide different behavior.
1492   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1493     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1494   }
1495 
1496   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1497     return getSema().BuildCoroutineBodyStmt(Args);
1498   }
1499 
1500   /// Build a new Objective-C \@try statement.
1501   ///
1502   /// By default, performs semantic analysis to build the new statement.
1503   /// Subclasses may override this routine to provide different behavior.
1504   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1505                                         Stmt *TryBody,
1506                                         MultiStmtArg CatchStmts,
1507                                         Stmt *Finally) {
1508     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1509                                         Finally);
1510   }
1511 
1512   /// Rebuild an Objective-C exception declaration.
1513   ///
1514   /// By default, performs semantic analysis to build the new declaration.
1515   /// Subclasses may override this routine to provide different behavior.
1516   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1517                                     TypeSourceInfo *TInfo, QualType T) {
1518     return getSema().BuildObjCExceptionDecl(TInfo, T,
1519                                             ExceptionDecl->getInnerLocStart(),
1520                                             ExceptionDecl->getLocation(),
1521                                             ExceptionDecl->getIdentifier());
1522   }
1523 
1524   /// Build a new Objective-C \@catch statement.
1525   ///
1526   /// By default, performs semantic analysis to build the new statement.
1527   /// Subclasses may override this routine to provide different behavior.
1528   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1529                                           SourceLocation RParenLoc,
1530                                           VarDecl *Var,
1531                                           Stmt *Body) {
1532     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1533                                           Var, Body);
1534   }
1535 
1536   /// Build a new Objective-C \@finally statement.
1537   ///
1538   /// By default, performs semantic analysis to build the new statement.
1539   /// Subclasses may override this routine to provide different behavior.
1540   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1541                                             Stmt *Body) {
1542     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1543   }
1544 
1545   /// Build a new Objective-C \@throw statement.
1546   ///
1547   /// By default, performs semantic analysis to build the new statement.
1548   /// Subclasses may override this routine to provide different behavior.
1549   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1550                                           Expr *Operand) {
1551     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1552   }
1553 
1554   /// Build a new OpenMP Canonical loop.
1555   ///
1556   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1557   /// OMPCanonicalLoop.
1558   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1559     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1560   }
1561 
1562   /// Build a new OpenMP executable directive.
1563   ///
1564   /// By default, performs semantic analysis to build the new statement.
1565   /// Subclasses may override this routine to provide different behavior.
1566   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1567                                            DeclarationNameInfo DirName,
1568                                            OpenMPDirectiveKind CancelRegion,
1569                                            ArrayRef<OMPClause *> Clauses,
1570                                            Stmt *AStmt, SourceLocation StartLoc,
1571                                            SourceLocation EndLoc) {
1572     return getSema().ActOnOpenMPExecutableDirective(
1573         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1574   }
1575 
1576   /// Build a new OpenMP 'if' clause.
1577   ///
1578   /// By default, performs semantic analysis to build the new OpenMP clause.
1579   /// Subclasses may override this routine to provide different behavior.
1580   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1581                                 Expr *Condition, SourceLocation StartLoc,
1582                                 SourceLocation LParenLoc,
1583                                 SourceLocation NameModifierLoc,
1584                                 SourceLocation ColonLoc,
1585                                 SourceLocation EndLoc) {
1586     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1587                                          LParenLoc, NameModifierLoc, ColonLoc,
1588                                          EndLoc);
1589   }
1590 
1591   /// Build a new OpenMP 'final' clause.
1592   ///
1593   /// By default, performs semantic analysis to build the new OpenMP clause.
1594   /// Subclasses may override this routine to provide different behavior.
1595   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1596                                    SourceLocation LParenLoc,
1597                                    SourceLocation EndLoc) {
1598     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1599                                             EndLoc);
1600   }
1601 
1602   /// Build a new OpenMP 'num_threads' clause.
1603   ///
1604   /// By default, performs semantic analysis to build the new OpenMP clause.
1605   /// Subclasses may override this routine to provide different behavior.
1606   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1607                                         SourceLocation StartLoc,
1608                                         SourceLocation LParenLoc,
1609                                         SourceLocation EndLoc) {
1610     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1611                                                  LParenLoc, EndLoc);
1612   }
1613 
1614   /// Build a new OpenMP 'safelen' clause.
1615   ///
1616   /// By default, performs semantic analysis to build the new OpenMP clause.
1617   /// Subclasses may override this routine to provide different behavior.
1618   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1619                                      SourceLocation LParenLoc,
1620                                      SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1622   }
1623 
1624   /// Build a new OpenMP 'simdlen' clause.
1625   ///
1626   /// By default, performs semantic analysis to build the new OpenMP clause.
1627   /// Subclasses may override this routine to provide different behavior.
1628   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1629                                      SourceLocation LParenLoc,
1630                                      SourceLocation EndLoc) {
1631     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1632   }
1633 
1634   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1635                                    SourceLocation StartLoc,
1636                                    SourceLocation LParenLoc,
1637                                    SourceLocation EndLoc) {
1638     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1639   }
1640 
1641   /// Build a new OpenMP 'full' clause.
1642   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1643                                   SourceLocation EndLoc) {
1644     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1645   }
1646 
1647   /// Build a new OpenMP 'partial' clause.
1648   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1649                                      SourceLocation LParenLoc,
1650                                      SourceLocation EndLoc) {
1651     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1652                                               EndLoc);
1653   }
1654 
1655   /// Build a new OpenMP 'allocator' clause.
1656   ///
1657   /// By default, performs semantic analysis to build the new OpenMP clause.
1658   /// Subclasses may override this routine to provide different behavior.
1659   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1660                                        SourceLocation LParenLoc,
1661                                        SourceLocation EndLoc) {
1662     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1663   }
1664 
1665   /// Build a new OpenMP 'collapse' clause.
1666   ///
1667   /// By default, performs semantic analysis to build the new OpenMP clause.
1668   /// Subclasses may override this routine to provide different behavior.
1669   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1670                                       SourceLocation LParenLoc,
1671                                       SourceLocation EndLoc) {
1672     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1673                                                EndLoc);
1674   }
1675 
1676   /// Build a new OpenMP 'default' clause.
1677   ///
1678   /// By default, performs semantic analysis to build the new OpenMP clause.
1679   /// Subclasses may override this routine to provide different behavior.
1680   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1681                                      SourceLocation StartLoc,
1682                                      SourceLocation LParenLoc,
1683                                      SourceLocation EndLoc) {
1684     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1685                                               StartLoc, LParenLoc, EndLoc);
1686   }
1687 
1688   /// Build a new OpenMP 'proc_bind' clause.
1689   ///
1690   /// By default, performs semantic analysis to build the new OpenMP clause.
1691   /// Subclasses may override this routine to provide different behavior.
1692   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1693                                       SourceLocation KindKwLoc,
1694                                       SourceLocation StartLoc,
1695                                       SourceLocation LParenLoc,
1696                                       SourceLocation EndLoc) {
1697     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1698                                                StartLoc, LParenLoc, EndLoc);
1699   }
1700 
1701   /// Build a new OpenMP 'schedule' clause.
1702   ///
1703   /// By default, performs semantic analysis to build the new OpenMP clause.
1704   /// Subclasses may override this routine to provide different behavior.
1705   OMPClause *RebuildOMPScheduleClause(
1706       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1707       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1708       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1709       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1710     return getSema().ActOnOpenMPScheduleClause(
1711         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1712         CommaLoc, EndLoc);
1713   }
1714 
1715   /// Build a new OpenMP 'ordered' clause.
1716   ///
1717   /// By default, performs semantic analysis to build the new OpenMP clause.
1718   /// Subclasses may override this routine to provide different behavior.
1719   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1720                                      SourceLocation EndLoc,
1721                                      SourceLocation LParenLoc, Expr *Num) {
1722     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1723   }
1724 
1725   /// Build a new OpenMP 'private' clause.
1726   ///
1727   /// By default, performs semantic analysis to build the new OpenMP clause.
1728   /// Subclasses may override this routine to provide different behavior.
1729   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1730                                      SourceLocation StartLoc,
1731                                      SourceLocation LParenLoc,
1732                                      SourceLocation EndLoc) {
1733     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1734                                               EndLoc);
1735   }
1736 
1737   /// Build a new OpenMP 'firstprivate' clause.
1738   ///
1739   /// By default, performs semantic analysis to build the new OpenMP clause.
1740   /// Subclasses may override this routine to provide different behavior.
1741   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1742                                           SourceLocation StartLoc,
1743                                           SourceLocation LParenLoc,
1744                                           SourceLocation EndLoc) {
1745     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1746                                                    EndLoc);
1747   }
1748 
1749   /// Build a new OpenMP 'lastprivate' clause.
1750   ///
1751   /// By default, performs semantic analysis to build the new OpenMP clause.
1752   /// Subclasses may override this routine to provide different behavior.
1753   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1754                                          OpenMPLastprivateModifier LPKind,
1755                                          SourceLocation LPKindLoc,
1756                                          SourceLocation ColonLoc,
1757                                          SourceLocation StartLoc,
1758                                          SourceLocation LParenLoc,
1759                                          SourceLocation EndLoc) {
1760     return getSema().ActOnOpenMPLastprivateClause(
1761         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1762   }
1763 
1764   /// Build a new OpenMP 'shared' clause.
1765   ///
1766   /// By default, performs semantic analysis to build the new OpenMP clause.
1767   /// Subclasses may override this routine to provide different behavior.
1768   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1769                                     SourceLocation StartLoc,
1770                                     SourceLocation LParenLoc,
1771                                     SourceLocation EndLoc) {
1772     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1773                                              EndLoc);
1774   }
1775 
1776   /// Build a new OpenMP 'reduction' clause.
1777   ///
1778   /// By default, performs semantic analysis to build the new statement.
1779   /// Subclasses may override this routine to provide different behavior.
1780   OMPClause *RebuildOMPReductionClause(
1781       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1782       SourceLocation StartLoc, SourceLocation LParenLoc,
1783       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1784       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1785       const DeclarationNameInfo &ReductionId,
1786       ArrayRef<Expr *> UnresolvedReductions) {
1787     return getSema().ActOnOpenMPReductionClause(
1788         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1789         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1790   }
1791 
1792   /// Build a new OpenMP 'task_reduction' clause.
1793   ///
1794   /// By default, performs semantic analysis to build the new statement.
1795   /// Subclasses may override this routine to provide different behavior.
1796   OMPClause *RebuildOMPTaskReductionClause(
1797       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1798       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1799       CXXScopeSpec &ReductionIdScopeSpec,
1800       const DeclarationNameInfo &ReductionId,
1801       ArrayRef<Expr *> UnresolvedReductions) {
1802     return getSema().ActOnOpenMPTaskReductionClause(
1803         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1804         ReductionId, UnresolvedReductions);
1805   }
1806 
1807   /// Build a new OpenMP 'in_reduction' clause.
1808   ///
1809   /// By default, performs semantic analysis to build the new statement.
1810   /// Subclasses may override this routine to provide different behavior.
1811   OMPClause *
1812   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1813                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1814                               SourceLocation EndLoc,
1815                               CXXScopeSpec &ReductionIdScopeSpec,
1816                               const DeclarationNameInfo &ReductionId,
1817                               ArrayRef<Expr *> UnresolvedReductions) {
1818     return getSema().ActOnOpenMPInReductionClause(
1819         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1820         ReductionId, UnresolvedReductions);
1821   }
1822 
1823   /// Build a new OpenMP 'linear' clause.
1824   ///
1825   /// By default, performs semantic analysis to build the new OpenMP clause.
1826   /// Subclasses may override this routine to provide different behavior.
1827   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1828                                     SourceLocation StartLoc,
1829                                     SourceLocation LParenLoc,
1830                                     OpenMPLinearClauseKind Modifier,
1831                                     SourceLocation ModifierLoc,
1832                                     SourceLocation ColonLoc,
1833                                     SourceLocation EndLoc) {
1834     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1835                                              Modifier, ModifierLoc, ColonLoc,
1836                                              EndLoc);
1837   }
1838 
1839   /// Build a new OpenMP 'aligned' clause.
1840   ///
1841   /// By default, performs semantic analysis to build the new OpenMP clause.
1842   /// Subclasses may override this routine to provide different behavior.
1843   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1844                                      SourceLocation StartLoc,
1845                                      SourceLocation LParenLoc,
1846                                      SourceLocation ColonLoc,
1847                                      SourceLocation EndLoc) {
1848     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1849                                               LParenLoc, ColonLoc, EndLoc);
1850   }
1851 
1852   /// Build a new OpenMP 'copyin' clause.
1853   ///
1854   /// By default, performs semantic analysis to build the new OpenMP clause.
1855   /// Subclasses may override this routine to provide different behavior.
1856   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1857                                     SourceLocation StartLoc,
1858                                     SourceLocation LParenLoc,
1859                                     SourceLocation EndLoc) {
1860     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1861                                              EndLoc);
1862   }
1863 
1864   /// Build a new OpenMP 'copyprivate' clause.
1865   ///
1866   /// By default, performs semantic analysis to build the new OpenMP clause.
1867   /// Subclasses may override this routine to provide different behavior.
1868   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1869                                          SourceLocation StartLoc,
1870                                          SourceLocation LParenLoc,
1871                                          SourceLocation EndLoc) {
1872     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1873                                                   EndLoc);
1874   }
1875 
1876   /// Build a new OpenMP 'flush' pseudo clause.
1877   ///
1878   /// By default, performs semantic analysis to build the new OpenMP clause.
1879   /// Subclasses may override this routine to provide different behavior.
1880   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1881                                    SourceLocation StartLoc,
1882                                    SourceLocation LParenLoc,
1883                                    SourceLocation EndLoc) {
1884     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1885                                             EndLoc);
1886   }
1887 
1888   /// Build a new OpenMP 'depobj' pseudo clause.
1889   ///
1890   /// By default, performs semantic analysis to build the new OpenMP clause.
1891   /// Subclasses may override this routine to provide different behavior.
1892   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1893                                     SourceLocation LParenLoc,
1894                                     SourceLocation EndLoc) {
1895     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1896                                              EndLoc);
1897   }
1898 
1899   /// Build a new OpenMP 'depend' pseudo clause.
1900   ///
1901   /// By default, performs semantic analysis to build the new OpenMP clause.
1902   /// Subclasses may override this routine to provide different behavior.
1903   OMPClause *
1904   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1905                          SourceLocation DepLoc, SourceLocation ColonLoc,
1906                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1907                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1908     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1909                                              ColonLoc, VarList, StartLoc,
1910                                              LParenLoc, EndLoc);
1911   }
1912 
1913   /// Build a new OpenMP 'device' clause.
1914   ///
1915   /// By default, performs semantic analysis to build the new statement.
1916   /// Subclasses may override this routine to provide different behavior.
1917   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1918                                     Expr *Device, SourceLocation StartLoc,
1919                                     SourceLocation LParenLoc,
1920                                     SourceLocation ModifierLoc,
1921                                     SourceLocation EndLoc) {
1922     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1923                                              LParenLoc, ModifierLoc, EndLoc);
1924   }
1925 
1926   /// Build a new OpenMP 'map' clause.
1927   ///
1928   /// By default, performs semantic analysis to build the new OpenMP clause.
1929   /// Subclasses may override this routine to provide different behavior.
1930   OMPClause *RebuildOMPMapClause(
1931       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1932       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1933       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1934       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1935       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1936       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1937     return getSema().ActOnOpenMPMapClause(
1938         MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId,
1939         MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs,
1940         /*NoDiagnose=*/false, UnresolvedMappers);
1941   }
1942 
1943   /// Build a new OpenMP 'allocate' clause.
1944   ///
1945   /// By default, performs semantic analysis to build the new OpenMP clause.
1946   /// Subclasses may override this routine to provide different behavior.
1947   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1948                                       SourceLocation StartLoc,
1949                                       SourceLocation LParenLoc,
1950                                       SourceLocation ColonLoc,
1951                                       SourceLocation EndLoc) {
1952     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1953                                                LParenLoc, ColonLoc, EndLoc);
1954   }
1955 
1956   /// Build a new OpenMP 'num_teams' clause.
1957   ///
1958   /// By default, performs semantic analysis to build the new statement.
1959   /// Subclasses may override this routine to provide different behavior.
1960   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1961                                       SourceLocation LParenLoc,
1962                                       SourceLocation EndLoc) {
1963     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1964                                                EndLoc);
1965   }
1966 
1967   /// Build a new OpenMP 'thread_limit' clause.
1968   ///
1969   /// By default, performs semantic analysis to build the new statement.
1970   /// Subclasses may override this routine to provide different behavior.
1971   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1972                                          SourceLocation StartLoc,
1973                                          SourceLocation LParenLoc,
1974                                          SourceLocation EndLoc) {
1975     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1976                                                   LParenLoc, EndLoc);
1977   }
1978 
1979   /// Build a new OpenMP 'priority' clause.
1980   ///
1981   /// By default, performs semantic analysis to build the new statement.
1982   /// Subclasses may override this routine to provide different behavior.
1983   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1984                                       SourceLocation LParenLoc,
1985                                       SourceLocation EndLoc) {
1986     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1987                                                EndLoc);
1988   }
1989 
1990   /// Build a new OpenMP 'grainsize' clause.
1991   ///
1992   /// By default, performs semantic analysis to build the new statement.
1993   /// Subclasses may override this routine to provide different behavior.
1994   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1995                                        SourceLocation LParenLoc,
1996                                        SourceLocation EndLoc) {
1997     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1998                                                 EndLoc);
1999   }
2000 
2001   /// Build a new OpenMP 'num_tasks' clause.
2002   ///
2003   /// By default, performs semantic analysis to build the new statement.
2004   /// Subclasses may override this routine to provide different behavior.
2005   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
2006                                       SourceLocation LParenLoc,
2007                                       SourceLocation EndLoc) {
2008     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
2009                                                EndLoc);
2010   }
2011 
2012   /// Build a new OpenMP 'hint' clause.
2013   ///
2014   /// By default, performs semantic analysis to build the new statement.
2015   /// Subclasses may override this routine to provide different behavior.
2016   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2017                                   SourceLocation LParenLoc,
2018                                   SourceLocation EndLoc) {
2019     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2020   }
2021 
2022   /// Build a new OpenMP 'detach' clause.
2023   ///
2024   /// By default, performs semantic analysis to build the new statement.
2025   /// Subclasses may override this routine to provide different behavior.
2026   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2027                                     SourceLocation LParenLoc,
2028                                     SourceLocation EndLoc) {
2029     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2030   }
2031 
2032   /// Build a new OpenMP 'dist_schedule' clause.
2033   ///
2034   /// By default, performs semantic analysis to build the new OpenMP clause.
2035   /// Subclasses may override this routine to provide different behavior.
2036   OMPClause *
2037   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2038                                Expr *ChunkSize, SourceLocation StartLoc,
2039                                SourceLocation LParenLoc, SourceLocation KindLoc,
2040                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2041     return getSema().ActOnOpenMPDistScheduleClause(
2042         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2043   }
2044 
2045   /// Build a new OpenMP 'to' clause.
2046   ///
2047   /// By default, performs semantic analysis to build the new statement.
2048   /// Subclasses may override this routine to provide different behavior.
2049   OMPClause *
2050   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2051                      ArrayRef<SourceLocation> MotionModifiersLoc,
2052                      CXXScopeSpec &MapperIdScopeSpec,
2053                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2054                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2055                      ArrayRef<Expr *> UnresolvedMappers) {
2056     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2057                                          MapperIdScopeSpec, MapperId, ColonLoc,
2058                                          VarList, Locs, UnresolvedMappers);
2059   }
2060 
2061   /// Build a new OpenMP 'from' clause.
2062   ///
2063   /// By default, performs semantic analysis to build the new statement.
2064   /// Subclasses may override this routine to provide different behavior.
2065   OMPClause *
2066   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2067                        ArrayRef<SourceLocation> MotionModifiersLoc,
2068                        CXXScopeSpec &MapperIdScopeSpec,
2069                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2070                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2071                        ArrayRef<Expr *> UnresolvedMappers) {
2072     return getSema().ActOnOpenMPFromClause(
2073         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2074         ColonLoc, VarList, Locs, UnresolvedMappers);
2075   }
2076 
2077   /// Build a new OpenMP 'use_device_ptr' clause.
2078   ///
2079   /// By default, performs semantic analysis to build the new OpenMP clause.
2080   /// Subclasses may override this routine to provide different behavior.
2081   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2082                                           const OMPVarListLocTy &Locs) {
2083     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2084   }
2085 
2086   /// Build a new OpenMP 'use_device_addr' clause.
2087   ///
2088   /// By default, performs semantic analysis to build the new OpenMP clause.
2089   /// Subclasses may override this routine to provide different behavior.
2090   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2091                                            const OMPVarListLocTy &Locs) {
2092     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2093   }
2094 
2095   /// Build a new OpenMP 'is_device_ptr' clause.
2096   ///
2097   /// By default, performs semantic analysis to build the new OpenMP clause.
2098   /// Subclasses may override this routine to provide different behavior.
2099   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2100                                          const OMPVarListLocTy &Locs) {
2101     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2102   }
2103 
2104   /// Build a new OpenMP 'defaultmap' clause.
2105   ///
2106   /// By default, performs semantic analysis to build the new OpenMP clause.
2107   /// Subclasses may override this routine to provide different behavior.
2108   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2109                                         OpenMPDefaultmapClauseKind Kind,
2110                                         SourceLocation StartLoc,
2111                                         SourceLocation LParenLoc,
2112                                         SourceLocation MLoc,
2113                                         SourceLocation KindLoc,
2114                                         SourceLocation EndLoc) {
2115     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2116                                                  MLoc, KindLoc, EndLoc);
2117   }
2118 
2119   /// Build a new OpenMP 'nontemporal' clause.
2120   ///
2121   /// By default, performs semantic analysis to build the new OpenMP clause.
2122   /// Subclasses may override this routine to provide different behavior.
2123   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2124                                          SourceLocation StartLoc,
2125                                          SourceLocation LParenLoc,
2126                                          SourceLocation EndLoc) {
2127     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2128                                                   EndLoc);
2129   }
2130 
2131   /// Build a new OpenMP 'inclusive' clause.
2132   ///
2133   /// By default, performs semantic analysis to build the new OpenMP clause.
2134   /// Subclasses may override this routine to provide different behavior.
2135   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2136                                        SourceLocation StartLoc,
2137                                        SourceLocation LParenLoc,
2138                                        SourceLocation EndLoc) {
2139     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2140                                                 EndLoc);
2141   }
2142 
2143   /// Build a new OpenMP 'exclusive' clause.
2144   ///
2145   /// By default, performs semantic analysis to build the new OpenMP clause.
2146   /// Subclasses may override this routine to provide different behavior.
2147   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2148                                        SourceLocation StartLoc,
2149                                        SourceLocation LParenLoc,
2150                                        SourceLocation EndLoc) {
2151     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2152                                                 EndLoc);
2153   }
2154 
2155   /// Build a new OpenMP 'uses_allocators' clause.
2156   ///
2157   /// By default, performs semantic analysis to build the new OpenMP clause.
2158   /// Subclasses may override this routine to provide different behavior.
2159   OMPClause *RebuildOMPUsesAllocatorsClause(
2160       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2161       SourceLocation LParenLoc, SourceLocation EndLoc) {
2162     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2163                                                     Data);
2164   }
2165 
2166   /// Build a new OpenMP 'affinity' clause.
2167   ///
2168   /// By default, performs semantic analysis to build the new OpenMP clause.
2169   /// Subclasses may override this routine to provide different behavior.
2170   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2171                                       SourceLocation LParenLoc,
2172                                       SourceLocation ColonLoc,
2173                                       SourceLocation EndLoc, Expr *Modifier,
2174                                       ArrayRef<Expr *> Locators) {
2175     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2176                                                EndLoc, Modifier, Locators);
2177   }
2178 
2179   /// Build a new OpenMP 'order' clause.
2180   ///
2181   /// By default, performs semantic analysis to build the new OpenMP clause.
2182   /// Subclasses may override this routine to provide different behavior.
2183   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2184                                    SourceLocation KindKwLoc,
2185                                    SourceLocation StartLoc,
2186                                    SourceLocation LParenLoc,
2187                                    SourceLocation EndLoc) {
2188     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2189                                             LParenLoc, EndLoc);
2190   }
2191 
2192   /// Build a new OpenMP 'init' clause.
2193   ///
2194   /// By default, performs semantic analysis to build the new OpenMP clause.
2195   /// Subclasses may override this routine to provide different behavior.
2196   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2197                                   bool IsTarget, bool IsTargetSync,
2198                                   SourceLocation StartLoc,
2199                                   SourceLocation LParenLoc,
2200                                   SourceLocation VarLoc,
2201                                   SourceLocation EndLoc) {
2202     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2203                                            IsTargetSync, StartLoc, LParenLoc,
2204                                            VarLoc, EndLoc);
2205   }
2206 
2207   /// Build a new OpenMP 'use' clause.
2208   ///
2209   /// By default, performs semantic analysis to build the new OpenMP clause.
2210   /// Subclasses may override this routine to provide different behavior.
2211   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2212                                  SourceLocation LParenLoc,
2213                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2214     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2215                                           VarLoc, EndLoc);
2216   }
2217 
2218   /// Build a new OpenMP 'destroy' clause.
2219   ///
2220   /// By default, performs semantic analysis to build the new OpenMP clause.
2221   /// Subclasses may override this routine to provide different behavior.
2222   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2223                                      SourceLocation LParenLoc,
2224                                      SourceLocation VarLoc,
2225                                      SourceLocation EndLoc) {
2226     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2227                                               VarLoc, EndLoc);
2228   }
2229 
2230   /// Build a new OpenMP 'novariants' clause.
2231   ///
2232   /// By default, performs semantic analysis to build the new OpenMP clause.
2233   /// Subclasses may override this routine to provide different behavior.
2234   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2235                                         SourceLocation StartLoc,
2236                                         SourceLocation LParenLoc,
2237                                         SourceLocation EndLoc) {
2238     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2239                                                  EndLoc);
2240   }
2241 
2242   /// Build a new OpenMP 'nocontext' clause.
2243   ///
2244   /// By default, performs semantic analysis to build the new OpenMP clause.
2245   /// Subclasses may override this routine to provide different behavior.
2246   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2247                                        SourceLocation LParenLoc,
2248                                        SourceLocation EndLoc) {
2249     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2250                                                 EndLoc);
2251   }
2252 
2253   /// Build a new OpenMP 'filter' clause.
2254   ///
2255   /// By default, performs semantic analysis to build the new OpenMP clause.
2256   /// Subclasses may override this routine to provide different behavior.
2257   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2258                                     SourceLocation LParenLoc,
2259                                     SourceLocation EndLoc) {
2260     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2261                                              EndLoc);
2262   }
2263 
2264   /// Build a new OpenMP 'bind' clause.
2265   ///
2266   /// By default, performs semantic analysis to build the new OpenMP clause.
2267   /// Subclasses may override this routine to provide different behavior.
2268   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2269                                   SourceLocation KindLoc,
2270                                   SourceLocation StartLoc,
2271                                   SourceLocation LParenLoc,
2272                                   SourceLocation EndLoc) {
2273     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2274                                            EndLoc);
2275   }
2276 
2277   /// Build a new OpenMP 'align' clause.
2278   ///
2279   /// By default, performs semantic analysis to build the new OpenMP clause.
2280   /// Subclasses may override this routine to provide different behavior.
2281   OMPClause *RebuildOMPAlignClause(Expr *A, SourceLocation StartLoc,
2282                                    SourceLocation LParenLoc,
2283                                    SourceLocation EndLoc) {
2284     return getSema().ActOnOpenMPAlignClause(A, StartLoc, LParenLoc, EndLoc);
2285   }
2286 
2287   /// Rebuild the operand to an Objective-C \@synchronized statement.
2288   ///
2289   /// By default, performs semantic analysis to build the new statement.
2290   /// Subclasses may override this routine to provide different behavior.
2291   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2292                                               Expr *object) {
2293     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2294   }
2295 
2296   /// Build a new Objective-C \@synchronized statement.
2297   ///
2298   /// By default, performs semantic analysis to build the new statement.
2299   /// Subclasses may override this routine to provide different behavior.
2300   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2301                                            Expr *Object, Stmt *Body) {
2302     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2303   }
2304 
2305   /// Build a new Objective-C \@autoreleasepool statement.
2306   ///
2307   /// By default, performs semantic analysis to build the new statement.
2308   /// Subclasses may override this routine to provide different behavior.
2309   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2310                                             Stmt *Body) {
2311     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2312   }
2313 
2314   /// Build a new Objective-C fast enumeration statement.
2315   ///
2316   /// By default, performs semantic analysis to build the new statement.
2317   /// Subclasses may override this routine to provide different behavior.
2318   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2319                                           Stmt *Element,
2320                                           Expr *Collection,
2321                                           SourceLocation RParenLoc,
2322                                           Stmt *Body) {
2323     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2324                                                 Element,
2325                                                 Collection,
2326                                                 RParenLoc);
2327     if (ForEachStmt.isInvalid())
2328       return StmtError();
2329 
2330     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2331   }
2332 
2333   /// Build a new C++ exception declaration.
2334   ///
2335   /// By default, performs semantic analysis to build the new decaration.
2336   /// Subclasses may override this routine to provide different behavior.
2337   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2338                                 TypeSourceInfo *Declarator,
2339                                 SourceLocation StartLoc,
2340                                 SourceLocation IdLoc,
2341                                 IdentifierInfo *Id) {
2342     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2343                                                        StartLoc, IdLoc, Id);
2344     if (Var)
2345       getSema().CurContext->addDecl(Var);
2346     return Var;
2347   }
2348 
2349   /// Build a new C++ catch statement.
2350   ///
2351   /// By default, performs semantic analysis to build the new statement.
2352   /// Subclasses may override this routine to provide different behavior.
2353   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2354                                  VarDecl *ExceptionDecl,
2355                                  Stmt *Handler) {
2356     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2357                                                       Handler));
2358   }
2359 
2360   /// Build a new C++ try statement.
2361   ///
2362   /// By default, performs semantic analysis to build the new statement.
2363   /// Subclasses may override this routine to provide different behavior.
2364   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2365                                ArrayRef<Stmt *> Handlers) {
2366     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2367   }
2368 
2369   /// Build a new C++0x range-based for statement.
2370   ///
2371   /// By default, performs semantic analysis to build the new statement.
2372   /// Subclasses may override this routine to provide different behavior.
2373   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2374                                     SourceLocation CoawaitLoc, Stmt *Init,
2375                                     SourceLocation ColonLoc, Stmt *Range,
2376                                     Stmt *Begin, Stmt *End, Expr *Cond,
2377                                     Expr *Inc, Stmt *LoopVar,
2378                                     SourceLocation RParenLoc) {
2379     // If we've just learned that the range is actually an Objective-C
2380     // collection, treat this as an Objective-C fast enumeration loop.
2381     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2382       if (RangeStmt->isSingleDecl()) {
2383         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2384           if (RangeVar->isInvalidDecl())
2385             return StmtError();
2386 
2387           Expr *RangeExpr = RangeVar->getInit();
2388           if (!RangeExpr->isTypeDependent() &&
2389               RangeExpr->getType()->isObjCObjectPointerType()) {
2390             // FIXME: Support init-statements in Objective-C++20 ranged for
2391             // statement.
2392             if (Init) {
2393               return SemaRef.Diag(Init->getBeginLoc(),
2394                                   diag::err_objc_for_range_init_stmt)
2395                          << Init->getSourceRange();
2396             }
2397             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2398                                                         RangeExpr, RParenLoc);
2399           }
2400         }
2401       }
2402     }
2403 
2404     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2405                                           Range, Begin, End, Cond, Inc, LoopVar,
2406                                           RParenLoc, Sema::BFRK_Rebuild);
2407   }
2408 
2409   /// Build a new C++0x range-based for statement.
2410   ///
2411   /// By default, performs semantic analysis to build the new statement.
2412   /// Subclasses may override this routine to provide different behavior.
2413   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2414                                           bool IsIfExists,
2415                                           NestedNameSpecifierLoc QualifierLoc,
2416                                           DeclarationNameInfo NameInfo,
2417                                           Stmt *Nested) {
2418     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2419                                                 QualifierLoc, NameInfo, Nested);
2420   }
2421 
2422   /// Attach body to a C++0x range-based for statement.
2423   ///
2424   /// By default, performs semantic analysis to finish the new statement.
2425   /// Subclasses may override this routine to provide different behavior.
2426   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2427     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2428   }
2429 
2430   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2431                                Stmt *TryBlock, Stmt *Handler) {
2432     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2433   }
2434 
2435   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2436                                   Stmt *Block) {
2437     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2438   }
2439 
2440   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2441     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2442   }
2443 
2444   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2445                                              SourceLocation LParen,
2446                                              SourceLocation RParen,
2447                                              TypeSourceInfo *TSI) {
2448     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2449   }
2450 
2451   /// Build a new predefined expression.
2452   ///
2453   /// By default, performs semantic analysis to build the new expression.
2454   /// Subclasses may override this routine to provide different behavior.
2455   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2456                                    PredefinedExpr::IdentKind IK) {
2457     return getSema().BuildPredefinedExpr(Loc, IK);
2458   }
2459 
2460   /// Build a new expression that references a declaration.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2465                                         LookupResult &R,
2466                                         bool RequiresADL) {
2467     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2468   }
2469 
2470 
2471   /// Build a new expression that references a declaration.
2472   ///
2473   /// By default, performs semantic analysis to build the new expression.
2474   /// Subclasses may override this routine to provide different behavior.
2475   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2476                                 ValueDecl *VD,
2477                                 const DeclarationNameInfo &NameInfo,
2478                                 NamedDecl *Found,
2479                                 TemplateArgumentListInfo *TemplateArgs) {
2480     CXXScopeSpec SS;
2481     SS.Adopt(QualifierLoc);
2482     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2483                                               TemplateArgs);
2484   }
2485 
2486   /// Build a new expression in parentheses.
2487   ///
2488   /// By default, performs semantic analysis to build the new expression.
2489   /// Subclasses may override this routine to provide different behavior.
2490   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2491                                     SourceLocation RParen) {
2492     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2493   }
2494 
2495   /// Build a new pseudo-destructor expression.
2496   ///
2497   /// By default, performs semantic analysis to build the new expression.
2498   /// Subclasses may override this routine to provide different behavior.
2499   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2500                                             SourceLocation OperatorLoc,
2501                                             bool isArrow,
2502                                             CXXScopeSpec &SS,
2503                                             TypeSourceInfo *ScopeType,
2504                                             SourceLocation CCLoc,
2505                                             SourceLocation TildeLoc,
2506                                         PseudoDestructorTypeStorage Destroyed);
2507 
2508   /// Build a new unary operator expression.
2509   ///
2510   /// By default, performs semantic analysis to build the new expression.
2511   /// Subclasses may override this routine to provide different behavior.
2512   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2513                                         UnaryOperatorKind Opc,
2514                                         Expr *SubExpr) {
2515     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2516   }
2517 
2518   /// Build a new builtin offsetof expression.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// Subclasses may override this routine to provide different behavior.
2522   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2523                                  TypeSourceInfo *Type,
2524                                  ArrayRef<Sema::OffsetOfComponent> Components,
2525                                  SourceLocation RParenLoc) {
2526     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2527                                           RParenLoc);
2528   }
2529 
2530   /// Build a new sizeof, alignof or vec_step expression with a
2531   /// type argument.
2532   ///
2533   /// By default, performs semantic analysis to build the new expression.
2534   /// Subclasses may override this routine to provide different behavior.
2535   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2536                                          SourceLocation OpLoc,
2537                                          UnaryExprOrTypeTrait ExprKind,
2538                                          SourceRange R) {
2539     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2540   }
2541 
2542   /// Build a new sizeof, alignof or vec step expression with an
2543   /// expression argument.
2544   ///
2545   /// By default, performs semantic analysis to build the new expression.
2546   /// Subclasses may override this routine to provide different behavior.
2547   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2548                                          UnaryExprOrTypeTrait ExprKind,
2549                                          SourceRange R) {
2550     ExprResult Result
2551       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2552     if (Result.isInvalid())
2553       return ExprError();
2554 
2555     return Result;
2556   }
2557 
2558   /// Build a new array subscript expression.
2559   ///
2560   /// By default, performs semantic analysis to build the new expression.
2561   /// Subclasses may override this routine to provide different behavior.
2562   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2563                                              SourceLocation LBracketLoc,
2564                                              Expr *RHS,
2565                                              SourceLocation RBracketLoc) {
2566     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2567                                              LBracketLoc, RHS,
2568                                              RBracketLoc);
2569   }
2570 
2571   /// Build a new matrix subscript expression.
2572   ///
2573   /// By default, performs semantic analysis to build the new expression.
2574   /// Subclasses may override this routine to provide different behavior.
2575   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2576                                         Expr *ColumnIdx,
2577                                         SourceLocation RBracketLoc) {
2578     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2579                                                       RBracketLoc);
2580   }
2581 
2582   /// Build a new array section expression.
2583   ///
2584   /// By default, performs semantic analysis to build the new expression.
2585   /// Subclasses may override this routine to provide different behavior.
2586   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2587                                         Expr *LowerBound,
2588                                         SourceLocation ColonLocFirst,
2589                                         SourceLocation ColonLocSecond,
2590                                         Expr *Length, Expr *Stride,
2591                                         SourceLocation RBracketLoc) {
2592     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2593                                               ColonLocFirst, ColonLocSecond,
2594                                               Length, Stride, RBracketLoc);
2595   }
2596 
2597   /// Build a new array shaping expression.
2598   ///
2599   /// By default, performs semantic analysis to build the new expression.
2600   /// Subclasses may override this routine to provide different behavior.
2601   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2602                                         SourceLocation RParenLoc,
2603                                         ArrayRef<Expr *> Dims,
2604                                         ArrayRef<SourceRange> BracketsRanges) {
2605     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2606                                               BracketsRanges);
2607   }
2608 
2609   /// Build a new iterator expression.
2610   ///
2611   /// By default, performs semantic analysis to build the new expression.
2612   /// Subclasses may override this routine to provide different behavior.
2613   ExprResult RebuildOMPIteratorExpr(
2614       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2615       ArrayRef<Sema::OMPIteratorData> Data) {
2616     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2617                                           LLoc, RLoc, Data);
2618   }
2619 
2620   /// Build a new call expression.
2621   ///
2622   /// By default, performs semantic analysis to build the new expression.
2623   /// Subclasses may override this routine to provide different behavior.
2624   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2625                                    MultiExprArg Args,
2626                                    SourceLocation RParenLoc,
2627                                    Expr *ExecConfig = nullptr) {
2628     return getSema().ActOnCallExpr(
2629         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2630   }
2631 
2632   /// Build a new member access expression.
2633   ///
2634   /// By default, performs semantic analysis to build the new expression.
2635   /// Subclasses may override this routine to provide different behavior.
2636   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2637                                bool isArrow,
2638                                NestedNameSpecifierLoc QualifierLoc,
2639                                SourceLocation TemplateKWLoc,
2640                                const DeclarationNameInfo &MemberNameInfo,
2641                                ValueDecl *Member,
2642                                NamedDecl *FoundDecl,
2643                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2644                                NamedDecl *FirstQualifierInScope) {
2645     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2646                                                                       isArrow);
2647     if (!Member->getDeclName()) {
2648       // We have a reference to an unnamed field.  This is always the
2649       // base of an anonymous struct/union member access, i.e. the
2650       // field is always of record type.
2651       assert(Member->getType()->isRecordType() &&
2652              "unnamed member not of record type?");
2653 
2654       BaseResult =
2655         getSema().PerformObjectMemberConversion(BaseResult.get(),
2656                                                 QualifierLoc.getNestedNameSpecifier(),
2657                                                 FoundDecl, Member);
2658       if (BaseResult.isInvalid())
2659         return ExprError();
2660       Base = BaseResult.get();
2661 
2662       CXXScopeSpec EmptySS;
2663       return getSema().BuildFieldReferenceExpr(
2664           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2665           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2666     }
2667 
2668     CXXScopeSpec SS;
2669     SS.Adopt(QualifierLoc);
2670 
2671     Base = BaseResult.get();
2672     QualType BaseType = Base->getType();
2673 
2674     if (isArrow && !BaseType->isPointerType())
2675       return ExprError();
2676 
2677     // FIXME: this involves duplicating earlier analysis in a lot of
2678     // cases; we should avoid this when possible.
2679     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2680     R.addDecl(FoundDecl);
2681     R.resolveKind();
2682 
2683     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2684                                               SS, TemplateKWLoc,
2685                                               FirstQualifierInScope,
2686                                               R, ExplicitTemplateArgs,
2687                                               /*S*/nullptr);
2688   }
2689 
2690   /// Build a new binary operator expression.
2691   ///
2692   /// By default, performs semantic analysis to build the new expression.
2693   /// Subclasses may override this routine to provide different behavior.
2694   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2695                                          BinaryOperatorKind Opc,
2696                                          Expr *LHS, Expr *RHS) {
2697     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2698   }
2699 
2700   /// Build a new rewritten operator expression.
2701   ///
2702   /// By default, performs semantic analysis to build the new expression.
2703   /// Subclasses may override this routine to provide different behavior.
2704   ExprResult RebuildCXXRewrittenBinaryOperator(
2705       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2706       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2707     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2708                                            RHS, /*RequiresADL*/false);
2709   }
2710 
2711   /// Build a new conditional operator expression.
2712   ///
2713   /// By default, performs semantic analysis to build the new expression.
2714   /// Subclasses may override this routine to provide different behavior.
2715   ExprResult RebuildConditionalOperator(Expr *Cond,
2716                                         SourceLocation QuestionLoc,
2717                                         Expr *LHS,
2718                                         SourceLocation ColonLoc,
2719                                         Expr *RHS) {
2720     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2721                                         LHS, RHS);
2722   }
2723 
2724   /// Build a new C-style cast expression.
2725   ///
2726   /// By default, performs semantic analysis to build the new expression.
2727   /// Subclasses may override this routine to provide different behavior.
2728   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2729                                          TypeSourceInfo *TInfo,
2730                                          SourceLocation RParenLoc,
2731                                          Expr *SubExpr) {
2732     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2733                                          SubExpr);
2734   }
2735 
2736   /// Build a new compound literal expression.
2737   ///
2738   /// By default, performs semantic analysis to build the new expression.
2739   /// Subclasses may override this routine to provide different behavior.
2740   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2741                                               TypeSourceInfo *TInfo,
2742                                               SourceLocation RParenLoc,
2743                                               Expr *Init) {
2744     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2745                                               Init);
2746   }
2747 
2748   /// Build a new extended vector element access expression.
2749   ///
2750   /// By default, performs semantic analysis to build the new expression.
2751   /// Subclasses may override this routine to provide different behavior.
2752   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2753                                                SourceLocation OpLoc,
2754                                                SourceLocation AccessorLoc,
2755                                                IdentifierInfo &Accessor) {
2756 
2757     CXXScopeSpec SS;
2758     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2759     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2760                                               OpLoc, /*IsArrow*/ false,
2761                                               SS, SourceLocation(),
2762                                               /*FirstQualifierInScope*/ nullptr,
2763                                               NameInfo,
2764                                               /* TemplateArgs */ nullptr,
2765                                               /*S*/ nullptr);
2766   }
2767 
2768   /// Build a new initializer list expression.
2769   ///
2770   /// By default, performs semantic analysis to build the new expression.
2771   /// Subclasses may override this routine to provide different behavior.
2772   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2773                              MultiExprArg Inits,
2774                              SourceLocation RBraceLoc) {
2775     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2776   }
2777 
2778   /// Build a new designated initializer expression.
2779   ///
2780   /// By default, performs semantic analysis to build the new expression.
2781   /// Subclasses may override this routine to provide different behavior.
2782   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2783                                              MultiExprArg ArrayExprs,
2784                                              SourceLocation EqualOrColonLoc,
2785                                              bool GNUSyntax,
2786                                              Expr *Init) {
2787     ExprResult Result
2788       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2789                                            Init);
2790     if (Result.isInvalid())
2791       return ExprError();
2792 
2793     return Result;
2794   }
2795 
2796   /// Build a new value-initialized expression.
2797   ///
2798   /// By default, builds the implicit value initialization without performing
2799   /// any semantic analysis. Subclasses may override this routine to provide
2800   /// different behavior.
2801   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2802     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2803   }
2804 
2805   /// Build a new \c va_arg expression.
2806   ///
2807   /// By default, performs semantic analysis to build the new expression.
2808   /// Subclasses may override this routine to provide different behavior.
2809   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2810                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2811                                     SourceLocation RParenLoc) {
2812     return getSema().BuildVAArgExpr(BuiltinLoc,
2813                                     SubExpr, TInfo,
2814                                     RParenLoc);
2815   }
2816 
2817   /// Build a new expression list in parentheses.
2818   ///
2819   /// By default, performs semantic analysis to build the new expression.
2820   /// Subclasses may override this routine to provide different behavior.
2821   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2822                                   MultiExprArg SubExprs,
2823                                   SourceLocation RParenLoc) {
2824     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2825   }
2826 
2827   /// Build a new address-of-label expression.
2828   ///
2829   /// By default, performs semantic analysis, using the name of the label
2830   /// rather than attempting to map the label statement itself.
2831   /// Subclasses may override this routine to provide different behavior.
2832   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2833                                   SourceLocation LabelLoc, LabelDecl *Label) {
2834     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2835   }
2836 
2837   /// Build a new GNU statement expression.
2838   ///
2839   /// By default, performs semantic analysis to build the new expression.
2840   /// Subclasses may override this routine to provide different behavior.
2841   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2842                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2843     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2844                                    TemplateDepth);
2845   }
2846 
2847   /// Build a new __builtin_choose_expr expression.
2848   ///
2849   /// By default, performs semantic analysis to build the new expression.
2850   /// Subclasses may override this routine to provide different behavior.
2851   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2852                                      Expr *Cond, Expr *LHS, Expr *RHS,
2853                                      SourceLocation RParenLoc) {
2854     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2855                                    Cond, LHS, RHS,
2856                                    RParenLoc);
2857   }
2858 
2859   /// Build a new generic selection expression.
2860   ///
2861   /// By default, performs semantic analysis to build the new expression.
2862   /// Subclasses may override this routine to provide different behavior.
2863   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2864                                          SourceLocation DefaultLoc,
2865                                          SourceLocation RParenLoc,
2866                                          Expr *ControllingExpr,
2867                                          ArrayRef<TypeSourceInfo *> Types,
2868                                          ArrayRef<Expr *> Exprs) {
2869     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2870                                                 ControllingExpr, Types, Exprs);
2871   }
2872 
2873   /// Build a new overloaded operator call expression.
2874   ///
2875   /// By default, performs semantic analysis to build the new expression.
2876   /// The semantic analysis provides the behavior of template instantiation,
2877   /// copying with transformations that turn what looks like an overloaded
2878   /// operator call into a use of a builtin operator, performing
2879   /// argument-dependent lookup, etc. Subclasses may override this routine to
2880   /// provide different behavior.
2881   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2882                                               SourceLocation OpLoc,
2883                                               Expr *Callee,
2884                                               Expr *First,
2885                                               Expr *Second);
2886 
2887   /// Build a new C++ "named" cast expression, such as static_cast or
2888   /// reinterpret_cast.
2889   ///
2890   /// By default, this routine dispatches to one of the more-specific routines
2891   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2892   /// Subclasses may override this routine to provide different behavior.
2893   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2894                                            Stmt::StmtClass Class,
2895                                            SourceLocation LAngleLoc,
2896                                            TypeSourceInfo *TInfo,
2897                                            SourceLocation RAngleLoc,
2898                                            SourceLocation LParenLoc,
2899                                            Expr *SubExpr,
2900                                            SourceLocation RParenLoc) {
2901     switch (Class) {
2902     case Stmt::CXXStaticCastExprClass:
2903       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2904                                                    RAngleLoc, LParenLoc,
2905                                                    SubExpr, RParenLoc);
2906 
2907     case Stmt::CXXDynamicCastExprClass:
2908       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2909                                                     RAngleLoc, LParenLoc,
2910                                                     SubExpr, RParenLoc);
2911 
2912     case Stmt::CXXReinterpretCastExprClass:
2913       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2914                                                         RAngleLoc, LParenLoc,
2915                                                         SubExpr,
2916                                                         RParenLoc);
2917 
2918     case Stmt::CXXConstCastExprClass:
2919       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2920                                                    RAngleLoc, LParenLoc,
2921                                                    SubExpr, RParenLoc);
2922 
2923     case Stmt::CXXAddrspaceCastExprClass:
2924       return getDerived().RebuildCXXAddrspaceCastExpr(
2925           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2926 
2927     default:
2928       llvm_unreachable("Invalid C++ named cast");
2929     }
2930   }
2931 
2932   /// Build a new C++ static_cast expression.
2933   ///
2934   /// By default, performs semantic analysis to build the new expression.
2935   /// Subclasses may override this routine to provide different behavior.
2936   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2937                                             SourceLocation LAngleLoc,
2938                                             TypeSourceInfo *TInfo,
2939                                             SourceLocation RAngleLoc,
2940                                             SourceLocation LParenLoc,
2941                                             Expr *SubExpr,
2942                                             SourceLocation RParenLoc) {
2943     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2944                                        TInfo, SubExpr,
2945                                        SourceRange(LAngleLoc, RAngleLoc),
2946                                        SourceRange(LParenLoc, RParenLoc));
2947   }
2948 
2949   /// Build a new C++ dynamic_cast expression.
2950   ///
2951   /// By default, performs semantic analysis to build the new expression.
2952   /// Subclasses may override this routine to provide different behavior.
2953   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2954                                              SourceLocation LAngleLoc,
2955                                              TypeSourceInfo *TInfo,
2956                                              SourceLocation RAngleLoc,
2957                                              SourceLocation LParenLoc,
2958                                              Expr *SubExpr,
2959                                              SourceLocation RParenLoc) {
2960     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2961                                        TInfo, SubExpr,
2962                                        SourceRange(LAngleLoc, RAngleLoc),
2963                                        SourceRange(LParenLoc, RParenLoc));
2964   }
2965 
2966   /// Build a new C++ reinterpret_cast expression.
2967   ///
2968   /// By default, performs semantic analysis to build the new expression.
2969   /// Subclasses may override this routine to provide different behavior.
2970   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2971                                                  SourceLocation LAngleLoc,
2972                                                  TypeSourceInfo *TInfo,
2973                                                  SourceLocation RAngleLoc,
2974                                                  SourceLocation LParenLoc,
2975                                                  Expr *SubExpr,
2976                                                  SourceLocation RParenLoc) {
2977     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2978                                        TInfo, SubExpr,
2979                                        SourceRange(LAngleLoc, RAngleLoc),
2980                                        SourceRange(LParenLoc, RParenLoc));
2981   }
2982 
2983   /// Build a new C++ const_cast expression.
2984   ///
2985   /// By default, performs semantic analysis to build the new expression.
2986   /// Subclasses may override this routine to provide different behavior.
2987   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2988                                            SourceLocation LAngleLoc,
2989                                            TypeSourceInfo *TInfo,
2990                                            SourceLocation RAngleLoc,
2991                                            SourceLocation LParenLoc,
2992                                            Expr *SubExpr,
2993                                            SourceLocation RParenLoc) {
2994     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2995                                        TInfo, SubExpr,
2996                                        SourceRange(LAngleLoc, RAngleLoc),
2997                                        SourceRange(LParenLoc, RParenLoc));
2998   }
2999 
3000   ExprResult
3001   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
3002                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
3003                               SourceLocation LParenLoc, Expr *SubExpr,
3004                               SourceLocation RParenLoc) {
3005     return getSema().BuildCXXNamedCast(
3006         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
3007         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
3008   }
3009 
3010   /// Build a new C++ functional-style cast expression.
3011   ///
3012   /// By default, performs semantic analysis to build the new expression.
3013   /// Subclasses may override this routine to provide different behavior.
3014   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3015                                           SourceLocation LParenLoc,
3016                                           Expr *Sub,
3017                                           SourceLocation RParenLoc,
3018                                           bool ListInitialization) {
3019     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3020                                                MultiExprArg(&Sub, 1), RParenLoc,
3021                                                ListInitialization);
3022   }
3023 
3024   /// Build a new C++ __builtin_bit_cast expression.
3025   ///
3026   /// By default, performs semantic analysis to build the new expression.
3027   /// Subclasses may override this routine to provide different behavior.
3028   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3029                                        TypeSourceInfo *TSI, Expr *Sub,
3030                                        SourceLocation RParenLoc) {
3031     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3032   }
3033 
3034   /// Build a new C++ typeid(type) expression.
3035   ///
3036   /// By default, performs semantic analysis to build the new expression.
3037   /// Subclasses may override this routine to provide different behavior.
3038   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3039                                         SourceLocation TypeidLoc,
3040                                         TypeSourceInfo *Operand,
3041                                         SourceLocation RParenLoc) {
3042     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3043                                     RParenLoc);
3044   }
3045 
3046 
3047   /// Build a new C++ typeid(expr) expression.
3048   ///
3049   /// By default, performs semantic analysis to build the new expression.
3050   /// Subclasses may override this routine to provide different behavior.
3051   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3052                                         SourceLocation TypeidLoc,
3053                                         Expr *Operand,
3054                                         SourceLocation RParenLoc) {
3055     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3056                                     RParenLoc);
3057   }
3058 
3059   /// Build a new C++ __uuidof(type) expression.
3060   ///
3061   /// By default, performs semantic analysis to build the new expression.
3062   /// Subclasses may override this routine to provide different behavior.
3063   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3064                                   TypeSourceInfo *Operand,
3065                                   SourceLocation RParenLoc) {
3066     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3067   }
3068 
3069   /// Build a new C++ __uuidof(expr) expression.
3070   ///
3071   /// By default, performs semantic analysis to build the new expression.
3072   /// Subclasses may override this routine to provide different behavior.
3073   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3074                                   Expr *Operand, SourceLocation RParenLoc) {
3075     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3076   }
3077 
3078   /// Build a new C++ "this" expression.
3079   ///
3080   /// By default, builds a new "this" expression without performing any
3081   /// semantic analysis. Subclasses may override this routine to provide
3082   /// different behavior.
3083   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3084                                 QualType ThisType,
3085                                 bool isImplicit) {
3086     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3087   }
3088 
3089   /// Build a new C++ throw expression.
3090   ///
3091   /// By default, performs semantic analysis to build the new expression.
3092   /// Subclasses may override this routine to provide different behavior.
3093   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3094                                  bool IsThrownVariableInScope) {
3095     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3096   }
3097 
3098   /// Build a new C++ default-argument expression.
3099   ///
3100   /// By default, builds a new default-argument expression, which does not
3101   /// require any semantic analysis. Subclasses may override this routine to
3102   /// provide different behavior.
3103   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3104     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3105                                      getSema().CurContext);
3106   }
3107 
3108   /// Build a new C++11 default-initialization expression.
3109   ///
3110   /// By default, builds a new default field initialization expression, which
3111   /// does not require any semantic analysis. Subclasses may override this
3112   /// routine to provide different behavior.
3113   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3114                                        FieldDecl *Field) {
3115     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3116                                       getSema().CurContext);
3117   }
3118 
3119   /// Build a new C++ zero-initialization expression.
3120   ///
3121   /// By default, performs semantic analysis to build the new expression.
3122   /// Subclasses may override this routine to provide different behavior.
3123   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3124                                            SourceLocation LParenLoc,
3125                                            SourceLocation RParenLoc) {
3126     return getSema().BuildCXXTypeConstructExpr(
3127         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3128   }
3129 
3130   /// Build a new C++ "new" expression.
3131   ///
3132   /// By default, performs semantic analysis to build the new expression.
3133   /// Subclasses may override this routine to provide different behavior.
3134   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3135                                bool UseGlobal,
3136                                SourceLocation PlacementLParen,
3137                                MultiExprArg PlacementArgs,
3138                                SourceLocation PlacementRParen,
3139                                SourceRange TypeIdParens,
3140                                QualType AllocatedType,
3141                                TypeSourceInfo *AllocatedTypeInfo,
3142                                Optional<Expr *> ArraySize,
3143                                SourceRange DirectInitRange,
3144                                Expr *Initializer) {
3145     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3146                                  PlacementLParen,
3147                                  PlacementArgs,
3148                                  PlacementRParen,
3149                                  TypeIdParens,
3150                                  AllocatedType,
3151                                  AllocatedTypeInfo,
3152                                  ArraySize,
3153                                  DirectInitRange,
3154                                  Initializer);
3155   }
3156 
3157   /// Build a new C++ "delete" expression.
3158   ///
3159   /// By default, performs semantic analysis to build the new expression.
3160   /// Subclasses may override this routine to provide different behavior.
3161   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3162                                         bool IsGlobalDelete,
3163                                         bool IsArrayForm,
3164                                         Expr *Operand) {
3165     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3166                                     Operand);
3167   }
3168 
3169   /// Build a new type trait expression.
3170   ///
3171   /// By default, performs semantic analysis to build the new expression.
3172   /// Subclasses may override this routine to provide different behavior.
3173   ExprResult RebuildTypeTrait(TypeTrait Trait,
3174                               SourceLocation StartLoc,
3175                               ArrayRef<TypeSourceInfo *> Args,
3176                               SourceLocation RParenLoc) {
3177     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3178   }
3179 
3180   /// Build a new array type trait expression.
3181   ///
3182   /// By default, performs semantic analysis to build the new expression.
3183   /// Subclasses may override this routine to provide different behavior.
3184   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3185                                    SourceLocation StartLoc,
3186                                    TypeSourceInfo *TSInfo,
3187                                    Expr *DimExpr,
3188                                    SourceLocation RParenLoc) {
3189     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3190   }
3191 
3192   /// Build a new expression trait expression.
3193   ///
3194   /// By default, performs semantic analysis to build the new expression.
3195   /// Subclasses may override this routine to provide different behavior.
3196   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3197                                    SourceLocation StartLoc,
3198                                    Expr *Queried,
3199                                    SourceLocation RParenLoc) {
3200     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3201   }
3202 
3203   /// Build a new (previously unresolved) declaration reference
3204   /// expression.
3205   ///
3206   /// By default, performs semantic analysis to build the new expression.
3207   /// Subclasses may override this routine to provide different behavior.
3208   ExprResult RebuildDependentScopeDeclRefExpr(
3209                                           NestedNameSpecifierLoc QualifierLoc,
3210                                           SourceLocation TemplateKWLoc,
3211                                        const DeclarationNameInfo &NameInfo,
3212                               const TemplateArgumentListInfo *TemplateArgs,
3213                                           bool IsAddressOfOperand,
3214                                           TypeSourceInfo **RecoveryTSI) {
3215     CXXScopeSpec SS;
3216     SS.Adopt(QualifierLoc);
3217 
3218     if (TemplateArgs || TemplateKWLoc.isValid())
3219       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3220                                                     TemplateArgs);
3221 
3222     return getSema().BuildQualifiedDeclarationNameExpr(
3223         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3224   }
3225 
3226   /// Build a new template-id expression.
3227   ///
3228   /// By default, performs semantic analysis to build the new expression.
3229   /// Subclasses may override this routine to provide different behavior.
3230   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3231                                    SourceLocation TemplateKWLoc,
3232                                    LookupResult &R,
3233                                    bool RequiresADL,
3234                               const TemplateArgumentListInfo *TemplateArgs) {
3235     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3236                                          TemplateArgs);
3237   }
3238 
3239   /// Build a new object-construction expression.
3240   ///
3241   /// By default, performs semantic analysis to build the new expression.
3242   /// Subclasses may override this routine to provide different behavior.
3243   ExprResult RebuildCXXConstructExpr(QualType T,
3244                                      SourceLocation Loc,
3245                                      CXXConstructorDecl *Constructor,
3246                                      bool IsElidable,
3247                                      MultiExprArg Args,
3248                                      bool HadMultipleCandidates,
3249                                      bool ListInitialization,
3250                                      bool StdInitListInitialization,
3251                                      bool RequiresZeroInit,
3252                              CXXConstructExpr::ConstructionKind ConstructKind,
3253                                      SourceRange ParenRange) {
3254     // Reconstruct the constructor we originally found, which might be
3255     // different if this is a call to an inherited constructor.
3256     CXXConstructorDecl *FoundCtor = Constructor;
3257     if (Constructor->isInheritingConstructor())
3258       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3259 
3260     SmallVector<Expr *, 8> ConvertedArgs;
3261     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3262                                           ConvertedArgs))
3263       return ExprError();
3264 
3265     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3266                                            IsElidable,
3267                                            ConvertedArgs,
3268                                            HadMultipleCandidates,
3269                                            ListInitialization,
3270                                            StdInitListInitialization,
3271                                            RequiresZeroInit, ConstructKind,
3272                                            ParenRange);
3273   }
3274 
3275   /// Build a new implicit construction via inherited constructor
3276   /// expression.
3277   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3278                                              CXXConstructorDecl *Constructor,
3279                                              bool ConstructsVBase,
3280                                              bool InheritedFromVBase) {
3281     return new (getSema().Context) CXXInheritedCtorInitExpr(
3282         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3283   }
3284 
3285   /// Build a new object-construction expression.
3286   ///
3287   /// By default, performs semantic analysis to build the new expression.
3288   /// Subclasses may override this routine to provide different behavior.
3289   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3290                                            SourceLocation LParenOrBraceLoc,
3291                                            MultiExprArg Args,
3292                                            SourceLocation RParenOrBraceLoc,
3293                                            bool ListInitialization) {
3294     return getSema().BuildCXXTypeConstructExpr(
3295         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3296   }
3297 
3298   /// Build a new object-construction expression.
3299   ///
3300   /// By default, performs semantic analysis to build the new expression.
3301   /// Subclasses may override this routine to provide different behavior.
3302   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3303                                                SourceLocation LParenLoc,
3304                                                MultiExprArg Args,
3305                                                SourceLocation RParenLoc,
3306                                                bool ListInitialization) {
3307     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3308                                                RParenLoc, ListInitialization);
3309   }
3310 
3311   /// Build a new member reference expression.
3312   ///
3313   /// By default, performs semantic analysis to build the new expression.
3314   /// Subclasses may override this routine to provide different behavior.
3315   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3316                                                 QualType BaseType,
3317                                                 bool IsArrow,
3318                                                 SourceLocation OperatorLoc,
3319                                           NestedNameSpecifierLoc QualifierLoc,
3320                                                 SourceLocation TemplateKWLoc,
3321                                             NamedDecl *FirstQualifierInScope,
3322                                    const DeclarationNameInfo &MemberNameInfo,
3323                               const TemplateArgumentListInfo *TemplateArgs) {
3324     CXXScopeSpec SS;
3325     SS.Adopt(QualifierLoc);
3326 
3327     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3328                                             OperatorLoc, IsArrow,
3329                                             SS, TemplateKWLoc,
3330                                             FirstQualifierInScope,
3331                                             MemberNameInfo,
3332                                             TemplateArgs, /*S*/nullptr);
3333   }
3334 
3335   /// Build a new member reference expression.
3336   ///
3337   /// By default, performs semantic analysis to build the new expression.
3338   /// Subclasses may override this routine to provide different behavior.
3339   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3340                                          SourceLocation OperatorLoc,
3341                                          bool IsArrow,
3342                                          NestedNameSpecifierLoc QualifierLoc,
3343                                          SourceLocation TemplateKWLoc,
3344                                          NamedDecl *FirstQualifierInScope,
3345                                          LookupResult &R,
3346                                 const TemplateArgumentListInfo *TemplateArgs) {
3347     CXXScopeSpec SS;
3348     SS.Adopt(QualifierLoc);
3349 
3350     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3351                                             OperatorLoc, IsArrow,
3352                                             SS, TemplateKWLoc,
3353                                             FirstQualifierInScope,
3354                                             R, TemplateArgs, /*S*/nullptr);
3355   }
3356 
3357   /// Build a new noexcept expression.
3358   ///
3359   /// By default, performs semantic analysis to build the new expression.
3360   /// Subclasses may override this routine to provide different behavior.
3361   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3362     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3363   }
3364 
3365   /// Build a new expression to compute the length of a parameter pack.
3366   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3367                                    NamedDecl *Pack,
3368                                    SourceLocation PackLoc,
3369                                    SourceLocation RParenLoc,
3370                                    Optional<unsigned> Length,
3371                                    ArrayRef<TemplateArgument> PartialArgs) {
3372     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3373                                   RParenLoc, Length, PartialArgs);
3374   }
3375 
3376   /// Build a new expression representing a call to a source location
3377   ///  builtin.
3378   ///
3379   /// By default, performs semantic analysis to build the new expression.
3380   /// Subclasses may override this routine to provide different behavior.
3381   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3382                                   SourceLocation BuiltinLoc,
3383                                   SourceLocation RPLoc,
3384                                   DeclContext *ParentContext) {
3385     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3386   }
3387 
3388   /// Build a new Objective-C boxed expression.
3389   ///
3390   /// By default, performs semantic analysis to build the new expression.
3391   /// Subclasses may override this routine to provide different behavior.
3392   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3393       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3394       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3395       TemplateArgumentListInfo *TALI) {
3396     CXXScopeSpec SS;
3397     SS.Adopt(NNS);
3398     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3399                                                          ConceptNameInfo,
3400                                                          FoundDecl,
3401                                                          NamedConcept, TALI);
3402     if (Result.isInvalid())
3403       return ExprError();
3404     return Result;
3405   }
3406 
3407   /// \brief Build a new requires expression.
3408   ///
3409   /// By default, performs semantic analysis to build the new expression.
3410   /// Subclasses may override this routine to provide different behavior.
3411   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3412                                  RequiresExprBodyDecl *Body,
3413                                  ArrayRef<ParmVarDecl *> LocalParameters,
3414                                  ArrayRef<concepts::Requirement *> Requirements,
3415                                  SourceLocation ClosingBraceLoc) {
3416     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3417                                 LocalParameters, Requirements, ClosingBraceLoc);
3418   }
3419 
3420   concepts::TypeRequirement *
3421   RebuildTypeRequirement(
3422       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3423     return SemaRef.BuildTypeRequirement(SubstDiag);
3424   }
3425 
3426   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3427     return SemaRef.BuildTypeRequirement(T);
3428   }
3429 
3430   concepts::ExprRequirement *
3431   RebuildExprRequirement(
3432       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3433       SourceLocation NoexceptLoc,
3434       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3435     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3436                                         std::move(Ret));
3437   }
3438 
3439   concepts::ExprRequirement *
3440   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3441                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3442     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3443                                         std::move(Ret));
3444   }
3445 
3446   concepts::NestedRequirement *
3447   RebuildNestedRequirement(
3448       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3449     return SemaRef.BuildNestedRequirement(SubstDiag);
3450   }
3451 
3452   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3453     return SemaRef.BuildNestedRequirement(Constraint);
3454   }
3455 
3456   /// \brief Build a new Objective-C boxed expression.
3457   ///
3458   /// By default, performs semantic analysis to build the new expression.
3459   /// Subclasses may override this routine to provide different behavior.
3460   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3461     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3462   }
3463 
3464   /// Build a new Objective-C array literal.
3465   ///
3466   /// By default, performs semantic analysis to build the new expression.
3467   /// Subclasses may override this routine to provide different behavior.
3468   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3469                                      Expr **Elements, unsigned NumElements) {
3470     return getSema().BuildObjCArrayLiteral(Range,
3471                                            MultiExprArg(Elements, NumElements));
3472   }
3473 
3474   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3475                                          Expr *Base, Expr *Key,
3476                                          ObjCMethodDecl *getterMethod,
3477                                          ObjCMethodDecl *setterMethod) {
3478     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3479                                                    getterMethod, setterMethod);
3480   }
3481 
3482   /// Build a new Objective-C dictionary literal.
3483   ///
3484   /// By default, performs semantic analysis to build the new expression.
3485   /// Subclasses may override this routine to provide different behavior.
3486   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3487                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3488     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3489   }
3490 
3491   /// Build a new Objective-C \@encode expression.
3492   ///
3493   /// By default, performs semantic analysis to build the new expression.
3494   /// Subclasses may override this routine to provide different behavior.
3495   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3496                                          TypeSourceInfo *EncodeTypeInfo,
3497                                          SourceLocation RParenLoc) {
3498     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3499   }
3500 
3501   /// Build a new Objective-C class message.
3502   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3503                                           Selector Sel,
3504                                           ArrayRef<SourceLocation> SelectorLocs,
3505                                           ObjCMethodDecl *Method,
3506                                           SourceLocation LBracLoc,
3507                                           MultiExprArg Args,
3508                                           SourceLocation RBracLoc) {
3509     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3510                                      ReceiverTypeInfo->getType(),
3511                                      /*SuperLoc=*/SourceLocation(),
3512                                      Sel, Method, LBracLoc, SelectorLocs,
3513                                      RBracLoc, Args);
3514   }
3515 
3516   /// Build a new Objective-C instance message.
3517   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3518                                           Selector Sel,
3519                                           ArrayRef<SourceLocation> SelectorLocs,
3520                                           ObjCMethodDecl *Method,
3521                                           SourceLocation LBracLoc,
3522                                           MultiExprArg Args,
3523                                           SourceLocation RBracLoc) {
3524     return SemaRef.BuildInstanceMessage(Receiver,
3525                                         Receiver->getType(),
3526                                         /*SuperLoc=*/SourceLocation(),
3527                                         Sel, Method, LBracLoc, SelectorLocs,
3528                                         RBracLoc, Args);
3529   }
3530 
3531   /// Build a new Objective-C instance/class message to 'super'.
3532   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3533                                     Selector Sel,
3534                                     ArrayRef<SourceLocation> SelectorLocs,
3535                                     QualType SuperType,
3536                                     ObjCMethodDecl *Method,
3537                                     SourceLocation LBracLoc,
3538                                     MultiExprArg Args,
3539                                     SourceLocation RBracLoc) {
3540     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3541                                           SuperType,
3542                                           SuperLoc,
3543                                           Sel, Method, LBracLoc, SelectorLocs,
3544                                           RBracLoc, Args)
3545                                       : SemaRef.BuildClassMessage(nullptr,
3546                                           SuperType,
3547                                           SuperLoc,
3548                                           Sel, Method, LBracLoc, SelectorLocs,
3549                                           RBracLoc, Args);
3550 
3551 
3552   }
3553 
3554   /// Build a new Objective-C ivar reference expression.
3555   ///
3556   /// By default, performs semantic analysis to build the new expression.
3557   /// Subclasses may override this routine to provide different behavior.
3558   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3559                                           SourceLocation IvarLoc,
3560                                           bool IsArrow, bool IsFreeIvar) {
3561     CXXScopeSpec SS;
3562     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3563     ExprResult Result = getSema().BuildMemberReferenceExpr(
3564         BaseArg, BaseArg->getType(),
3565         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3566         /*FirstQualifierInScope=*/nullptr, NameInfo,
3567         /*TemplateArgs=*/nullptr,
3568         /*S=*/nullptr);
3569     if (IsFreeIvar && Result.isUsable())
3570       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3571     return Result;
3572   }
3573 
3574   /// Build a new Objective-C property reference expression.
3575   ///
3576   /// By default, performs semantic analysis to build the new expression.
3577   /// Subclasses may override this routine to provide different behavior.
3578   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3579                                         ObjCPropertyDecl *Property,
3580                                         SourceLocation PropertyLoc) {
3581     CXXScopeSpec SS;
3582     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3583     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3584                                               /*FIXME:*/PropertyLoc,
3585                                               /*IsArrow=*/false,
3586                                               SS, SourceLocation(),
3587                                               /*FirstQualifierInScope=*/nullptr,
3588                                               NameInfo,
3589                                               /*TemplateArgs=*/nullptr,
3590                                               /*S=*/nullptr);
3591   }
3592 
3593   /// Build a new Objective-C property reference expression.
3594   ///
3595   /// By default, performs semantic analysis to build the new expression.
3596   /// Subclasses may override this routine to provide different behavior.
3597   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3598                                         ObjCMethodDecl *Getter,
3599                                         ObjCMethodDecl *Setter,
3600                                         SourceLocation PropertyLoc) {
3601     // Since these expressions can only be value-dependent, we do not
3602     // need to perform semantic analysis again.
3603     return Owned(
3604       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3605                                                   VK_LValue, OK_ObjCProperty,
3606                                                   PropertyLoc, Base));
3607   }
3608 
3609   /// Build a new Objective-C "isa" expression.
3610   ///
3611   /// By default, performs semantic analysis to build the new expression.
3612   /// Subclasses may override this routine to provide different behavior.
3613   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3614                                 SourceLocation OpLoc, bool IsArrow) {
3615     CXXScopeSpec SS;
3616     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3617     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3618                                               OpLoc, IsArrow,
3619                                               SS, SourceLocation(),
3620                                               /*FirstQualifierInScope=*/nullptr,
3621                                               NameInfo,
3622                                               /*TemplateArgs=*/nullptr,
3623                                               /*S=*/nullptr);
3624   }
3625 
3626   /// Build a new shuffle vector 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 RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3631                                       MultiExprArg SubExprs,
3632                                       SourceLocation RParenLoc) {
3633     // Find the declaration for __builtin_shufflevector
3634     const IdentifierInfo &Name
3635       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3636     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3637     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3638     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3639 
3640     // Build a reference to the __builtin_shufflevector builtin
3641     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3642     Expr *Callee = new (SemaRef.Context)
3643         DeclRefExpr(SemaRef.Context, Builtin, false,
3644                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3645     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3646     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3647                                        CK_BuiltinFnToFnPtr).get();
3648 
3649     // Build the CallExpr
3650     ExprResult TheCall = CallExpr::Create(
3651         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3652         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3653         FPOptionsOverride());
3654 
3655     // Type-check the __builtin_shufflevector expression.
3656     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3657   }
3658 
3659   /// Build a new convert vector expression.
3660   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3661                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3662                                       SourceLocation RParenLoc) {
3663     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3664                                          BuiltinLoc, RParenLoc);
3665   }
3666 
3667   /// Build a new template argument pack expansion.
3668   ///
3669   /// By default, performs semantic analysis to build a new pack expansion
3670   /// for a template argument. Subclasses may override this routine to provide
3671   /// different behavior.
3672   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3673                                            SourceLocation EllipsisLoc,
3674                                            Optional<unsigned> NumExpansions) {
3675     switch (Pattern.getArgument().getKind()) {
3676     case TemplateArgument::Expression: {
3677       ExprResult Result
3678         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3679                                        EllipsisLoc, NumExpansions);
3680       if (Result.isInvalid())
3681         return TemplateArgumentLoc();
3682 
3683       return TemplateArgumentLoc(Result.get(), Result.get());
3684     }
3685 
3686     case TemplateArgument::Template:
3687       return TemplateArgumentLoc(
3688           SemaRef.Context,
3689           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3690                            NumExpansions),
3691           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3692           EllipsisLoc);
3693 
3694     case TemplateArgument::Null:
3695     case TemplateArgument::Integral:
3696     case TemplateArgument::Declaration:
3697     case TemplateArgument::Pack:
3698     case TemplateArgument::TemplateExpansion:
3699     case TemplateArgument::NullPtr:
3700       llvm_unreachable("Pack expansion pattern has no parameter packs");
3701 
3702     case TemplateArgument::Type:
3703       if (TypeSourceInfo *Expansion
3704             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3705                                            EllipsisLoc,
3706                                            NumExpansions))
3707         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3708                                    Expansion);
3709       break;
3710     }
3711 
3712     return TemplateArgumentLoc();
3713   }
3714 
3715   /// Build a new expression pack expansion.
3716   ///
3717   /// By default, performs semantic analysis to build a new pack expansion
3718   /// for an expression. Subclasses may override this routine to provide
3719   /// different behavior.
3720   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3721                                   Optional<unsigned> NumExpansions) {
3722     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3723   }
3724 
3725   /// Build a new C++1z fold-expression.
3726   ///
3727   /// By default, performs semantic analysis in order to build a new fold
3728   /// expression.
3729   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3730                                 SourceLocation LParenLoc, Expr *LHS,
3731                                 BinaryOperatorKind Operator,
3732                                 SourceLocation EllipsisLoc, Expr *RHS,
3733                                 SourceLocation RParenLoc,
3734                                 Optional<unsigned> NumExpansions) {
3735     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3736                                       EllipsisLoc, RHS, RParenLoc,
3737                                       NumExpansions);
3738   }
3739 
3740   /// Build an empty C++1z fold-expression with the given operator.
3741   ///
3742   /// By default, produces the fallback value for the fold-expression, or
3743   /// produce an error if there is no fallback value.
3744   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3745                                      BinaryOperatorKind Operator) {
3746     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3747   }
3748 
3749   /// Build a new atomic operation expression.
3750   ///
3751   /// By default, performs semantic analysis to build the new expression.
3752   /// Subclasses may override this routine to provide different behavior.
3753   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3754                                AtomicExpr::AtomicOp Op,
3755                                SourceLocation RParenLoc) {
3756     // Use this for all of the locations, since we don't know the difference
3757     // between the call and the expr at this point.
3758     SourceRange Range{BuiltinLoc, RParenLoc};
3759     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3760                                      Sema::AtomicArgumentOrder::AST);
3761   }
3762 
3763   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3764                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3765     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3766   }
3767 
3768 private:
3769   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3770                                      QualType ObjectType,
3771                                      NamedDecl *FirstQualifierInScope,
3772                                      CXXScopeSpec &SS);
3773 
3774   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3775                                              QualType ObjectType,
3776                                              NamedDecl *FirstQualifierInScope,
3777                                              CXXScopeSpec &SS);
3778 
3779   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3780                                             NamedDecl *FirstQualifierInScope,
3781                                             CXXScopeSpec &SS);
3782 
3783   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3784                                       DependentNameTypeLoc TL,
3785                                       bool DeducibleTSTContext);
3786 };
3787 
3788 template <typename Derived>
3789 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3790   if (!S)
3791     return S;
3792 
3793   switch (S->getStmtClass()) {
3794   case Stmt::NoStmtClass: break;
3795 
3796   // Transform individual statement nodes
3797   // Pass SDK into statements that can produce a value
3798 #define STMT(Node, Parent)                                              \
3799   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3800 #define VALUESTMT(Node, Parent)                                         \
3801   case Stmt::Node##Class:                                               \
3802     return getDerived().Transform##Node(cast<Node>(S), SDK);
3803 #define ABSTRACT_STMT(Node)
3804 #define EXPR(Node, Parent)
3805 #include "clang/AST/StmtNodes.inc"
3806 
3807   // Transform expressions by calling TransformExpr.
3808 #define STMT(Node, Parent)
3809 #define ABSTRACT_STMT(Stmt)
3810 #define EXPR(Node, Parent) case Stmt::Node##Class:
3811 #include "clang/AST/StmtNodes.inc"
3812     {
3813       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3814 
3815       if (SDK == SDK_StmtExprResult)
3816         E = getSema().ActOnStmtExprResult(E);
3817       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3818     }
3819   }
3820 
3821   return S;
3822 }
3823 
3824 template<typename Derived>
3825 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3826   if (!S)
3827     return S;
3828 
3829   switch (S->getClauseKind()) {
3830   default: break;
3831   // Transform individual clause nodes
3832 #define GEN_CLANG_CLAUSE_CLASS
3833 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3834   case Enum:                                                                   \
3835     return getDerived().Transform##Class(cast<Class>(S));
3836 #include "llvm/Frontend/OpenMP/OMP.inc"
3837   }
3838 
3839   return S;
3840 }
3841 
3842 
3843 template<typename Derived>
3844 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3845   if (!E)
3846     return E;
3847 
3848   switch (E->getStmtClass()) {
3849     case Stmt::NoStmtClass: break;
3850 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3851 #define ABSTRACT_STMT(Stmt)
3852 #define EXPR(Node, Parent)                                              \
3853     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3854 #include "clang/AST/StmtNodes.inc"
3855   }
3856 
3857   return E;
3858 }
3859 
3860 template<typename Derived>
3861 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3862                                                         bool NotCopyInit) {
3863   // Initializers are instantiated like expressions, except that various outer
3864   // layers are stripped.
3865   if (!Init)
3866     return Init;
3867 
3868   if (auto *FE = dyn_cast<FullExpr>(Init))
3869     Init = FE->getSubExpr();
3870 
3871   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init)) {
3872     OpaqueValueExpr *OVE = AIL->getCommonExpr();
3873     Init = OVE->getSourceExpr();
3874   }
3875 
3876   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3877     Init = MTE->getSubExpr();
3878 
3879   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3880     Init = Binder->getSubExpr();
3881 
3882   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3883     Init = ICE->getSubExprAsWritten();
3884 
3885   if (CXXStdInitializerListExpr *ILE =
3886           dyn_cast<CXXStdInitializerListExpr>(Init))
3887     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3888 
3889   // If this is copy-initialization, we only need to reconstruct
3890   // InitListExprs. Other forms of copy-initialization will be a no-op if
3891   // the initializer is already the right type.
3892   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3893   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3894     return getDerived().TransformExpr(Init);
3895 
3896   // Revert value-initialization back to empty parens.
3897   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3898     SourceRange Parens = VIE->getSourceRange();
3899     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3900                                              Parens.getEnd());
3901   }
3902 
3903   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3904   if (isa<ImplicitValueInitExpr>(Init))
3905     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3906                                              SourceLocation());
3907 
3908   // Revert initialization by constructor back to a parenthesized or braced list
3909   // of expressions. Any other form of initializer can just be reused directly.
3910   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3911     return getDerived().TransformExpr(Init);
3912 
3913   // If the initialization implicitly converted an initializer list to a
3914   // std::initializer_list object, unwrap the std::initializer_list too.
3915   if (Construct && Construct->isStdInitListInitialization())
3916     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3917 
3918   // Enter a list-init context if this was list initialization.
3919   EnterExpressionEvaluationContext Context(
3920       getSema(), EnterExpressionEvaluationContext::InitList,
3921       Construct->isListInitialization());
3922 
3923   SmallVector<Expr*, 8> NewArgs;
3924   bool ArgChanged = false;
3925   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3926                                   /*IsCall*/true, NewArgs, &ArgChanged))
3927     return ExprError();
3928 
3929   // If this was list initialization, revert to syntactic list form.
3930   if (Construct->isListInitialization())
3931     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3932                                         Construct->getEndLoc());
3933 
3934   // Build a ParenListExpr to represent anything else.
3935   SourceRange Parens = Construct->getParenOrBraceRange();
3936   if (Parens.isInvalid()) {
3937     // This was a variable declaration's initialization for which no initializer
3938     // was specified.
3939     assert(NewArgs.empty() &&
3940            "no parens or braces but have direct init with arguments?");
3941     return ExprEmpty();
3942   }
3943   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3944                                            Parens.getEnd());
3945 }
3946 
3947 template<typename Derived>
3948 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3949                                             unsigned NumInputs,
3950                                             bool IsCall,
3951                                       SmallVectorImpl<Expr *> &Outputs,
3952                                             bool *ArgChanged) {
3953   for (unsigned I = 0; I != NumInputs; ++I) {
3954     // If requested, drop call arguments that need to be dropped.
3955     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3956       if (ArgChanged)
3957         *ArgChanged = true;
3958 
3959       break;
3960     }
3961 
3962     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3963       Expr *Pattern = Expansion->getPattern();
3964 
3965       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3966       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3967       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3968 
3969       // Determine whether the set of unexpanded parameter packs can and should
3970       // be expanded.
3971       bool Expand = true;
3972       bool RetainExpansion = false;
3973       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3974       Optional<unsigned> NumExpansions = OrigNumExpansions;
3975       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3976                                                Pattern->getSourceRange(),
3977                                                Unexpanded,
3978                                                Expand, RetainExpansion,
3979                                                NumExpansions))
3980         return true;
3981 
3982       if (!Expand) {
3983         // The transform has determined that we should perform a simple
3984         // transformation on the pack expansion, producing another pack
3985         // expansion.
3986         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3987         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3988         if (OutPattern.isInvalid())
3989           return true;
3990 
3991         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3992                                                 Expansion->getEllipsisLoc(),
3993                                                            NumExpansions);
3994         if (Out.isInvalid())
3995           return true;
3996 
3997         if (ArgChanged)
3998           *ArgChanged = true;
3999         Outputs.push_back(Out.get());
4000         continue;
4001       }
4002 
4003       // Record right away that the argument was changed.  This needs
4004       // to happen even if the array expands to nothing.
4005       if (ArgChanged) *ArgChanged = true;
4006 
4007       // The transform has determined that we should perform an elementwise
4008       // expansion of the pattern. Do so.
4009       for (unsigned I = 0; I != *NumExpansions; ++I) {
4010         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4011         ExprResult Out = getDerived().TransformExpr(Pattern);
4012         if (Out.isInvalid())
4013           return true;
4014 
4015         if (Out.get()->containsUnexpandedParameterPack()) {
4016           Out = getDerived().RebuildPackExpansion(
4017               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4018           if (Out.isInvalid())
4019             return true;
4020         }
4021 
4022         Outputs.push_back(Out.get());
4023       }
4024 
4025       // If we're supposed to retain a pack expansion, do so by temporarily
4026       // forgetting the partially-substituted parameter pack.
4027       if (RetainExpansion) {
4028         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4029 
4030         ExprResult Out = getDerived().TransformExpr(Pattern);
4031         if (Out.isInvalid())
4032           return true;
4033 
4034         Out = getDerived().RebuildPackExpansion(
4035             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4036         if (Out.isInvalid())
4037           return true;
4038 
4039         Outputs.push_back(Out.get());
4040       }
4041 
4042       continue;
4043     }
4044 
4045     ExprResult Result =
4046       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4047              : getDerived().TransformExpr(Inputs[I]);
4048     if (Result.isInvalid())
4049       return true;
4050 
4051     if (Result.get() != Inputs[I] && ArgChanged)
4052       *ArgChanged = true;
4053 
4054     Outputs.push_back(Result.get());
4055   }
4056 
4057   return false;
4058 }
4059 
4060 template <typename Derived>
4061 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4062     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4063   if (Var) {
4064     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4065         getDerived().TransformDefinition(Var->getLocation(), Var));
4066 
4067     if (!ConditionVar)
4068       return Sema::ConditionError();
4069 
4070     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4071   }
4072 
4073   if (Expr) {
4074     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4075 
4076     if (CondExpr.isInvalid())
4077       return Sema::ConditionError();
4078 
4079     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
4080   }
4081 
4082   return Sema::ConditionResult();
4083 }
4084 
4085 template <typename Derived>
4086 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4087     NestedNameSpecifierLoc NNS, QualType ObjectType,
4088     NamedDecl *FirstQualifierInScope) {
4089   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4090   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4091        Qualifier = Qualifier.getPrefix())
4092     Qualifiers.push_back(Qualifier);
4093 
4094   CXXScopeSpec SS;
4095   while (!Qualifiers.empty()) {
4096     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4097     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4098 
4099     switch (QNNS->getKind()) {
4100     case NestedNameSpecifier::Identifier: {
4101       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4102                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4103                                       ObjectType);
4104       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4105                                               SS, FirstQualifierInScope, false))
4106         return NestedNameSpecifierLoc();
4107       break;
4108     }
4109 
4110     case NestedNameSpecifier::Namespace: {
4111       NamespaceDecl *NS =
4112           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4113               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4114       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4115       break;
4116     }
4117 
4118     case NestedNameSpecifier::NamespaceAlias: {
4119       NamespaceAliasDecl *Alias =
4120           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4121               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4122       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4123                 Q.getLocalEndLoc());
4124       break;
4125     }
4126 
4127     case NestedNameSpecifier::Global:
4128       // There is no meaningful transformation that one could perform on the
4129       // global scope.
4130       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4131       break;
4132 
4133     case NestedNameSpecifier::Super: {
4134       CXXRecordDecl *RD =
4135           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4136               SourceLocation(), QNNS->getAsRecordDecl()));
4137       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4138       break;
4139     }
4140 
4141     case NestedNameSpecifier::TypeSpecWithTemplate:
4142     case NestedNameSpecifier::TypeSpec: {
4143       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4144                                               FirstQualifierInScope, SS);
4145 
4146       if (!TL)
4147         return NestedNameSpecifierLoc();
4148 
4149       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4150           (SemaRef.getLangOpts().CPlusPlus11 &&
4151            TL.getType()->isEnumeralType())) {
4152         assert(!TL.getType().hasLocalQualifiers() &&
4153                "Can't get cv-qualifiers here");
4154         if (TL.getType()->isEnumeralType())
4155           SemaRef.Diag(TL.getBeginLoc(),
4156                        diag::warn_cxx98_compat_enum_nested_name_spec);
4157         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4158                   Q.getLocalEndLoc());
4159         break;
4160       }
4161       // If the nested-name-specifier is an invalid type def, don't emit an
4162       // error because a previous error should have already been emitted.
4163       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4164       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4165         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4166             << TL.getType() << SS.getRange();
4167       }
4168       return NestedNameSpecifierLoc();
4169     }
4170     }
4171 
4172     // The qualifier-in-scope and object type only apply to the leftmost entity.
4173     FirstQualifierInScope = nullptr;
4174     ObjectType = QualType();
4175   }
4176 
4177   // Don't rebuild the nested-name-specifier if we don't have to.
4178   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4179       !getDerived().AlwaysRebuild())
4180     return NNS;
4181 
4182   // If we can re-use the source-location data from the original
4183   // nested-name-specifier, do so.
4184   if (SS.location_size() == NNS.getDataLength() &&
4185       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4186     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4187 
4188   // Allocate new nested-name-specifier location information.
4189   return SS.getWithLocInContext(SemaRef.Context);
4190 }
4191 
4192 template<typename Derived>
4193 DeclarationNameInfo
4194 TreeTransform<Derived>
4195 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4196   DeclarationName Name = NameInfo.getName();
4197   if (!Name)
4198     return DeclarationNameInfo();
4199 
4200   switch (Name.getNameKind()) {
4201   case DeclarationName::Identifier:
4202   case DeclarationName::ObjCZeroArgSelector:
4203   case DeclarationName::ObjCOneArgSelector:
4204   case DeclarationName::ObjCMultiArgSelector:
4205   case DeclarationName::CXXOperatorName:
4206   case DeclarationName::CXXLiteralOperatorName:
4207   case DeclarationName::CXXUsingDirective:
4208     return NameInfo;
4209 
4210   case DeclarationName::CXXDeductionGuideName: {
4211     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4212     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4213         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4214     if (!NewTemplate)
4215       return DeclarationNameInfo();
4216 
4217     DeclarationNameInfo NewNameInfo(NameInfo);
4218     NewNameInfo.setName(
4219         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4220     return NewNameInfo;
4221   }
4222 
4223   case DeclarationName::CXXConstructorName:
4224   case DeclarationName::CXXDestructorName:
4225   case DeclarationName::CXXConversionFunctionName: {
4226     TypeSourceInfo *NewTInfo;
4227     CanQualType NewCanTy;
4228     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4229       NewTInfo = getDerived().TransformType(OldTInfo);
4230       if (!NewTInfo)
4231         return DeclarationNameInfo();
4232       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4233     }
4234     else {
4235       NewTInfo = nullptr;
4236       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4237       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4238       if (NewT.isNull())
4239         return DeclarationNameInfo();
4240       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4241     }
4242 
4243     DeclarationName NewName
4244       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4245                                                            NewCanTy);
4246     DeclarationNameInfo NewNameInfo(NameInfo);
4247     NewNameInfo.setName(NewName);
4248     NewNameInfo.setNamedTypeInfo(NewTInfo);
4249     return NewNameInfo;
4250   }
4251   }
4252 
4253   llvm_unreachable("Unknown name kind.");
4254 }
4255 
4256 template<typename Derived>
4257 TemplateName
4258 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4259                                               TemplateName Name,
4260                                               SourceLocation NameLoc,
4261                                               QualType ObjectType,
4262                                               NamedDecl *FirstQualifierInScope,
4263                                               bool AllowInjectedClassName) {
4264   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4265     TemplateDecl *Template = QTN->getTemplateDecl();
4266     assert(Template && "qualified template name must refer to a template");
4267 
4268     TemplateDecl *TransTemplate
4269       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4270                                                               Template));
4271     if (!TransTemplate)
4272       return TemplateName();
4273 
4274     if (!getDerived().AlwaysRebuild() &&
4275         SS.getScopeRep() == QTN->getQualifier() &&
4276         TransTemplate == Template)
4277       return Name;
4278 
4279     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4280                                             TransTemplate);
4281   }
4282 
4283   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4284     if (SS.getScopeRep()) {
4285       // These apply to the scope specifier, not the template.
4286       ObjectType = QualType();
4287       FirstQualifierInScope = nullptr;
4288     }
4289 
4290     if (!getDerived().AlwaysRebuild() &&
4291         SS.getScopeRep() == DTN->getQualifier() &&
4292         ObjectType.isNull())
4293       return Name;
4294 
4295     // FIXME: Preserve the location of the "template" keyword.
4296     SourceLocation TemplateKWLoc = NameLoc;
4297 
4298     if (DTN->isIdentifier()) {
4299       return getDerived().RebuildTemplateName(SS,
4300                                               TemplateKWLoc,
4301                                               *DTN->getIdentifier(),
4302                                               NameLoc,
4303                                               ObjectType,
4304                                               FirstQualifierInScope,
4305                                               AllowInjectedClassName);
4306     }
4307 
4308     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4309                                             DTN->getOperator(), NameLoc,
4310                                             ObjectType, AllowInjectedClassName);
4311   }
4312 
4313   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4314     TemplateDecl *TransTemplate
4315       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4316                                                               Template));
4317     if (!TransTemplate)
4318       return TemplateName();
4319 
4320     if (!getDerived().AlwaysRebuild() &&
4321         TransTemplate == Template)
4322       return Name;
4323 
4324     return TemplateName(TransTemplate);
4325   }
4326 
4327   if (SubstTemplateTemplateParmPackStorage *SubstPack
4328       = Name.getAsSubstTemplateTemplateParmPack()) {
4329     TemplateTemplateParmDecl *TransParam
4330     = cast_or_null<TemplateTemplateParmDecl>(
4331             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4332     if (!TransParam)
4333       return TemplateName();
4334 
4335     if (!getDerived().AlwaysRebuild() &&
4336         TransParam == SubstPack->getParameterPack())
4337       return Name;
4338 
4339     return getDerived().RebuildTemplateName(TransParam,
4340                                             SubstPack->getArgumentPack());
4341   }
4342 
4343   // These should be getting filtered out before they reach the AST.
4344   llvm_unreachable("overloaded function decl survived to here");
4345 }
4346 
4347 template<typename Derived>
4348 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4349                                          const TemplateArgument &Arg,
4350                                          TemplateArgumentLoc &Output) {
4351   Output = getSema().getTrivialTemplateArgumentLoc(
4352       Arg, QualType(), getDerived().getBaseLocation());
4353 }
4354 
4355 template <typename Derived>
4356 bool TreeTransform<Derived>::TransformTemplateArgument(
4357     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4358     bool Uneval) {
4359   const TemplateArgument &Arg = Input.getArgument();
4360   switch (Arg.getKind()) {
4361   case TemplateArgument::Null:
4362   case TemplateArgument::Pack:
4363     llvm_unreachable("Unexpected TemplateArgument");
4364 
4365   case TemplateArgument::Integral:
4366   case TemplateArgument::NullPtr:
4367   case TemplateArgument::Declaration: {
4368     // Transform a resolved template argument straight to a resolved template
4369     // argument. We get here when substituting into an already-substituted
4370     // template type argument during concept satisfaction checking.
4371     QualType T = Arg.getNonTypeTemplateArgumentType();
4372     QualType NewT = getDerived().TransformType(T);
4373     if (NewT.isNull())
4374       return true;
4375 
4376     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4377                        ? Arg.getAsDecl()
4378                        : nullptr;
4379     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4380                               getDerived().getBaseLocation(), D))
4381                         : nullptr;
4382     if (D && !NewD)
4383       return true;
4384 
4385     if (NewT == T && D == NewD)
4386       Output = Input;
4387     else if (Arg.getKind() == TemplateArgument::Integral)
4388       Output = TemplateArgumentLoc(
4389           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4390           TemplateArgumentLocInfo());
4391     else if (Arg.getKind() == TemplateArgument::NullPtr)
4392       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4393                                    TemplateArgumentLocInfo());
4394     else
4395       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4396                                    TemplateArgumentLocInfo());
4397 
4398     return false;
4399   }
4400 
4401   case TemplateArgument::Type: {
4402     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4403     if (!DI)
4404       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4405 
4406     DI = getDerived().TransformType(DI);
4407     if (!DI)
4408       return true;
4409 
4410     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4411     return false;
4412   }
4413 
4414   case TemplateArgument::Template: {
4415     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4416     if (QualifierLoc) {
4417       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4418       if (!QualifierLoc)
4419         return true;
4420     }
4421 
4422     CXXScopeSpec SS;
4423     SS.Adopt(QualifierLoc);
4424     TemplateName Template = getDerived().TransformTemplateName(
4425         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4426     if (Template.isNull())
4427       return true;
4428 
4429     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4430                                  QualifierLoc, Input.getTemplateNameLoc());
4431     return false;
4432   }
4433 
4434   case TemplateArgument::TemplateExpansion:
4435     llvm_unreachable("Caller should expand pack expansions");
4436 
4437   case TemplateArgument::Expression: {
4438     // Template argument expressions are constant expressions.
4439     EnterExpressionEvaluationContext Unevaluated(
4440         getSema(),
4441         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4442                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4443         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4444         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4445 
4446     Expr *InputExpr = Input.getSourceExpression();
4447     if (!InputExpr)
4448       InputExpr = Input.getArgument().getAsExpr();
4449 
4450     ExprResult E = getDerived().TransformExpr(InputExpr);
4451     E = SemaRef.ActOnConstantExpression(E);
4452     if (E.isInvalid())
4453       return true;
4454     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4455     return false;
4456   }
4457   }
4458 
4459   // Work around bogus GCC warning
4460   return true;
4461 }
4462 
4463 /// Iterator adaptor that invents template argument location information
4464 /// for each of the template arguments in its underlying iterator.
4465 template<typename Derived, typename InputIterator>
4466 class TemplateArgumentLocInventIterator {
4467   TreeTransform<Derived> &Self;
4468   InputIterator Iter;
4469 
4470 public:
4471   typedef TemplateArgumentLoc value_type;
4472   typedef TemplateArgumentLoc reference;
4473   typedef typename std::iterator_traits<InputIterator>::difference_type
4474     difference_type;
4475   typedef std::input_iterator_tag iterator_category;
4476 
4477   class pointer {
4478     TemplateArgumentLoc Arg;
4479 
4480   public:
4481     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4482 
4483     const TemplateArgumentLoc *operator->() const { return &Arg; }
4484   };
4485 
4486   TemplateArgumentLocInventIterator() { }
4487 
4488   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4489                                              InputIterator Iter)
4490     : Self(Self), Iter(Iter) { }
4491 
4492   TemplateArgumentLocInventIterator &operator++() {
4493     ++Iter;
4494     return *this;
4495   }
4496 
4497   TemplateArgumentLocInventIterator operator++(int) {
4498     TemplateArgumentLocInventIterator Old(*this);
4499     ++(*this);
4500     return Old;
4501   }
4502 
4503   reference operator*() const {
4504     TemplateArgumentLoc Result;
4505     Self.InventTemplateArgumentLoc(*Iter, Result);
4506     return Result;
4507   }
4508 
4509   pointer operator->() const { return pointer(**this); }
4510 
4511   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4512                          const TemplateArgumentLocInventIterator &Y) {
4513     return X.Iter == Y.Iter;
4514   }
4515 
4516   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4517                          const TemplateArgumentLocInventIterator &Y) {
4518     return X.Iter != Y.Iter;
4519   }
4520 };
4521 
4522 template<typename Derived>
4523 template<typename InputIterator>
4524 bool TreeTransform<Derived>::TransformTemplateArguments(
4525     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4526     bool Uneval) {
4527   for (; First != Last; ++First) {
4528     TemplateArgumentLoc Out;
4529     TemplateArgumentLoc In = *First;
4530 
4531     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4532       // Unpack argument packs, which we translate them into separate
4533       // arguments.
4534       // FIXME: We could do much better if we could guarantee that the
4535       // TemplateArgumentLocInfo for the pack expansion would be usable for
4536       // all of the template arguments in the argument pack.
4537       typedef TemplateArgumentLocInventIterator<Derived,
4538                                                 TemplateArgument::pack_iterator>
4539         PackLocIterator;
4540       if (TransformTemplateArguments(PackLocIterator(*this,
4541                                                  In.getArgument().pack_begin()),
4542                                      PackLocIterator(*this,
4543                                                    In.getArgument().pack_end()),
4544                                      Outputs, Uneval))
4545         return true;
4546 
4547       continue;
4548     }
4549 
4550     if (In.getArgument().isPackExpansion()) {
4551       // We have a pack expansion, for which we will be substituting into
4552       // the pattern.
4553       SourceLocation Ellipsis;
4554       Optional<unsigned> OrigNumExpansions;
4555       TemplateArgumentLoc Pattern
4556         = getSema().getTemplateArgumentPackExpansionPattern(
4557               In, Ellipsis, OrigNumExpansions);
4558 
4559       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4560       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4561       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4562 
4563       // Determine whether the set of unexpanded parameter packs can and should
4564       // be expanded.
4565       bool Expand = true;
4566       bool RetainExpansion = false;
4567       Optional<unsigned> NumExpansions = OrigNumExpansions;
4568       if (getDerived().TryExpandParameterPacks(Ellipsis,
4569                                                Pattern.getSourceRange(),
4570                                                Unexpanded,
4571                                                Expand,
4572                                                RetainExpansion,
4573                                                NumExpansions))
4574         return true;
4575 
4576       if (!Expand) {
4577         // The transform has determined that we should perform a simple
4578         // transformation on the pack expansion, producing another pack
4579         // expansion.
4580         TemplateArgumentLoc OutPattern;
4581         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4582         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4583           return true;
4584 
4585         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4586                                                 NumExpansions);
4587         if (Out.getArgument().isNull())
4588           return true;
4589 
4590         Outputs.addArgument(Out);
4591         continue;
4592       }
4593 
4594       // The transform has determined that we should perform an elementwise
4595       // expansion of the pattern. Do so.
4596       for (unsigned I = 0; I != *NumExpansions; ++I) {
4597         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4598 
4599         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4600           return true;
4601 
4602         if (Out.getArgument().containsUnexpandedParameterPack()) {
4603           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4604                                                   OrigNumExpansions);
4605           if (Out.getArgument().isNull())
4606             return true;
4607         }
4608 
4609         Outputs.addArgument(Out);
4610       }
4611 
4612       // If we're supposed to retain a pack expansion, do so by temporarily
4613       // forgetting the partially-substituted parameter pack.
4614       if (RetainExpansion) {
4615         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4616 
4617         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4618           return true;
4619 
4620         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4621                                                 OrigNumExpansions);
4622         if (Out.getArgument().isNull())
4623           return true;
4624 
4625         Outputs.addArgument(Out);
4626       }
4627 
4628       continue;
4629     }
4630 
4631     // The simple case:
4632     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4633       return true;
4634 
4635     Outputs.addArgument(Out);
4636   }
4637 
4638   return false;
4639 
4640 }
4641 
4642 //===----------------------------------------------------------------------===//
4643 // Type transformation
4644 //===----------------------------------------------------------------------===//
4645 
4646 template<typename Derived>
4647 QualType TreeTransform<Derived>::TransformType(QualType T) {
4648   if (getDerived().AlreadyTransformed(T))
4649     return T;
4650 
4651   // Temporary workaround.  All of these transformations should
4652   // eventually turn into transformations on TypeLocs.
4653   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4654                                                 getDerived().getBaseLocation());
4655 
4656   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4657 
4658   if (!NewDI)
4659     return QualType();
4660 
4661   return NewDI->getType();
4662 }
4663 
4664 template<typename Derived>
4665 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4666   // Refine the base location to the type's location.
4667   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4668                        getDerived().getBaseEntity());
4669   if (getDerived().AlreadyTransformed(DI->getType()))
4670     return DI;
4671 
4672   TypeLocBuilder TLB;
4673 
4674   TypeLoc TL = DI->getTypeLoc();
4675   TLB.reserve(TL.getFullDataSize());
4676 
4677   QualType Result = getDerived().TransformType(TLB, TL);
4678   if (Result.isNull())
4679     return nullptr;
4680 
4681   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4682 }
4683 
4684 template<typename Derived>
4685 QualType
4686 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4687   switch (T.getTypeLocClass()) {
4688 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4689 #define TYPELOC(CLASS, PARENT)                                                 \
4690   case TypeLoc::CLASS:                                                         \
4691     return getDerived().Transform##CLASS##Type(TLB,                            \
4692                                                T.castAs<CLASS##TypeLoc>());
4693 #include "clang/AST/TypeLocNodes.def"
4694   }
4695 
4696   llvm_unreachable("unhandled type loc!");
4697 }
4698 
4699 template<typename Derived>
4700 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4701   if (!isa<DependentNameType>(T))
4702     return TransformType(T);
4703 
4704   if (getDerived().AlreadyTransformed(T))
4705     return T;
4706   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4707                                                 getDerived().getBaseLocation());
4708   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4709   return NewDI ? NewDI->getType() : QualType();
4710 }
4711 
4712 template<typename Derived>
4713 TypeSourceInfo *
4714 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4715   if (!isa<DependentNameType>(DI->getType()))
4716     return TransformType(DI);
4717 
4718   // Refine the base location to the type's location.
4719   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4720                        getDerived().getBaseEntity());
4721   if (getDerived().AlreadyTransformed(DI->getType()))
4722     return DI;
4723 
4724   TypeLocBuilder TLB;
4725 
4726   TypeLoc TL = DI->getTypeLoc();
4727   TLB.reserve(TL.getFullDataSize());
4728 
4729   auto QTL = TL.getAs<QualifiedTypeLoc>();
4730   if (QTL)
4731     TL = QTL.getUnqualifiedLoc();
4732 
4733   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4734 
4735   QualType Result = getDerived().TransformDependentNameType(
4736       TLB, DNTL, /*DeducedTSTContext*/true);
4737   if (Result.isNull())
4738     return nullptr;
4739 
4740   if (QTL) {
4741     Result = getDerived().RebuildQualifiedType(Result, QTL);
4742     if (Result.isNull())
4743       return nullptr;
4744     TLB.TypeWasModifiedSafely(Result);
4745   }
4746 
4747   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4748 }
4749 
4750 template<typename Derived>
4751 QualType
4752 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4753                                                QualifiedTypeLoc T) {
4754   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4755   if (Result.isNull())
4756     return QualType();
4757 
4758   Result = getDerived().RebuildQualifiedType(Result, T);
4759 
4760   if (Result.isNull())
4761     return QualType();
4762 
4763   // RebuildQualifiedType might have updated the type, but not in a way
4764   // that invalidates the TypeLoc. (There's no location information for
4765   // qualifiers.)
4766   TLB.TypeWasModifiedSafely(Result);
4767 
4768   return Result;
4769 }
4770 
4771 template <typename Derived>
4772 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4773                                                       QualifiedTypeLoc TL) {
4774 
4775   SourceLocation Loc = TL.getBeginLoc();
4776   Qualifiers Quals = TL.getType().getLocalQualifiers();
4777 
4778   if ((T.getAddressSpace() != LangAS::Default &&
4779        Quals.getAddressSpace() != LangAS::Default) &&
4780       T.getAddressSpace() != Quals.getAddressSpace()) {
4781     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4782         << TL.getType() << T;
4783     return QualType();
4784   }
4785 
4786   // C++ [dcl.fct]p7:
4787   //   [When] adding cv-qualifications on top of the function type [...] the
4788   //   cv-qualifiers are ignored.
4789   if (T->isFunctionType()) {
4790     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4791                                                      Quals.getAddressSpace());
4792     return T;
4793   }
4794 
4795   // C++ [dcl.ref]p1:
4796   //   when the cv-qualifiers are introduced through the use of a typedef-name
4797   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4798   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4799   // applied to a reference type.
4800   if (T->isReferenceType()) {
4801     // The only qualifier that applies to a reference type is restrict.
4802     if (!Quals.hasRestrict())
4803       return T;
4804     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4805   }
4806 
4807   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4808   // resulting type.
4809   if (Quals.hasObjCLifetime()) {
4810     if (!T->isObjCLifetimeType() && !T->isDependentType())
4811       Quals.removeObjCLifetime();
4812     else if (T.getObjCLifetime()) {
4813       // Objective-C ARC:
4814       //   A lifetime qualifier applied to a substituted template parameter
4815       //   overrides the lifetime qualifier from the template argument.
4816       const AutoType *AutoTy;
4817       if (const SubstTemplateTypeParmType *SubstTypeParam
4818                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4819         QualType Replacement = SubstTypeParam->getReplacementType();
4820         Qualifiers Qs = Replacement.getQualifiers();
4821         Qs.removeObjCLifetime();
4822         Replacement = SemaRef.Context.getQualifiedType(
4823             Replacement.getUnqualifiedType(), Qs);
4824         T = SemaRef.Context.getSubstTemplateTypeParmType(
4825             SubstTypeParam->getReplacedParameter(), Replacement);
4826       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4827         // 'auto' types behave the same way as template parameters.
4828         QualType Deduced = AutoTy->getDeducedType();
4829         Qualifiers Qs = Deduced.getQualifiers();
4830         Qs.removeObjCLifetime();
4831         Deduced =
4832             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4833         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4834                                         AutoTy->isDependentType(),
4835                                         /*isPack=*/false,
4836                                         AutoTy->getTypeConstraintConcept(),
4837                                         AutoTy->getTypeConstraintArguments());
4838       } else {
4839         // Otherwise, complain about the addition of a qualifier to an
4840         // already-qualified type.
4841         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4842         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4843         Quals.removeObjCLifetime();
4844       }
4845     }
4846   }
4847 
4848   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4849 }
4850 
4851 template<typename Derived>
4852 TypeLoc
4853 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4854                                                    QualType ObjectType,
4855                                                    NamedDecl *UnqualLookup,
4856                                                    CXXScopeSpec &SS) {
4857   if (getDerived().AlreadyTransformed(TL.getType()))
4858     return TL;
4859 
4860   TypeSourceInfo *TSI =
4861       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4862   if (TSI)
4863     return TSI->getTypeLoc();
4864   return TypeLoc();
4865 }
4866 
4867 template<typename Derived>
4868 TypeSourceInfo *
4869 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4870                                                    QualType ObjectType,
4871                                                    NamedDecl *UnqualLookup,
4872                                                    CXXScopeSpec &SS) {
4873   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4874     return TSInfo;
4875 
4876   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4877                                    UnqualLookup, SS);
4878 }
4879 
4880 template <typename Derived>
4881 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4882     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4883     CXXScopeSpec &SS) {
4884   QualType T = TL.getType();
4885   assert(!getDerived().AlreadyTransformed(T));
4886 
4887   TypeLocBuilder TLB;
4888   QualType Result;
4889 
4890   if (isa<TemplateSpecializationType>(T)) {
4891     TemplateSpecializationTypeLoc SpecTL =
4892         TL.castAs<TemplateSpecializationTypeLoc>();
4893 
4894     TemplateName Template = getDerived().TransformTemplateName(
4895         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4896         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4897     if (Template.isNull())
4898       return nullptr;
4899 
4900     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4901                                                               Template);
4902   } else if (isa<DependentTemplateSpecializationType>(T)) {
4903     DependentTemplateSpecializationTypeLoc SpecTL =
4904         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4905 
4906     TemplateName Template
4907       = getDerived().RebuildTemplateName(SS,
4908                                          SpecTL.getTemplateKeywordLoc(),
4909                                          *SpecTL.getTypePtr()->getIdentifier(),
4910                                          SpecTL.getTemplateNameLoc(),
4911                                          ObjectType, UnqualLookup,
4912                                          /*AllowInjectedClassName*/true);
4913     if (Template.isNull())
4914       return nullptr;
4915 
4916     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4917                                                                        SpecTL,
4918                                                                        Template,
4919                                                                        SS);
4920   } else {
4921     // Nothing special needs to be done for these.
4922     Result = getDerived().TransformType(TLB, TL);
4923   }
4924 
4925   if (Result.isNull())
4926     return nullptr;
4927 
4928   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4929 }
4930 
4931 template <class TyLoc> static inline
4932 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4933   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4934   NewT.setNameLoc(T.getNameLoc());
4935   return T.getType();
4936 }
4937 
4938 template<typename Derived>
4939 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4940                                                       BuiltinTypeLoc T) {
4941   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4942   NewT.setBuiltinLoc(T.getBuiltinLoc());
4943   if (T.needsExtraLocalData())
4944     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4945   return T.getType();
4946 }
4947 
4948 template<typename Derived>
4949 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4950                                                       ComplexTypeLoc T) {
4951   // FIXME: recurse?
4952   return TransformTypeSpecType(TLB, T);
4953 }
4954 
4955 template <typename Derived>
4956 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4957                                                        AdjustedTypeLoc TL) {
4958   // Adjustments applied during transformation are handled elsewhere.
4959   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4960 }
4961 
4962 template<typename Derived>
4963 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4964                                                       DecayedTypeLoc TL) {
4965   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4966   if (OriginalType.isNull())
4967     return QualType();
4968 
4969   QualType Result = TL.getType();
4970   if (getDerived().AlwaysRebuild() ||
4971       OriginalType != TL.getOriginalLoc().getType())
4972     Result = SemaRef.Context.getDecayedType(OriginalType);
4973   TLB.push<DecayedTypeLoc>(Result);
4974   // Nothing to set for DecayedTypeLoc.
4975   return Result;
4976 }
4977 
4978 template<typename Derived>
4979 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4980                                                       PointerTypeLoc TL) {
4981   QualType PointeeType
4982     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4983   if (PointeeType.isNull())
4984     return QualType();
4985 
4986   QualType Result = TL.getType();
4987   if (PointeeType->getAs<ObjCObjectType>()) {
4988     // A dependent pointer type 'T *' has is being transformed such
4989     // that an Objective-C class type is being replaced for 'T'. The
4990     // resulting pointer type is an ObjCObjectPointerType, not a
4991     // PointerType.
4992     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4993 
4994     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4995     NewT.setStarLoc(TL.getStarLoc());
4996     return Result;
4997   }
4998 
4999   if (getDerived().AlwaysRebuild() ||
5000       PointeeType != TL.getPointeeLoc().getType()) {
5001     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
5002     if (Result.isNull())
5003       return QualType();
5004   }
5005 
5006   // Objective-C ARC can add lifetime qualifiers to the type that we're
5007   // pointing to.
5008   TLB.TypeWasModifiedSafely(Result->getPointeeType());
5009 
5010   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
5011   NewT.setSigilLoc(TL.getSigilLoc());
5012   return Result;
5013 }
5014 
5015 template<typename Derived>
5016 QualType
5017 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5018                                                   BlockPointerTypeLoc TL) {
5019   QualType PointeeType
5020     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5021   if (PointeeType.isNull())
5022     return QualType();
5023 
5024   QualType Result = TL.getType();
5025   if (getDerived().AlwaysRebuild() ||
5026       PointeeType != TL.getPointeeLoc().getType()) {
5027     Result = getDerived().RebuildBlockPointerType(PointeeType,
5028                                                   TL.getSigilLoc());
5029     if (Result.isNull())
5030       return QualType();
5031   }
5032 
5033   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5034   NewT.setSigilLoc(TL.getSigilLoc());
5035   return Result;
5036 }
5037 
5038 /// Transforms a reference type.  Note that somewhat paradoxically we
5039 /// don't care whether the type itself is an l-value type or an r-value
5040 /// type;  we only care if the type was *written* as an l-value type
5041 /// or an r-value type.
5042 template<typename Derived>
5043 QualType
5044 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5045                                                ReferenceTypeLoc TL) {
5046   const ReferenceType *T = TL.getTypePtr();
5047 
5048   // Note that this works with the pointee-as-written.
5049   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5050   if (PointeeType.isNull())
5051     return QualType();
5052 
5053   QualType Result = TL.getType();
5054   if (getDerived().AlwaysRebuild() ||
5055       PointeeType != T->getPointeeTypeAsWritten()) {
5056     Result = getDerived().RebuildReferenceType(PointeeType,
5057                                                T->isSpelledAsLValue(),
5058                                                TL.getSigilLoc());
5059     if (Result.isNull())
5060       return QualType();
5061   }
5062 
5063   // Objective-C ARC can add lifetime qualifiers to the type that we're
5064   // referring to.
5065   TLB.TypeWasModifiedSafely(
5066       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5067 
5068   // r-value references can be rebuilt as l-value references.
5069   ReferenceTypeLoc NewTL;
5070   if (isa<LValueReferenceType>(Result))
5071     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5072   else
5073     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5074   NewTL.setSigilLoc(TL.getSigilLoc());
5075 
5076   return Result;
5077 }
5078 
5079 template<typename Derived>
5080 QualType
5081 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5082                                                  LValueReferenceTypeLoc TL) {
5083   return TransformReferenceType(TLB, TL);
5084 }
5085 
5086 template<typename Derived>
5087 QualType
5088 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5089                                                  RValueReferenceTypeLoc TL) {
5090   return TransformReferenceType(TLB, TL);
5091 }
5092 
5093 template<typename Derived>
5094 QualType
5095 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5096                                                    MemberPointerTypeLoc TL) {
5097   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5098   if (PointeeType.isNull())
5099     return QualType();
5100 
5101   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5102   TypeSourceInfo *NewClsTInfo = nullptr;
5103   if (OldClsTInfo) {
5104     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5105     if (!NewClsTInfo)
5106       return QualType();
5107   }
5108 
5109   const MemberPointerType *T = TL.getTypePtr();
5110   QualType OldClsType = QualType(T->getClass(), 0);
5111   QualType NewClsType;
5112   if (NewClsTInfo)
5113     NewClsType = NewClsTInfo->getType();
5114   else {
5115     NewClsType = getDerived().TransformType(OldClsType);
5116     if (NewClsType.isNull())
5117       return QualType();
5118   }
5119 
5120   QualType Result = TL.getType();
5121   if (getDerived().AlwaysRebuild() ||
5122       PointeeType != T->getPointeeType() ||
5123       NewClsType != OldClsType) {
5124     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5125                                                    TL.getStarLoc());
5126     if (Result.isNull())
5127       return QualType();
5128   }
5129 
5130   // If we had to adjust the pointee type when building a member pointer, make
5131   // sure to push TypeLoc info for it.
5132   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5133   if (MPT && PointeeType != MPT->getPointeeType()) {
5134     assert(isa<AdjustedType>(MPT->getPointeeType()));
5135     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5136   }
5137 
5138   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5139   NewTL.setSigilLoc(TL.getSigilLoc());
5140   NewTL.setClassTInfo(NewClsTInfo);
5141 
5142   return Result;
5143 }
5144 
5145 template<typename Derived>
5146 QualType
5147 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5148                                                    ConstantArrayTypeLoc TL) {
5149   const ConstantArrayType *T = TL.getTypePtr();
5150   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5151   if (ElementType.isNull())
5152     return QualType();
5153 
5154   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5155   Expr *OldSize = TL.getSizeExpr();
5156   if (!OldSize)
5157     OldSize = const_cast<Expr*>(T->getSizeExpr());
5158   Expr *NewSize = nullptr;
5159   if (OldSize) {
5160     EnterExpressionEvaluationContext Unevaluated(
5161         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5162     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5163     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5164   }
5165 
5166   QualType Result = TL.getType();
5167   if (getDerived().AlwaysRebuild() ||
5168       ElementType != T->getElementType() ||
5169       (T->getSizeExpr() && NewSize != OldSize)) {
5170     Result = getDerived().RebuildConstantArrayType(ElementType,
5171                                                    T->getSizeModifier(),
5172                                                    T->getSize(), NewSize,
5173                                              T->getIndexTypeCVRQualifiers(),
5174                                                    TL.getBracketsRange());
5175     if (Result.isNull())
5176       return QualType();
5177   }
5178 
5179   // We might have either a ConstantArrayType or a VariableArrayType now:
5180   // a ConstantArrayType is allowed to have an element type which is a
5181   // VariableArrayType if the type is dependent.  Fortunately, all array
5182   // types have the same location layout.
5183   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5184   NewTL.setLBracketLoc(TL.getLBracketLoc());
5185   NewTL.setRBracketLoc(TL.getRBracketLoc());
5186   NewTL.setSizeExpr(NewSize);
5187 
5188   return Result;
5189 }
5190 
5191 template<typename Derived>
5192 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5193                                               TypeLocBuilder &TLB,
5194                                               IncompleteArrayTypeLoc TL) {
5195   const IncompleteArrayType *T = TL.getTypePtr();
5196   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5197   if (ElementType.isNull())
5198     return QualType();
5199 
5200   QualType Result = TL.getType();
5201   if (getDerived().AlwaysRebuild() ||
5202       ElementType != T->getElementType()) {
5203     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5204                                                      T->getSizeModifier(),
5205                                            T->getIndexTypeCVRQualifiers(),
5206                                                      TL.getBracketsRange());
5207     if (Result.isNull())
5208       return QualType();
5209   }
5210 
5211   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5212   NewTL.setLBracketLoc(TL.getLBracketLoc());
5213   NewTL.setRBracketLoc(TL.getRBracketLoc());
5214   NewTL.setSizeExpr(nullptr);
5215 
5216   return Result;
5217 }
5218 
5219 template<typename Derived>
5220 QualType
5221 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5222                                                    VariableArrayTypeLoc TL) {
5223   const VariableArrayType *T = TL.getTypePtr();
5224   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5225   if (ElementType.isNull())
5226     return QualType();
5227 
5228   ExprResult SizeResult;
5229   {
5230     EnterExpressionEvaluationContext Context(
5231         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5232     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5233   }
5234   if (SizeResult.isInvalid())
5235     return QualType();
5236   SizeResult =
5237       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5238   if (SizeResult.isInvalid())
5239     return QualType();
5240 
5241   Expr *Size = SizeResult.get();
5242 
5243   QualType Result = TL.getType();
5244   if (getDerived().AlwaysRebuild() ||
5245       ElementType != T->getElementType() ||
5246       Size != T->getSizeExpr()) {
5247     Result = getDerived().RebuildVariableArrayType(ElementType,
5248                                                    T->getSizeModifier(),
5249                                                    Size,
5250                                              T->getIndexTypeCVRQualifiers(),
5251                                                    TL.getBracketsRange());
5252     if (Result.isNull())
5253       return QualType();
5254   }
5255 
5256   // We might have constant size array now, but fortunately it has the same
5257   // location layout.
5258   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5259   NewTL.setLBracketLoc(TL.getLBracketLoc());
5260   NewTL.setRBracketLoc(TL.getRBracketLoc());
5261   NewTL.setSizeExpr(Size);
5262 
5263   return Result;
5264 }
5265 
5266 template<typename Derived>
5267 QualType
5268 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5269                                              DependentSizedArrayTypeLoc TL) {
5270   const DependentSizedArrayType *T = TL.getTypePtr();
5271   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5272   if (ElementType.isNull())
5273     return QualType();
5274 
5275   // Array bounds are constant expressions.
5276   EnterExpressionEvaluationContext Unevaluated(
5277       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5278 
5279   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5280   Expr *origSize = TL.getSizeExpr();
5281   if (!origSize) origSize = T->getSizeExpr();
5282 
5283   ExprResult sizeResult
5284     = getDerived().TransformExpr(origSize);
5285   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5286   if (sizeResult.isInvalid())
5287     return QualType();
5288 
5289   Expr *size = sizeResult.get();
5290 
5291   QualType Result = TL.getType();
5292   if (getDerived().AlwaysRebuild() ||
5293       ElementType != T->getElementType() ||
5294       size != origSize) {
5295     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5296                                                          T->getSizeModifier(),
5297                                                          size,
5298                                                 T->getIndexTypeCVRQualifiers(),
5299                                                         TL.getBracketsRange());
5300     if (Result.isNull())
5301       return QualType();
5302   }
5303 
5304   // We might have any sort of array type now, but fortunately they
5305   // all have the same location layout.
5306   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5307   NewTL.setLBracketLoc(TL.getLBracketLoc());
5308   NewTL.setRBracketLoc(TL.getRBracketLoc());
5309   NewTL.setSizeExpr(size);
5310 
5311   return Result;
5312 }
5313 
5314 template <typename Derived>
5315 QualType TreeTransform<Derived>::TransformDependentVectorType(
5316     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5317   const DependentVectorType *T = TL.getTypePtr();
5318   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5319   if (ElementType.isNull())
5320     return QualType();
5321 
5322   EnterExpressionEvaluationContext Unevaluated(
5323       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5324 
5325   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5326   Size = SemaRef.ActOnConstantExpression(Size);
5327   if (Size.isInvalid())
5328     return QualType();
5329 
5330   QualType Result = TL.getType();
5331   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5332       Size.get() != T->getSizeExpr()) {
5333     Result = getDerived().RebuildDependentVectorType(
5334         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5335     if (Result.isNull())
5336       return QualType();
5337   }
5338 
5339   // Result might be dependent or not.
5340   if (isa<DependentVectorType>(Result)) {
5341     DependentVectorTypeLoc NewTL =
5342         TLB.push<DependentVectorTypeLoc>(Result);
5343     NewTL.setNameLoc(TL.getNameLoc());
5344   } else {
5345     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5346     NewTL.setNameLoc(TL.getNameLoc());
5347   }
5348 
5349   return Result;
5350 }
5351 
5352 template<typename Derived>
5353 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5354                                       TypeLocBuilder &TLB,
5355                                       DependentSizedExtVectorTypeLoc TL) {
5356   const DependentSizedExtVectorType *T = TL.getTypePtr();
5357 
5358   // FIXME: ext vector locs should be nested
5359   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5360   if (ElementType.isNull())
5361     return QualType();
5362 
5363   // Vector sizes are constant expressions.
5364   EnterExpressionEvaluationContext Unevaluated(
5365       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5366 
5367   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5368   Size = SemaRef.ActOnConstantExpression(Size);
5369   if (Size.isInvalid())
5370     return QualType();
5371 
5372   QualType Result = TL.getType();
5373   if (getDerived().AlwaysRebuild() ||
5374       ElementType != T->getElementType() ||
5375       Size.get() != T->getSizeExpr()) {
5376     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5377                                                              Size.get(),
5378                                                          T->getAttributeLoc());
5379     if (Result.isNull())
5380       return QualType();
5381   }
5382 
5383   // Result might be dependent or not.
5384   if (isa<DependentSizedExtVectorType>(Result)) {
5385     DependentSizedExtVectorTypeLoc NewTL
5386       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5387     NewTL.setNameLoc(TL.getNameLoc());
5388   } else {
5389     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5390     NewTL.setNameLoc(TL.getNameLoc());
5391   }
5392 
5393   return Result;
5394 }
5395 
5396 template <typename Derived>
5397 QualType
5398 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5399                                                     ConstantMatrixTypeLoc TL) {
5400   const ConstantMatrixType *T = TL.getTypePtr();
5401   QualType ElementType = getDerived().TransformType(T->getElementType());
5402   if (ElementType.isNull())
5403     return QualType();
5404 
5405   QualType Result = TL.getType();
5406   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5407     Result = getDerived().RebuildConstantMatrixType(
5408         ElementType, T->getNumRows(), T->getNumColumns());
5409     if (Result.isNull())
5410       return QualType();
5411   }
5412 
5413   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5414   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5415   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5416   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5417   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5418 
5419   return Result;
5420 }
5421 
5422 template <typename Derived>
5423 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5424     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5425   const DependentSizedMatrixType *T = TL.getTypePtr();
5426 
5427   QualType ElementType = getDerived().TransformType(T->getElementType());
5428   if (ElementType.isNull()) {
5429     return QualType();
5430   }
5431 
5432   // Matrix dimensions are constant expressions.
5433   EnterExpressionEvaluationContext Unevaluated(
5434       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5435 
5436   Expr *origRows = TL.getAttrRowOperand();
5437   if (!origRows)
5438     origRows = T->getRowExpr();
5439   Expr *origColumns = TL.getAttrColumnOperand();
5440   if (!origColumns)
5441     origColumns = T->getColumnExpr();
5442 
5443   ExprResult rowResult = getDerived().TransformExpr(origRows);
5444   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5445   if (rowResult.isInvalid())
5446     return QualType();
5447 
5448   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5449   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5450   if (columnResult.isInvalid())
5451     return QualType();
5452 
5453   Expr *rows = rowResult.get();
5454   Expr *columns = columnResult.get();
5455 
5456   QualType Result = TL.getType();
5457   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5458       rows != origRows || columns != origColumns) {
5459     Result = getDerived().RebuildDependentSizedMatrixType(
5460         ElementType, rows, columns, T->getAttributeLoc());
5461 
5462     if (Result.isNull())
5463       return QualType();
5464   }
5465 
5466   // We might have any sort of matrix type now, but fortunately they
5467   // all have the same location layout.
5468   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5469   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5470   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5471   NewTL.setAttrRowOperand(rows);
5472   NewTL.setAttrColumnOperand(columns);
5473   return Result;
5474 }
5475 
5476 template <typename Derived>
5477 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5478     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5479   const DependentAddressSpaceType *T = TL.getTypePtr();
5480 
5481   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5482 
5483   if (pointeeType.isNull())
5484     return QualType();
5485 
5486   // Address spaces are constant expressions.
5487   EnterExpressionEvaluationContext Unevaluated(
5488       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5489 
5490   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5491   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5492   if (AddrSpace.isInvalid())
5493     return QualType();
5494 
5495   QualType Result = TL.getType();
5496   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5497       AddrSpace.get() != T->getAddrSpaceExpr()) {
5498     Result = getDerived().RebuildDependentAddressSpaceType(
5499         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5500     if (Result.isNull())
5501       return QualType();
5502   }
5503 
5504   // Result might be dependent or not.
5505   if (isa<DependentAddressSpaceType>(Result)) {
5506     DependentAddressSpaceTypeLoc NewTL =
5507         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5508 
5509     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5510     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5511     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5512 
5513   } else {
5514     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5515         Result, getDerived().getBaseLocation());
5516     TransformType(TLB, DI->getTypeLoc());
5517   }
5518 
5519   return Result;
5520 }
5521 
5522 template <typename Derived>
5523 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5524                                                      VectorTypeLoc TL) {
5525   const VectorType *T = TL.getTypePtr();
5526   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5527   if (ElementType.isNull())
5528     return QualType();
5529 
5530   QualType Result = TL.getType();
5531   if (getDerived().AlwaysRebuild() ||
5532       ElementType != T->getElementType()) {
5533     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5534                                             T->getVectorKind());
5535     if (Result.isNull())
5536       return QualType();
5537   }
5538 
5539   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5540   NewTL.setNameLoc(TL.getNameLoc());
5541 
5542   return Result;
5543 }
5544 
5545 template<typename Derived>
5546 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5547                                                         ExtVectorTypeLoc TL) {
5548   const VectorType *T = TL.getTypePtr();
5549   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5550   if (ElementType.isNull())
5551     return QualType();
5552 
5553   QualType Result = TL.getType();
5554   if (getDerived().AlwaysRebuild() ||
5555       ElementType != T->getElementType()) {
5556     Result = getDerived().RebuildExtVectorType(ElementType,
5557                                                T->getNumElements(),
5558                                                /*FIXME*/ SourceLocation());
5559     if (Result.isNull())
5560       return QualType();
5561   }
5562 
5563   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5564   NewTL.setNameLoc(TL.getNameLoc());
5565 
5566   return Result;
5567 }
5568 
5569 template <typename Derived>
5570 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5571     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5572     bool ExpectParameterPack) {
5573   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5574   TypeSourceInfo *NewDI = nullptr;
5575 
5576   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5577     // If we're substituting into a pack expansion type and we know the
5578     // length we want to expand to, just substitute for the pattern.
5579     TypeLoc OldTL = OldDI->getTypeLoc();
5580     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5581 
5582     TypeLocBuilder TLB;
5583     TypeLoc NewTL = OldDI->getTypeLoc();
5584     TLB.reserve(NewTL.getFullDataSize());
5585 
5586     QualType Result = getDerived().TransformType(TLB,
5587                                                OldExpansionTL.getPatternLoc());
5588     if (Result.isNull())
5589       return nullptr;
5590 
5591     Result = RebuildPackExpansionType(Result,
5592                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5593                                       OldExpansionTL.getEllipsisLoc(),
5594                                       NumExpansions);
5595     if (Result.isNull())
5596       return nullptr;
5597 
5598     PackExpansionTypeLoc NewExpansionTL
5599       = TLB.push<PackExpansionTypeLoc>(Result);
5600     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5601     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5602   } else
5603     NewDI = getDerived().TransformType(OldDI);
5604   if (!NewDI)
5605     return nullptr;
5606 
5607   if (NewDI == OldDI && indexAdjustment == 0)
5608     return OldParm;
5609 
5610   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5611                                              OldParm->getDeclContext(),
5612                                              OldParm->getInnerLocStart(),
5613                                              OldParm->getLocation(),
5614                                              OldParm->getIdentifier(),
5615                                              NewDI->getType(),
5616                                              NewDI,
5617                                              OldParm->getStorageClass(),
5618                                              /* DefArg */ nullptr);
5619   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5620                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5621   transformedLocalDecl(OldParm, {newParm});
5622   return newParm;
5623 }
5624 
5625 template <typename Derived>
5626 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5627     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5628     const QualType *ParamTypes,
5629     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5630     SmallVectorImpl<QualType> &OutParamTypes,
5631     SmallVectorImpl<ParmVarDecl *> *PVars,
5632     Sema::ExtParameterInfoBuilder &PInfos) {
5633   int indexAdjustment = 0;
5634 
5635   unsigned NumParams = Params.size();
5636   for (unsigned i = 0; i != NumParams; ++i) {
5637     if (ParmVarDecl *OldParm = Params[i]) {
5638       assert(OldParm->getFunctionScopeIndex() == i);
5639 
5640       Optional<unsigned> NumExpansions;
5641       ParmVarDecl *NewParm = nullptr;
5642       if (OldParm->isParameterPack()) {
5643         // We have a function parameter pack that may need to be expanded.
5644         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5645 
5646         // Find the parameter packs that could be expanded.
5647         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5648         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5649         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5650         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5651 
5652         // Determine whether we should expand the parameter packs.
5653         bool ShouldExpand = false;
5654         bool RetainExpansion = false;
5655         Optional<unsigned> OrigNumExpansions;
5656         if (Unexpanded.size() > 0) {
5657           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5658           NumExpansions = OrigNumExpansions;
5659           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5660                                                    Pattern.getSourceRange(),
5661                                                    Unexpanded,
5662                                                    ShouldExpand,
5663                                                    RetainExpansion,
5664                                                    NumExpansions)) {
5665             return true;
5666           }
5667         } else {
5668 #ifndef NDEBUG
5669           const AutoType *AT =
5670               Pattern.getType().getTypePtr()->getContainedAutoType();
5671           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5672                  "Could not find parameter packs or undeduced auto type!");
5673 #endif
5674         }
5675 
5676         if (ShouldExpand) {
5677           // Expand the function parameter pack into multiple, separate
5678           // parameters.
5679           getDerived().ExpandingFunctionParameterPack(OldParm);
5680           for (unsigned I = 0; I != *NumExpansions; ++I) {
5681             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5682             ParmVarDecl *NewParm
5683               = getDerived().TransformFunctionTypeParam(OldParm,
5684                                                         indexAdjustment++,
5685                                                         OrigNumExpansions,
5686                                                 /*ExpectParameterPack=*/false);
5687             if (!NewParm)
5688               return true;
5689 
5690             if (ParamInfos)
5691               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5692             OutParamTypes.push_back(NewParm->getType());
5693             if (PVars)
5694               PVars->push_back(NewParm);
5695           }
5696 
5697           // If we're supposed to retain a pack expansion, do so by temporarily
5698           // forgetting the partially-substituted parameter pack.
5699           if (RetainExpansion) {
5700             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5701             ParmVarDecl *NewParm
5702               = getDerived().TransformFunctionTypeParam(OldParm,
5703                                                         indexAdjustment++,
5704                                                         OrigNumExpansions,
5705                                                 /*ExpectParameterPack=*/false);
5706             if (!NewParm)
5707               return true;
5708 
5709             if (ParamInfos)
5710               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5711             OutParamTypes.push_back(NewParm->getType());
5712             if (PVars)
5713               PVars->push_back(NewParm);
5714           }
5715 
5716           // The next parameter should have the same adjustment as the
5717           // last thing we pushed, but we post-incremented indexAdjustment
5718           // on every push.  Also, if we push nothing, the adjustment should
5719           // go down by one.
5720           indexAdjustment--;
5721 
5722           // We're done with the pack expansion.
5723           continue;
5724         }
5725 
5726         // We'll substitute the parameter now without expanding the pack
5727         // expansion.
5728         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5729         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5730                                                           indexAdjustment,
5731                                                           NumExpansions,
5732                                                   /*ExpectParameterPack=*/true);
5733         assert(NewParm->isParameterPack() &&
5734                "Parameter pack no longer a parameter pack after "
5735                "transformation.");
5736       } else {
5737         NewParm = getDerived().TransformFunctionTypeParam(
5738             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5739       }
5740 
5741       if (!NewParm)
5742         return true;
5743 
5744       if (ParamInfos)
5745         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5746       OutParamTypes.push_back(NewParm->getType());
5747       if (PVars)
5748         PVars->push_back(NewParm);
5749       continue;
5750     }
5751 
5752     // Deal with the possibility that we don't have a parameter
5753     // declaration for this parameter.
5754     QualType OldType = ParamTypes[i];
5755     bool IsPackExpansion = false;
5756     Optional<unsigned> NumExpansions;
5757     QualType NewType;
5758     if (const PackExpansionType *Expansion
5759                                        = dyn_cast<PackExpansionType>(OldType)) {
5760       // We have a function parameter pack that may need to be expanded.
5761       QualType Pattern = Expansion->getPattern();
5762       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5763       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5764 
5765       // Determine whether we should expand the parameter packs.
5766       bool ShouldExpand = false;
5767       bool RetainExpansion = false;
5768       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5769                                                Unexpanded,
5770                                                ShouldExpand,
5771                                                RetainExpansion,
5772                                                NumExpansions)) {
5773         return true;
5774       }
5775 
5776       if (ShouldExpand) {
5777         // Expand the function parameter pack into multiple, separate
5778         // parameters.
5779         for (unsigned I = 0; I != *NumExpansions; ++I) {
5780           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5781           QualType NewType = getDerived().TransformType(Pattern);
5782           if (NewType.isNull())
5783             return true;
5784 
5785           if (NewType->containsUnexpandedParameterPack()) {
5786             NewType =
5787                 getSema().getASTContext().getPackExpansionType(NewType, None);
5788 
5789             if (NewType.isNull())
5790               return true;
5791           }
5792 
5793           if (ParamInfos)
5794             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5795           OutParamTypes.push_back(NewType);
5796           if (PVars)
5797             PVars->push_back(nullptr);
5798         }
5799 
5800         // We're done with the pack expansion.
5801         continue;
5802       }
5803 
5804       // If we're supposed to retain a pack expansion, do so by temporarily
5805       // forgetting the partially-substituted parameter pack.
5806       if (RetainExpansion) {
5807         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5808         QualType NewType = getDerived().TransformType(Pattern);
5809         if (NewType.isNull())
5810           return true;
5811 
5812         if (ParamInfos)
5813           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5814         OutParamTypes.push_back(NewType);
5815         if (PVars)
5816           PVars->push_back(nullptr);
5817       }
5818 
5819       // We'll substitute the parameter now without expanding the pack
5820       // expansion.
5821       OldType = Expansion->getPattern();
5822       IsPackExpansion = true;
5823       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5824       NewType = getDerived().TransformType(OldType);
5825     } else {
5826       NewType = getDerived().TransformType(OldType);
5827     }
5828 
5829     if (NewType.isNull())
5830       return true;
5831 
5832     if (IsPackExpansion)
5833       NewType = getSema().Context.getPackExpansionType(NewType,
5834                                                        NumExpansions);
5835 
5836     if (ParamInfos)
5837       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5838     OutParamTypes.push_back(NewType);
5839     if (PVars)
5840       PVars->push_back(nullptr);
5841   }
5842 
5843 #ifndef NDEBUG
5844   if (PVars) {
5845     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5846       if (ParmVarDecl *parm = (*PVars)[i])
5847         assert(parm->getFunctionScopeIndex() == i);
5848   }
5849 #endif
5850 
5851   return false;
5852 }
5853 
5854 template<typename Derived>
5855 QualType
5856 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5857                                                    FunctionProtoTypeLoc TL) {
5858   SmallVector<QualType, 4> ExceptionStorage;
5859   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5860   return getDerived().TransformFunctionProtoType(
5861       TLB, TL, nullptr, Qualifiers(),
5862       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5863         return This->getDerived().TransformExceptionSpec(
5864             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
5865       });
5866 }
5867 
5868 template<typename Derived> template<typename Fn>
5869 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5870     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5871     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5872 
5873   // Transform the parameters and return type.
5874   //
5875   // We are required to instantiate the params and return type in source order.
5876   // When the function has a trailing return type, we instantiate the
5877   // parameters before the return type,  since the return type can then refer
5878   // to the parameters themselves (via decltype, sizeof, etc.).
5879   //
5880   SmallVector<QualType, 4> ParamTypes;
5881   SmallVector<ParmVarDecl*, 4> ParamDecls;
5882   Sema::ExtParameterInfoBuilder ExtParamInfos;
5883   const FunctionProtoType *T = TL.getTypePtr();
5884 
5885   QualType ResultType;
5886 
5887   if (T->hasTrailingReturn()) {
5888     if (getDerived().TransformFunctionTypeParams(
5889             TL.getBeginLoc(), TL.getParams(),
5890             TL.getTypePtr()->param_type_begin(),
5891             T->getExtParameterInfosOrNull(),
5892             ParamTypes, &ParamDecls, ExtParamInfos))
5893       return QualType();
5894 
5895     {
5896       // C++11 [expr.prim.general]p3:
5897       //   If a declaration declares a member function or member function
5898       //   template of a class X, the expression this is a prvalue of type
5899       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5900       //   and the end of the function-definition, member-declarator, or
5901       //   declarator.
5902       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5903 
5904       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5905       if (ResultType.isNull())
5906         return QualType();
5907     }
5908   }
5909   else {
5910     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5911     if (ResultType.isNull())
5912       return QualType();
5913 
5914     if (getDerived().TransformFunctionTypeParams(
5915             TL.getBeginLoc(), TL.getParams(),
5916             TL.getTypePtr()->param_type_begin(),
5917             T->getExtParameterInfosOrNull(),
5918             ParamTypes, &ParamDecls, ExtParamInfos))
5919       return QualType();
5920   }
5921 
5922   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5923 
5924   bool EPIChanged = false;
5925   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5926     return QualType();
5927 
5928   // Handle extended parameter information.
5929   if (auto NewExtParamInfos =
5930         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5931     if (!EPI.ExtParameterInfos ||
5932         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5933           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5934       EPIChanged = true;
5935     }
5936     EPI.ExtParameterInfos = NewExtParamInfos;
5937   } else if (EPI.ExtParameterInfos) {
5938     EPIChanged = true;
5939     EPI.ExtParameterInfos = nullptr;
5940   }
5941 
5942   QualType Result = TL.getType();
5943   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5944       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5945     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5946     if (Result.isNull())
5947       return QualType();
5948   }
5949 
5950   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5951   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5952   NewTL.setLParenLoc(TL.getLParenLoc());
5953   NewTL.setRParenLoc(TL.getRParenLoc());
5954   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5955   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5956   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5957     NewTL.setParam(i, ParamDecls[i]);
5958 
5959   return Result;
5960 }
5961 
5962 template<typename Derived>
5963 bool TreeTransform<Derived>::TransformExceptionSpec(
5964     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5965     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5966   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5967 
5968   // Instantiate a dynamic noexcept expression, if any.
5969   if (isComputedNoexcept(ESI.Type)) {
5970     EnterExpressionEvaluationContext Unevaluated(
5971         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5972     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5973     if (NoexceptExpr.isInvalid())
5974       return true;
5975 
5976     ExceptionSpecificationType EST = ESI.Type;
5977     NoexceptExpr =
5978         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
5979     if (NoexceptExpr.isInvalid())
5980       return true;
5981 
5982     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5983       Changed = true;
5984     ESI.NoexceptExpr = NoexceptExpr.get();
5985     ESI.Type = EST;
5986   }
5987 
5988   if (ESI.Type != EST_Dynamic)
5989     return false;
5990 
5991   // Instantiate a dynamic exception specification's type.
5992   for (QualType T : ESI.Exceptions) {
5993     if (const PackExpansionType *PackExpansion =
5994             T->getAs<PackExpansionType>()) {
5995       Changed = true;
5996 
5997       // We have a pack expansion. Instantiate it.
5998       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5999       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6000                                               Unexpanded);
6001       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6002 
6003       // Determine whether the set of unexpanded parameter packs can and
6004       // should
6005       // be expanded.
6006       bool Expand = false;
6007       bool RetainExpansion = false;
6008       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6009       // FIXME: Track the location of the ellipsis (and track source location
6010       // information for the types in the exception specification in general).
6011       if (getDerived().TryExpandParameterPacks(
6012               Loc, SourceRange(), Unexpanded, Expand,
6013               RetainExpansion, NumExpansions))
6014         return true;
6015 
6016       if (!Expand) {
6017         // We can't expand this pack expansion into separate arguments yet;
6018         // just substitute into the pattern and create a new pack expansion
6019         // type.
6020         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6021         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6022         if (U.isNull())
6023           return true;
6024 
6025         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6026         Exceptions.push_back(U);
6027         continue;
6028       }
6029 
6030       // Substitute into the pack expansion pattern for each slice of the
6031       // pack.
6032       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6033         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6034 
6035         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6036         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6037           return true;
6038 
6039         Exceptions.push_back(U);
6040       }
6041     } else {
6042       QualType U = getDerived().TransformType(T);
6043       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6044         return true;
6045       if (T != U)
6046         Changed = true;
6047 
6048       Exceptions.push_back(U);
6049     }
6050   }
6051 
6052   ESI.Exceptions = Exceptions;
6053   if (ESI.Exceptions.empty())
6054     ESI.Type = EST_DynamicNone;
6055   return false;
6056 }
6057 
6058 template<typename Derived>
6059 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6060                                                  TypeLocBuilder &TLB,
6061                                                  FunctionNoProtoTypeLoc TL) {
6062   const FunctionNoProtoType *T = TL.getTypePtr();
6063   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6064   if (ResultType.isNull())
6065     return QualType();
6066 
6067   QualType Result = TL.getType();
6068   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6069     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6070 
6071   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6072   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6073   NewTL.setLParenLoc(TL.getLParenLoc());
6074   NewTL.setRParenLoc(TL.getRParenLoc());
6075   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6076 
6077   return Result;
6078 }
6079 
6080 template <typename Derived>
6081 QualType TreeTransform<Derived>::TransformUnresolvedUsingType(
6082     TypeLocBuilder &TLB, UnresolvedUsingTypeLoc TL) {
6083   const UnresolvedUsingType *T = TL.getTypePtr();
6084   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6085   if (!D)
6086     return QualType();
6087 
6088   QualType Result = TL.getType();
6089   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6090     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6091     if (Result.isNull())
6092       return QualType();
6093   }
6094 
6095   // We might get an arbitrary type spec type back.  We should at
6096   // least always get a type spec type, though.
6097   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6098   NewTL.setNameLoc(TL.getNameLoc());
6099 
6100   return Result;
6101 }
6102 
6103 template <typename Derived>
6104 QualType TreeTransform<Derived>::TransformUsingType(TypeLocBuilder &TLB,
6105                                                     UsingTypeLoc TL) {
6106   const UsingType *T = TL.getTypePtr();
6107 
6108   auto *Found = cast_or_null<UsingShadowDecl>(getDerived().TransformDecl(
6109       TL.getLocalSourceRange().getBegin(), T->getFoundDecl()));
6110   if (!Found)
6111     return QualType();
6112 
6113   QualType Underlying = getDerived().TransformType(T->desugar());
6114   if (Underlying.isNull())
6115     return QualType();
6116 
6117   QualType Result = TL.getType();
6118   if (getDerived().AlwaysRebuild() || Found != T->getFoundDecl() ||
6119       Underlying != T->getUnderlyingType()) {
6120     Result = getDerived().RebuildUsingType(Found, Underlying);
6121     if (Result.isNull())
6122       return QualType();
6123   }
6124 
6125   TLB.pushTypeSpec(Result).setNameLoc(TL.getNameLoc());
6126   return Result;
6127 }
6128 
6129 template<typename Derived>
6130 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6131                                                       TypedefTypeLoc TL) {
6132   const TypedefType *T = TL.getTypePtr();
6133   TypedefNameDecl *Typedef
6134     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6135                                                                T->getDecl()));
6136   if (!Typedef)
6137     return QualType();
6138 
6139   QualType Result = TL.getType();
6140   if (getDerived().AlwaysRebuild() ||
6141       Typedef != T->getDecl()) {
6142     Result = getDerived().RebuildTypedefType(Typedef);
6143     if (Result.isNull())
6144       return QualType();
6145   }
6146 
6147   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6148   NewTL.setNameLoc(TL.getNameLoc());
6149 
6150   return Result;
6151 }
6152 
6153 template<typename Derived>
6154 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6155                                                       TypeOfExprTypeLoc TL) {
6156   // typeof expressions are not potentially evaluated contexts
6157   EnterExpressionEvaluationContext Unevaluated(
6158       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6159       Sema::ReuseLambdaContextDecl);
6160 
6161   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6162   if (E.isInvalid())
6163     return QualType();
6164 
6165   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6166   if (E.isInvalid())
6167     return QualType();
6168 
6169   QualType Result = TL.getType();
6170   if (getDerived().AlwaysRebuild() ||
6171       E.get() != TL.getUnderlyingExpr()) {
6172     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6173     if (Result.isNull())
6174       return QualType();
6175   }
6176   else E.get();
6177 
6178   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6179   NewTL.setTypeofLoc(TL.getTypeofLoc());
6180   NewTL.setLParenLoc(TL.getLParenLoc());
6181   NewTL.setRParenLoc(TL.getRParenLoc());
6182 
6183   return Result;
6184 }
6185 
6186 template<typename Derived>
6187 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6188                                                      TypeOfTypeLoc TL) {
6189   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6190   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6191   if (!New_Under_TI)
6192     return QualType();
6193 
6194   QualType Result = TL.getType();
6195   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6196     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6197     if (Result.isNull())
6198       return QualType();
6199   }
6200 
6201   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6202   NewTL.setTypeofLoc(TL.getTypeofLoc());
6203   NewTL.setLParenLoc(TL.getLParenLoc());
6204   NewTL.setRParenLoc(TL.getRParenLoc());
6205   NewTL.setUnderlyingTInfo(New_Under_TI);
6206 
6207   return Result;
6208 }
6209 
6210 template<typename Derived>
6211 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6212                                                        DecltypeTypeLoc TL) {
6213   const DecltypeType *T = TL.getTypePtr();
6214 
6215   // decltype expressions are not potentially evaluated contexts
6216   EnterExpressionEvaluationContext Unevaluated(
6217       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6218       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6219 
6220   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6221   if (E.isInvalid())
6222     return QualType();
6223 
6224   E = getSema().ActOnDecltypeExpression(E.get());
6225   if (E.isInvalid())
6226     return QualType();
6227 
6228   QualType Result = TL.getType();
6229   if (getDerived().AlwaysRebuild() ||
6230       E.get() != T->getUnderlyingExpr()) {
6231     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6232     if (Result.isNull())
6233       return QualType();
6234   }
6235   else E.get();
6236 
6237   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6238   NewTL.setNameLoc(TL.getNameLoc());
6239 
6240   return Result;
6241 }
6242 
6243 template<typename Derived>
6244 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6245                                                             TypeLocBuilder &TLB,
6246                                                      UnaryTransformTypeLoc TL) {
6247   QualType Result = TL.getType();
6248   if (Result->isDependentType()) {
6249     const UnaryTransformType *T = TL.getTypePtr();
6250     QualType NewBase =
6251       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6252     Result = getDerived().RebuildUnaryTransformType(NewBase,
6253                                                     T->getUTTKind(),
6254                                                     TL.getKWLoc());
6255     if (Result.isNull())
6256       return QualType();
6257   }
6258 
6259   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6260   NewTL.setKWLoc(TL.getKWLoc());
6261   NewTL.setParensRange(TL.getParensRange());
6262   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6263   return Result;
6264 }
6265 
6266 template<typename Derived>
6267 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6268     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6269   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6270 
6271   CXXScopeSpec SS;
6272   TemplateName TemplateName = getDerived().TransformTemplateName(
6273       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6274   if (TemplateName.isNull())
6275     return QualType();
6276 
6277   QualType OldDeduced = T->getDeducedType();
6278   QualType NewDeduced;
6279   if (!OldDeduced.isNull()) {
6280     NewDeduced = getDerived().TransformType(OldDeduced);
6281     if (NewDeduced.isNull())
6282       return QualType();
6283   }
6284 
6285   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6286       TemplateName, NewDeduced);
6287   if (Result.isNull())
6288     return QualType();
6289 
6290   DeducedTemplateSpecializationTypeLoc NewTL =
6291       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6292   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6293 
6294   return Result;
6295 }
6296 
6297 template<typename Derived>
6298 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6299                                                      RecordTypeLoc TL) {
6300   const RecordType *T = TL.getTypePtr();
6301   RecordDecl *Record
6302     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6303                                                           T->getDecl()));
6304   if (!Record)
6305     return QualType();
6306 
6307   QualType Result = TL.getType();
6308   if (getDerived().AlwaysRebuild() ||
6309       Record != T->getDecl()) {
6310     Result = getDerived().RebuildRecordType(Record);
6311     if (Result.isNull())
6312       return QualType();
6313   }
6314 
6315   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6316   NewTL.setNameLoc(TL.getNameLoc());
6317 
6318   return Result;
6319 }
6320 
6321 template<typename Derived>
6322 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6323                                                    EnumTypeLoc TL) {
6324   const EnumType *T = TL.getTypePtr();
6325   EnumDecl *Enum
6326     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6327                                                         T->getDecl()));
6328   if (!Enum)
6329     return QualType();
6330 
6331   QualType Result = TL.getType();
6332   if (getDerived().AlwaysRebuild() ||
6333       Enum != T->getDecl()) {
6334     Result = getDerived().RebuildEnumType(Enum);
6335     if (Result.isNull())
6336       return QualType();
6337   }
6338 
6339   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6340   NewTL.setNameLoc(TL.getNameLoc());
6341 
6342   return Result;
6343 }
6344 
6345 template<typename Derived>
6346 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6347                                          TypeLocBuilder &TLB,
6348                                          InjectedClassNameTypeLoc TL) {
6349   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6350                                        TL.getTypePtr()->getDecl());
6351   if (!D) return QualType();
6352 
6353   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6354   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6355   return T;
6356 }
6357 
6358 template<typename Derived>
6359 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6360                                                 TypeLocBuilder &TLB,
6361                                                 TemplateTypeParmTypeLoc TL) {
6362   return TransformTypeSpecType(TLB, TL);
6363 }
6364 
6365 template<typename Derived>
6366 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6367                                          TypeLocBuilder &TLB,
6368                                          SubstTemplateTypeParmTypeLoc TL) {
6369   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6370 
6371   // Substitute into the replacement type, which itself might involve something
6372   // that needs to be transformed. This only tends to occur with default
6373   // template arguments of template template parameters.
6374   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6375   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6376   if (Replacement.isNull())
6377     return QualType();
6378 
6379   // Always canonicalize the replacement type.
6380   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6381   QualType Result
6382     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6383                                                    Replacement);
6384 
6385   // Propagate type-source information.
6386   SubstTemplateTypeParmTypeLoc NewTL
6387     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6388   NewTL.setNameLoc(TL.getNameLoc());
6389   return Result;
6390 
6391 }
6392 
6393 template<typename Derived>
6394 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6395                                           TypeLocBuilder &TLB,
6396                                           SubstTemplateTypeParmPackTypeLoc TL) {
6397   return TransformTypeSpecType(TLB, TL);
6398 }
6399 
6400 template<typename Derived>
6401 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6402                                                         TypeLocBuilder &TLB,
6403                                            TemplateSpecializationTypeLoc TL) {
6404   const TemplateSpecializationType *T = TL.getTypePtr();
6405 
6406   // The nested-name-specifier never matters in a TemplateSpecializationType,
6407   // because we can't have a dependent nested-name-specifier anyway.
6408   CXXScopeSpec SS;
6409   TemplateName Template
6410     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6411                                          TL.getTemplateNameLoc());
6412   if (Template.isNull())
6413     return QualType();
6414 
6415   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6416 }
6417 
6418 template<typename Derived>
6419 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6420                                                      AtomicTypeLoc TL) {
6421   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6422   if (ValueType.isNull())
6423     return QualType();
6424 
6425   QualType Result = TL.getType();
6426   if (getDerived().AlwaysRebuild() ||
6427       ValueType != TL.getValueLoc().getType()) {
6428     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6429     if (Result.isNull())
6430       return QualType();
6431   }
6432 
6433   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6434   NewTL.setKWLoc(TL.getKWLoc());
6435   NewTL.setLParenLoc(TL.getLParenLoc());
6436   NewTL.setRParenLoc(TL.getRParenLoc());
6437 
6438   return Result;
6439 }
6440 
6441 template <typename Derived>
6442 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6443                                                    PipeTypeLoc TL) {
6444   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6445   if (ValueType.isNull())
6446     return QualType();
6447 
6448   QualType Result = TL.getType();
6449   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6450     const PipeType *PT = Result->castAs<PipeType>();
6451     bool isReadPipe = PT->isReadOnly();
6452     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6453     if (Result.isNull())
6454       return QualType();
6455   }
6456 
6457   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6458   NewTL.setKWLoc(TL.getKWLoc());
6459 
6460   return Result;
6461 }
6462 
6463 template <typename Derived>
6464 QualType TreeTransform<Derived>::TransformBitIntType(TypeLocBuilder &TLB,
6465                                                      BitIntTypeLoc TL) {
6466   const BitIntType *EIT = TL.getTypePtr();
6467   QualType Result = TL.getType();
6468 
6469   if (getDerived().AlwaysRebuild()) {
6470     Result = getDerived().RebuildBitIntType(EIT->isUnsigned(),
6471                                             EIT->getNumBits(), TL.getNameLoc());
6472     if (Result.isNull())
6473       return QualType();
6474   }
6475 
6476   BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6477   NewTL.setNameLoc(TL.getNameLoc());
6478   return Result;
6479 }
6480 
6481 template <typename Derived>
6482 QualType TreeTransform<Derived>::TransformDependentBitIntType(
6483     TypeLocBuilder &TLB, DependentBitIntTypeLoc TL) {
6484   const DependentBitIntType *EIT = TL.getTypePtr();
6485 
6486   EnterExpressionEvaluationContext Unevaluated(
6487       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6488   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6489   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6490 
6491   if (BitsExpr.isInvalid())
6492     return QualType();
6493 
6494   QualType Result = TL.getType();
6495 
6496   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6497     Result = getDerived().RebuildDependentBitIntType(
6498         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6499 
6500     if (Result.isNull())
6501       return QualType();
6502   }
6503 
6504   if (isa<DependentBitIntType>(Result)) {
6505     DependentBitIntTypeLoc NewTL = TLB.push<DependentBitIntTypeLoc>(Result);
6506     NewTL.setNameLoc(TL.getNameLoc());
6507   } else {
6508     BitIntTypeLoc NewTL = TLB.push<BitIntTypeLoc>(Result);
6509     NewTL.setNameLoc(TL.getNameLoc());
6510   }
6511   return Result;
6512 }
6513 
6514   /// Simple iterator that traverses the template arguments in a
6515   /// container that provides a \c getArgLoc() member function.
6516   ///
6517   /// This iterator is intended to be used with the iterator form of
6518   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6519   template<typename ArgLocContainer>
6520   class TemplateArgumentLocContainerIterator {
6521     ArgLocContainer *Container;
6522     unsigned Index;
6523 
6524   public:
6525     typedef TemplateArgumentLoc value_type;
6526     typedef TemplateArgumentLoc reference;
6527     typedef int difference_type;
6528     typedef std::input_iterator_tag iterator_category;
6529 
6530     class pointer {
6531       TemplateArgumentLoc Arg;
6532 
6533     public:
6534       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6535 
6536       const TemplateArgumentLoc *operator->() const {
6537         return &Arg;
6538       }
6539     };
6540 
6541 
6542     TemplateArgumentLocContainerIterator() {}
6543 
6544     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6545                                  unsigned Index)
6546       : Container(&Container), Index(Index) { }
6547 
6548     TemplateArgumentLocContainerIterator &operator++() {
6549       ++Index;
6550       return *this;
6551     }
6552 
6553     TemplateArgumentLocContainerIterator operator++(int) {
6554       TemplateArgumentLocContainerIterator Old(*this);
6555       ++(*this);
6556       return Old;
6557     }
6558 
6559     TemplateArgumentLoc operator*() const {
6560       return Container->getArgLoc(Index);
6561     }
6562 
6563     pointer operator->() const {
6564       return pointer(Container->getArgLoc(Index));
6565     }
6566 
6567     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6568                            const TemplateArgumentLocContainerIterator &Y) {
6569       return X.Container == Y.Container && X.Index == Y.Index;
6570     }
6571 
6572     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6573                            const TemplateArgumentLocContainerIterator &Y) {
6574       return !(X == Y);
6575     }
6576   };
6577 
6578 template<typename Derived>
6579 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6580                                                    AutoTypeLoc TL) {
6581   const AutoType *T = TL.getTypePtr();
6582   QualType OldDeduced = T->getDeducedType();
6583   QualType NewDeduced;
6584   if (!OldDeduced.isNull()) {
6585     NewDeduced = getDerived().TransformType(OldDeduced);
6586     if (NewDeduced.isNull())
6587       return QualType();
6588   }
6589 
6590   ConceptDecl *NewCD = nullptr;
6591   TemplateArgumentListInfo NewTemplateArgs;
6592   NestedNameSpecifierLoc NewNestedNameSpec;
6593   if (T->isConstrained()) {
6594     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6595         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6596 
6597     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6598     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6599     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6600     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6601                                                 ArgIterator(TL,
6602                                                             TL.getNumArgs()),
6603                                                 NewTemplateArgs))
6604       return QualType();
6605 
6606     if (TL.getNestedNameSpecifierLoc()) {
6607       NewNestedNameSpec
6608         = getDerived().TransformNestedNameSpecifierLoc(
6609             TL.getNestedNameSpecifierLoc());
6610       if (!NewNestedNameSpec)
6611         return QualType();
6612     }
6613   }
6614 
6615   QualType Result = TL.getType();
6616   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6617       T->isDependentType() || T->isConstrained()) {
6618     // FIXME: Maybe don't rebuild if all template arguments are the same.
6619     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6620     NewArgList.reserve(NewTemplateArgs.size());
6621     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6622       NewArgList.push_back(ArgLoc.getArgument());
6623     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6624                                           NewArgList);
6625     if (Result.isNull())
6626       return QualType();
6627   }
6628 
6629   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6630   NewTL.setNameLoc(TL.getNameLoc());
6631   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6632   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6633   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6634   NewTL.setFoundDecl(TL.getFoundDecl());
6635   NewTL.setLAngleLoc(TL.getLAngleLoc());
6636   NewTL.setRAngleLoc(TL.getRAngleLoc());
6637   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6638     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6639 
6640   return Result;
6641 }
6642 
6643 template <typename Derived>
6644 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6645                                                         TypeLocBuilder &TLB,
6646                                            TemplateSpecializationTypeLoc TL,
6647                                                       TemplateName Template) {
6648   TemplateArgumentListInfo NewTemplateArgs;
6649   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6650   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6651   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6652     ArgIterator;
6653   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6654                                               ArgIterator(TL, TL.getNumArgs()),
6655                                               NewTemplateArgs))
6656     return QualType();
6657 
6658   // FIXME: maybe don't rebuild if all the template arguments are the same.
6659 
6660   QualType Result =
6661     getDerived().RebuildTemplateSpecializationType(Template,
6662                                                    TL.getTemplateNameLoc(),
6663                                                    NewTemplateArgs);
6664 
6665   if (!Result.isNull()) {
6666     // Specializations of template template parameters are represented as
6667     // TemplateSpecializationTypes, and substitution of type alias templates
6668     // within a dependent context can transform them into
6669     // DependentTemplateSpecializationTypes.
6670     if (isa<DependentTemplateSpecializationType>(Result)) {
6671       DependentTemplateSpecializationTypeLoc NewTL
6672         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6673       NewTL.setElaboratedKeywordLoc(SourceLocation());
6674       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6675       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6676       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6677       NewTL.setLAngleLoc(TL.getLAngleLoc());
6678       NewTL.setRAngleLoc(TL.getRAngleLoc());
6679       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6680         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6681       return Result;
6682     }
6683 
6684     TemplateSpecializationTypeLoc NewTL
6685       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6686     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6687     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6688     NewTL.setLAngleLoc(TL.getLAngleLoc());
6689     NewTL.setRAngleLoc(TL.getRAngleLoc());
6690     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6691       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6692   }
6693 
6694   return Result;
6695 }
6696 
6697 template <typename Derived>
6698 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6699                                      TypeLocBuilder &TLB,
6700                                      DependentTemplateSpecializationTypeLoc TL,
6701                                      TemplateName Template,
6702                                      CXXScopeSpec &SS) {
6703   TemplateArgumentListInfo NewTemplateArgs;
6704   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6705   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6706   typedef TemplateArgumentLocContainerIterator<
6707             DependentTemplateSpecializationTypeLoc> ArgIterator;
6708   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6709                                               ArgIterator(TL, TL.getNumArgs()),
6710                                               NewTemplateArgs))
6711     return QualType();
6712 
6713   // FIXME: maybe don't rebuild if all the template arguments are the same.
6714 
6715   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6716     QualType Result
6717       = getSema().Context.getDependentTemplateSpecializationType(
6718                                                 TL.getTypePtr()->getKeyword(),
6719                                                          DTN->getQualifier(),
6720                                                          DTN->getIdentifier(),
6721                                                                NewTemplateArgs);
6722 
6723     DependentTemplateSpecializationTypeLoc NewTL
6724       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6725     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6726     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6727     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6728     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6729     NewTL.setLAngleLoc(TL.getLAngleLoc());
6730     NewTL.setRAngleLoc(TL.getRAngleLoc());
6731     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6732       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6733     return Result;
6734   }
6735 
6736   QualType Result
6737     = getDerived().RebuildTemplateSpecializationType(Template,
6738                                                      TL.getTemplateNameLoc(),
6739                                                      NewTemplateArgs);
6740 
6741   if (!Result.isNull()) {
6742     /// FIXME: Wrap this in an elaborated-type-specifier?
6743     TemplateSpecializationTypeLoc NewTL
6744       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6745     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6746     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6747     NewTL.setLAngleLoc(TL.getLAngleLoc());
6748     NewTL.setRAngleLoc(TL.getRAngleLoc());
6749     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6750       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6751   }
6752 
6753   return Result;
6754 }
6755 
6756 template<typename Derived>
6757 QualType
6758 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6759                                                 ElaboratedTypeLoc TL) {
6760   const ElaboratedType *T = TL.getTypePtr();
6761 
6762   NestedNameSpecifierLoc QualifierLoc;
6763   // NOTE: the qualifier in an ElaboratedType is optional.
6764   if (TL.getQualifierLoc()) {
6765     QualifierLoc
6766       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6767     if (!QualifierLoc)
6768       return QualType();
6769   }
6770 
6771   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6772   if (NamedT.isNull())
6773     return QualType();
6774 
6775   // C++0x [dcl.type.elab]p2:
6776   //   If the identifier resolves to a typedef-name or the simple-template-id
6777   //   resolves to an alias template specialization, the
6778   //   elaborated-type-specifier is ill-formed.
6779   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6780     if (const TemplateSpecializationType *TST =
6781           NamedT->getAs<TemplateSpecializationType>()) {
6782       TemplateName Template = TST->getTemplateName();
6783       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6784               Template.getAsTemplateDecl())) {
6785         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6786                      diag::err_tag_reference_non_tag)
6787             << TAT << Sema::NTK_TypeAliasTemplate
6788             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6789         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6790       }
6791     }
6792   }
6793 
6794   QualType Result = TL.getType();
6795   if (getDerived().AlwaysRebuild() ||
6796       QualifierLoc != TL.getQualifierLoc() ||
6797       NamedT != T->getNamedType()) {
6798     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6799                                                 T->getKeyword(),
6800                                                 QualifierLoc, NamedT);
6801     if (Result.isNull())
6802       return QualType();
6803   }
6804 
6805   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6806   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6807   NewTL.setQualifierLoc(QualifierLoc);
6808   return Result;
6809 }
6810 
6811 template<typename Derived>
6812 QualType TreeTransform<Derived>::TransformAttributedType(
6813                                                 TypeLocBuilder &TLB,
6814                                                 AttributedTypeLoc TL) {
6815   const AttributedType *oldType = TL.getTypePtr();
6816   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6817   if (modifiedType.isNull())
6818     return QualType();
6819 
6820   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6821   const Attr *oldAttr = TL.getAttr();
6822   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6823   if (oldAttr && !newAttr)
6824     return QualType();
6825 
6826   QualType result = TL.getType();
6827 
6828   // FIXME: dependent operand expressions?
6829   if (getDerived().AlwaysRebuild() ||
6830       modifiedType != oldType->getModifiedType()) {
6831     // TODO: this is really lame; we should really be rebuilding the
6832     // equivalent type from first principles.
6833     QualType equivalentType
6834       = getDerived().TransformType(oldType->getEquivalentType());
6835     if (equivalentType.isNull())
6836       return QualType();
6837 
6838     // Check whether we can add nullability; it is only represented as
6839     // type sugar, and therefore cannot be diagnosed in any other way.
6840     if (auto nullability = oldType->getImmediateNullability()) {
6841       if (!modifiedType->canHaveNullability()) {
6842         SemaRef.Diag(TL.getAttr()->getLocation(),
6843                      diag::err_nullability_nonpointer)
6844             << DiagNullabilityKind(*nullability, false) << modifiedType;
6845         return QualType();
6846       }
6847     }
6848 
6849     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6850                                                modifiedType,
6851                                                equivalentType);
6852   }
6853 
6854   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6855   newTL.setAttr(newAttr);
6856   return result;
6857 }
6858 
6859 template<typename Derived>
6860 QualType
6861 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6862                                            ParenTypeLoc TL) {
6863   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6864   if (Inner.isNull())
6865     return QualType();
6866 
6867   QualType Result = TL.getType();
6868   if (getDerived().AlwaysRebuild() ||
6869       Inner != TL.getInnerLoc().getType()) {
6870     Result = getDerived().RebuildParenType(Inner);
6871     if (Result.isNull())
6872       return QualType();
6873   }
6874 
6875   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6876   NewTL.setLParenLoc(TL.getLParenLoc());
6877   NewTL.setRParenLoc(TL.getRParenLoc());
6878   return Result;
6879 }
6880 
6881 template <typename Derived>
6882 QualType
6883 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6884                                                     MacroQualifiedTypeLoc TL) {
6885   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6886   if (Inner.isNull())
6887     return QualType();
6888 
6889   QualType Result = TL.getType();
6890   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6891     Result =
6892         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6893     if (Result.isNull())
6894       return QualType();
6895   }
6896 
6897   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6898   NewTL.setExpansionLoc(TL.getExpansionLoc());
6899   return Result;
6900 }
6901 
6902 template<typename Derived>
6903 QualType TreeTransform<Derived>::TransformDependentNameType(
6904     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6905   return TransformDependentNameType(TLB, TL, false);
6906 }
6907 
6908 template<typename Derived>
6909 QualType TreeTransform<Derived>::TransformDependentNameType(
6910     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6911   const DependentNameType *T = TL.getTypePtr();
6912 
6913   NestedNameSpecifierLoc QualifierLoc
6914     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6915   if (!QualifierLoc)
6916     return QualType();
6917 
6918   QualType Result
6919     = getDerived().RebuildDependentNameType(T->getKeyword(),
6920                                             TL.getElaboratedKeywordLoc(),
6921                                             QualifierLoc,
6922                                             T->getIdentifier(),
6923                                             TL.getNameLoc(),
6924                                             DeducedTSTContext);
6925   if (Result.isNull())
6926     return QualType();
6927 
6928   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6929     QualType NamedT = ElabT->getNamedType();
6930     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6931 
6932     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6933     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6934     NewTL.setQualifierLoc(QualifierLoc);
6935   } else {
6936     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6937     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6938     NewTL.setQualifierLoc(QualifierLoc);
6939     NewTL.setNameLoc(TL.getNameLoc());
6940   }
6941   return Result;
6942 }
6943 
6944 template<typename Derived>
6945 QualType TreeTransform<Derived>::
6946           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6947                                  DependentTemplateSpecializationTypeLoc TL) {
6948   NestedNameSpecifierLoc QualifierLoc;
6949   if (TL.getQualifierLoc()) {
6950     QualifierLoc
6951       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6952     if (!QualifierLoc)
6953       return QualType();
6954   }
6955 
6956   return getDerived()
6957            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6958 }
6959 
6960 template<typename Derived>
6961 QualType TreeTransform<Derived>::
6962 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6963                                    DependentTemplateSpecializationTypeLoc TL,
6964                                        NestedNameSpecifierLoc QualifierLoc) {
6965   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6966 
6967   TemplateArgumentListInfo NewTemplateArgs;
6968   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6969   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6970 
6971   typedef TemplateArgumentLocContainerIterator<
6972   DependentTemplateSpecializationTypeLoc> ArgIterator;
6973   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6974                                               ArgIterator(TL, TL.getNumArgs()),
6975                                               NewTemplateArgs))
6976     return QualType();
6977 
6978   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6979       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6980       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6981       /*AllowInjectedClassName*/ false);
6982   if (Result.isNull())
6983     return QualType();
6984 
6985   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6986     QualType NamedT = ElabT->getNamedType();
6987 
6988     // Copy information relevant to the template specialization.
6989     TemplateSpecializationTypeLoc NamedTL
6990       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6991     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6992     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6993     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6994     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6995     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6996       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6997 
6998     // Copy information relevant to the elaborated type.
6999     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
7000     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7001     NewTL.setQualifierLoc(QualifierLoc);
7002   } else if (isa<DependentTemplateSpecializationType>(Result)) {
7003     DependentTemplateSpecializationTypeLoc SpecTL
7004       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
7005     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
7006     SpecTL.setQualifierLoc(QualifierLoc);
7007     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7008     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7009     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7010     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7011     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7012       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7013   } else {
7014     TemplateSpecializationTypeLoc SpecTL
7015       = TLB.push<TemplateSpecializationTypeLoc>(Result);
7016     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
7017     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
7018     SpecTL.setLAngleLoc(TL.getLAngleLoc());
7019     SpecTL.setRAngleLoc(TL.getRAngleLoc());
7020     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
7021       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
7022   }
7023   return Result;
7024 }
7025 
7026 template<typename Derived>
7027 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
7028                                                       PackExpansionTypeLoc TL) {
7029   QualType Pattern
7030     = getDerived().TransformType(TLB, TL.getPatternLoc());
7031   if (Pattern.isNull())
7032     return QualType();
7033 
7034   QualType Result = TL.getType();
7035   if (getDerived().AlwaysRebuild() ||
7036       Pattern != TL.getPatternLoc().getType()) {
7037     Result = getDerived().RebuildPackExpansionType(Pattern,
7038                                            TL.getPatternLoc().getSourceRange(),
7039                                                    TL.getEllipsisLoc(),
7040                                            TL.getTypePtr()->getNumExpansions());
7041     if (Result.isNull())
7042       return QualType();
7043   }
7044 
7045   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7046   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7047   return Result;
7048 }
7049 
7050 template<typename Derived>
7051 QualType
7052 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7053                                                    ObjCInterfaceTypeLoc TL) {
7054   // ObjCInterfaceType is never dependent.
7055   TLB.pushFullCopy(TL);
7056   return TL.getType();
7057 }
7058 
7059 template<typename Derived>
7060 QualType
7061 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7062                                                    ObjCTypeParamTypeLoc TL) {
7063   const ObjCTypeParamType *T = TL.getTypePtr();
7064   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7065       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7066   if (!OTP)
7067     return QualType();
7068 
7069   QualType Result = TL.getType();
7070   if (getDerived().AlwaysRebuild() ||
7071       OTP != T->getDecl()) {
7072     Result = getDerived().RebuildObjCTypeParamType(OTP,
7073                  TL.getProtocolLAngleLoc(),
7074                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7075                                     TL.getNumProtocols()),
7076                  TL.getProtocolLocs(),
7077                  TL.getProtocolRAngleLoc());
7078     if (Result.isNull())
7079       return QualType();
7080   }
7081 
7082   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7083   if (TL.getNumProtocols()) {
7084     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7085     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7086       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7087     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7088   }
7089   return Result;
7090 }
7091 
7092 template<typename Derived>
7093 QualType
7094 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7095                                                 ObjCObjectTypeLoc TL) {
7096   // Transform base type.
7097   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7098   if (BaseType.isNull())
7099     return QualType();
7100 
7101   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7102 
7103   // Transform type arguments.
7104   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7105   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7106     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7107     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7108     QualType TypeArg = TypeArgInfo->getType();
7109     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7110       AnyChanged = true;
7111 
7112       // We have a pack expansion. Instantiate it.
7113       const auto *PackExpansion = PackExpansionLoc.getType()
7114                                     ->castAs<PackExpansionType>();
7115       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7116       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7117                                               Unexpanded);
7118       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7119 
7120       // Determine whether the set of unexpanded parameter packs can
7121       // and should be expanded.
7122       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7123       bool Expand = false;
7124       bool RetainExpansion = false;
7125       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7126       if (getDerived().TryExpandParameterPacks(
7127             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7128             Unexpanded, Expand, RetainExpansion, NumExpansions))
7129         return QualType();
7130 
7131       if (!Expand) {
7132         // We can't expand this pack expansion into separate arguments yet;
7133         // just substitute into the pattern and create a new pack expansion
7134         // type.
7135         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7136 
7137         TypeLocBuilder TypeArgBuilder;
7138         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7139         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7140                                                              PatternLoc);
7141         if (NewPatternType.isNull())
7142           return QualType();
7143 
7144         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7145                                       NewPatternType, NumExpansions);
7146         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7147         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7148         NewTypeArgInfos.push_back(
7149           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7150         continue;
7151       }
7152 
7153       // Substitute into the pack expansion pattern for each slice of the
7154       // pack.
7155       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7156         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7157 
7158         TypeLocBuilder TypeArgBuilder;
7159         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7160 
7161         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7162                                                          PatternLoc);
7163         if (NewTypeArg.isNull())
7164           return QualType();
7165 
7166         NewTypeArgInfos.push_back(
7167           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7168       }
7169 
7170       continue;
7171     }
7172 
7173     TypeLocBuilder TypeArgBuilder;
7174     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7175     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7176     if (NewTypeArg.isNull())
7177       return QualType();
7178 
7179     // If nothing changed, just keep the old TypeSourceInfo.
7180     if (NewTypeArg == TypeArg) {
7181       NewTypeArgInfos.push_back(TypeArgInfo);
7182       continue;
7183     }
7184 
7185     NewTypeArgInfos.push_back(
7186       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7187     AnyChanged = true;
7188   }
7189 
7190   QualType Result = TL.getType();
7191   if (getDerived().AlwaysRebuild() || AnyChanged) {
7192     // Rebuild the type.
7193     Result = getDerived().RebuildObjCObjectType(
7194         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7195         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7196         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7197         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7198 
7199     if (Result.isNull())
7200       return QualType();
7201   }
7202 
7203   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7204   NewT.setHasBaseTypeAsWritten(true);
7205   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7206   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7207     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7208   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7209   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7210   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7211     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7212   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7213   return Result;
7214 }
7215 
7216 template<typename Derived>
7217 QualType
7218 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7219                                                ObjCObjectPointerTypeLoc TL) {
7220   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7221   if (PointeeType.isNull())
7222     return QualType();
7223 
7224   QualType Result = TL.getType();
7225   if (getDerived().AlwaysRebuild() ||
7226       PointeeType != TL.getPointeeLoc().getType()) {
7227     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7228                                                        TL.getStarLoc());
7229     if (Result.isNull())
7230       return QualType();
7231   }
7232 
7233   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7234   NewT.setStarLoc(TL.getStarLoc());
7235   return Result;
7236 }
7237 
7238 //===----------------------------------------------------------------------===//
7239 // Statement transformation
7240 //===----------------------------------------------------------------------===//
7241 template<typename Derived>
7242 StmtResult
7243 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7244   return S;
7245 }
7246 
7247 template<typename Derived>
7248 StmtResult
7249 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7250   return getDerived().TransformCompoundStmt(S, false);
7251 }
7252 
7253 template<typename Derived>
7254 StmtResult
7255 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7256                                               bool IsStmtExpr) {
7257   Sema::CompoundScopeRAII CompoundScope(getSema());
7258 
7259   const Stmt *ExprResult = S->getStmtExprResult();
7260   bool SubStmtInvalid = false;
7261   bool SubStmtChanged = false;
7262   SmallVector<Stmt*, 8> Statements;
7263   for (auto *B : S->body()) {
7264     StmtResult Result = getDerived().TransformStmt(
7265         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7266 
7267     if (Result.isInvalid()) {
7268       // Immediately fail if this was a DeclStmt, since it's very
7269       // likely that this will cause problems for future statements.
7270       if (isa<DeclStmt>(B))
7271         return StmtError();
7272 
7273       // Otherwise, just keep processing substatements and fail later.
7274       SubStmtInvalid = true;
7275       continue;
7276     }
7277 
7278     SubStmtChanged = SubStmtChanged || Result.get() != B;
7279     Statements.push_back(Result.getAs<Stmt>());
7280   }
7281 
7282   if (SubStmtInvalid)
7283     return StmtError();
7284 
7285   if (!getDerived().AlwaysRebuild() &&
7286       !SubStmtChanged)
7287     return S;
7288 
7289   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7290                                           Statements,
7291                                           S->getRBracLoc(),
7292                                           IsStmtExpr);
7293 }
7294 
7295 template<typename Derived>
7296 StmtResult
7297 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7298   ExprResult LHS, RHS;
7299   {
7300     EnterExpressionEvaluationContext Unevaluated(
7301         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7302 
7303     // Transform the left-hand case value.
7304     LHS = getDerived().TransformExpr(S->getLHS());
7305     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7306     if (LHS.isInvalid())
7307       return StmtError();
7308 
7309     // Transform the right-hand case value (for the GNU case-range extension).
7310     RHS = getDerived().TransformExpr(S->getRHS());
7311     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7312     if (RHS.isInvalid())
7313       return StmtError();
7314   }
7315 
7316   // Build the case statement.
7317   // Case statements are always rebuilt so that they will attached to their
7318   // transformed switch statement.
7319   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7320                                                        LHS.get(),
7321                                                        S->getEllipsisLoc(),
7322                                                        RHS.get(),
7323                                                        S->getColonLoc());
7324   if (Case.isInvalid())
7325     return StmtError();
7326 
7327   // Transform the statement following the case
7328   StmtResult SubStmt =
7329       getDerived().TransformStmt(S->getSubStmt());
7330   if (SubStmt.isInvalid())
7331     return StmtError();
7332 
7333   // Attach the body to the case statement
7334   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7335 }
7336 
7337 template <typename Derived>
7338 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7339   // Transform the statement following the default case
7340   StmtResult SubStmt =
7341       getDerived().TransformStmt(S->getSubStmt());
7342   if (SubStmt.isInvalid())
7343     return StmtError();
7344 
7345   // Default statements are always rebuilt
7346   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7347                                          SubStmt.get());
7348 }
7349 
7350 template<typename Derived>
7351 StmtResult
7352 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7353   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7354   if (SubStmt.isInvalid())
7355     return StmtError();
7356 
7357   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7358                                         S->getDecl());
7359   if (!LD)
7360     return StmtError();
7361 
7362   // If we're transforming "in-place" (we're not creating new local
7363   // declarations), assume we're replacing the old label statement
7364   // and clear out the reference to it.
7365   if (LD == S->getDecl())
7366     S->getDecl()->setStmt(nullptr);
7367 
7368   // FIXME: Pass the real colon location in.
7369   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7370                                        cast<LabelDecl>(LD), SourceLocation(),
7371                                        SubStmt.get());
7372 }
7373 
7374 template <typename Derived>
7375 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7376   if (!R)
7377     return R;
7378 
7379   switch (R->getKind()) {
7380 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7381 #define ATTR(X)
7382 #define PRAGMA_SPELLING_ATTR(X)                                                \
7383   case attr::X:                                                                \
7384     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7385 #include "clang/Basic/AttrList.inc"
7386   default:
7387     return R;
7388   }
7389 }
7390 
7391 template <typename Derived>
7392 StmtResult
7393 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7394                                                 StmtDiscardKind SDK) {
7395   bool AttrsChanged = false;
7396   SmallVector<const Attr *, 1> Attrs;
7397 
7398   // Visit attributes and keep track if any are transformed.
7399   for (const auto *I : S->getAttrs()) {
7400     const Attr *R = getDerived().TransformAttr(I);
7401     AttrsChanged |= (I != R);
7402     if (R)
7403       Attrs.push_back(R);
7404   }
7405 
7406   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7407   if (SubStmt.isInvalid())
7408     return StmtError();
7409 
7410   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7411     return S;
7412 
7413   // If transforming the attributes failed for all of the attributes in the
7414   // statement, don't make an AttributedStmt without attributes.
7415   if (Attrs.empty())
7416     return SubStmt;
7417 
7418   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7419                                             SubStmt.get());
7420 }
7421 
7422 template<typename Derived>
7423 StmtResult
7424 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7425   // Transform the initialization statement
7426   StmtResult Init = getDerived().TransformStmt(S->getInit());
7427   if (Init.isInvalid())
7428     return StmtError();
7429 
7430   Sema::ConditionResult Cond;
7431   if (!S->isConsteval()) {
7432     // Transform the condition
7433     Cond = getDerived().TransformCondition(
7434         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7435         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7436                          : Sema::ConditionKind::Boolean);
7437     if (Cond.isInvalid())
7438       return StmtError();
7439   }
7440 
7441   // If this is a constexpr if, determine which arm we should instantiate.
7442   llvm::Optional<bool> ConstexprConditionValue;
7443   if (S->isConstexpr())
7444     ConstexprConditionValue = Cond.getKnownValue();
7445 
7446   // Transform the "then" branch.
7447   StmtResult Then;
7448   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7449     Then = getDerived().TransformStmt(S->getThen());
7450     if (Then.isInvalid())
7451       return StmtError();
7452   } else {
7453     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7454   }
7455 
7456   // Transform the "else" branch.
7457   StmtResult Else;
7458   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7459     Else = getDerived().TransformStmt(S->getElse());
7460     if (Else.isInvalid())
7461       return StmtError();
7462   }
7463 
7464   if (!getDerived().AlwaysRebuild() &&
7465       Init.get() == S->getInit() &&
7466       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7467       Then.get() == S->getThen() &&
7468       Else.get() == S->getElse())
7469     return S;
7470 
7471   return getDerived().RebuildIfStmt(
7472       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7473       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7474 }
7475 
7476 template<typename Derived>
7477 StmtResult
7478 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7479   // Transform the initialization statement
7480   StmtResult Init = getDerived().TransformStmt(S->getInit());
7481   if (Init.isInvalid())
7482     return StmtError();
7483 
7484   // Transform the condition.
7485   Sema::ConditionResult Cond = getDerived().TransformCondition(
7486       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7487       Sema::ConditionKind::Switch);
7488   if (Cond.isInvalid())
7489     return StmtError();
7490 
7491   // Rebuild the switch statement.
7492   StmtResult Switch =
7493       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7494                                           Init.get(), Cond, S->getRParenLoc());
7495   if (Switch.isInvalid())
7496     return StmtError();
7497 
7498   // Transform the body of the switch statement.
7499   StmtResult Body = getDerived().TransformStmt(S->getBody());
7500   if (Body.isInvalid())
7501     return StmtError();
7502 
7503   // Complete the switch statement.
7504   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7505                                             Body.get());
7506 }
7507 
7508 template<typename Derived>
7509 StmtResult
7510 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7511   // Transform the condition
7512   Sema::ConditionResult Cond = getDerived().TransformCondition(
7513       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7514       Sema::ConditionKind::Boolean);
7515   if (Cond.isInvalid())
7516     return StmtError();
7517 
7518   // Transform the body
7519   StmtResult Body = getDerived().TransformStmt(S->getBody());
7520   if (Body.isInvalid())
7521     return StmtError();
7522 
7523   if (!getDerived().AlwaysRebuild() &&
7524       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7525       Body.get() == S->getBody())
7526     return Owned(S);
7527 
7528   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7529                                        Cond, S->getRParenLoc(), Body.get());
7530 }
7531 
7532 template<typename Derived>
7533 StmtResult
7534 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7535   // Transform the body
7536   StmtResult Body = getDerived().TransformStmt(S->getBody());
7537   if (Body.isInvalid())
7538     return StmtError();
7539 
7540   // Transform the condition
7541   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7542   if (Cond.isInvalid())
7543     return StmtError();
7544 
7545   if (!getDerived().AlwaysRebuild() &&
7546       Cond.get() == S->getCond() &&
7547       Body.get() == S->getBody())
7548     return S;
7549 
7550   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7551                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7552                                     S->getRParenLoc());
7553 }
7554 
7555 template<typename Derived>
7556 StmtResult
7557 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7558   if (getSema().getLangOpts().OpenMP)
7559     getSema().startOpenMPLoop();
7560 
7561   // Transform the initialization statement
7562   StmtResult Init = getDerived().TransformStmt(S->getInit());
7563   if (Init.isInvalid())
7564     return StmtError();
7565 
7566   // In OpenMP loop region loop control variable must be captured and be
7567   // private. Perform analysis of first part (if any).
7568   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7569     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7570 
7571   // Transform the condition
7572   Sema::ConditionResult Cond = getDerived().TransformCondition(
7573       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7574       Sema::ConditionKind::Boolean);
7575   if (Cond.isInvalid())
7576     return StmtError();
7577 
7578   // Transform the increment
7579   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7580   if (Inc.isInvalid())
7581     return StmtError();
7582 
7583   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7584   if (S->getInc() && !FullInc.get())
7585     return StmtError();
7586 
7587   // Transform the body
7588   StmtResult Body = getDerived().TransformStmt(S->getBody());
7589   if (Body.isInvalid())
7590     return StmtError();
7591 
7592   if (!getDerived().AlwaysRebuild() &&
7593       Init.get() == S->getInit() &&
7594       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7595       Inc.get() == S->getInc() &&
7596       Body.get() == S->getBody())
7597     return S;
7598 
7599   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7600                                      Init.get(), Cond, FullInc,
7601                                      S->getRParenLoc(), Body.get());
7602 }
7603 
7604 template<typename Derived>
7605 StmtResult
7606 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7607   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7608                                         S->getLabel());
7609   if (!LD)
7610     return StmtError();
7611 
7612   // Goto statements must always be rebuilt, to resolve the label.
7613   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7614                                       cast<LabelDecl>(LD));
7615 }
7616 
7617 template<typename Derived>
7618 StmtResult
7619 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7620   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7621   if (Target.isInvalid())
7622     return StmtError();
7623   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7624 
7625   if (!getDerived().AlwaysRebuild() &&
7626       Target.get() == S->getTarget())
7627     return S;
7628 
7629   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7630                                               Target.get());
7631 }
7632 
7633 template<typename Derived>
7634 StmtResult
7635 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7636   return S;
7637 }
7638 
7639 template<typename Derived>
7640 StmtResult
7641 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7642   return S;
7643 }
7644 
7645 template<typename Derived>
7646 StmtResult
7647 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7648   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7649                                                         /*NotCopyInit*/false);
7650   if (Result.isInvalid())
7651     return StmtError();
7652 
7653   // FIXME: We always rebuild the return statement because there is no way
7654   // to tell whether the return type of the function has changed.
7655   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7656 }
7657 
7658 template<typename Derived>
7659 StmtResult
7660 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7661   bool DeclChanged = false;
7662   SmallVector<Decl *, 4> Decls;
7663   for (auto *D : S->decls()) {
7664     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7665     if (!Transformed)
7666       return StmtError();
7667 
7668     if (Transformed != D)
7669       DeclChanged = true;
7670 
7671     Decls.push_back(Transformed);
7672   }
7673 
7674   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7675     return S;
7676 
7677   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7678 }
7679 
7680 template<typename Derived>
7681 StmtResult
7682 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7683 
7684   SmallVector<Expr*, 8> Constraints;
7685   SmallVector<Expr*, 8> Exprs;
7686   SmallVector<IdentifierInfo *, 4> Names;
7687 
7688   ExprResult AsmString;
7689   SmallVector<Expr*, 8> Clobbers;
7690 
7691   bool ExprsChanged = false;
7692 
7693   // Go through the outputs.
7694   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7695     Names.push_back(S->getOutputIdentifier(I));
7696 
7697     // No need to transform the constraint literal.
7698     Constraints.push_back(S->getOutputConstraintLiteral(I));
7699 
7700     // Transform the output expr.
7701     Expr *OutputExpr = S->getOutputExpr(I);
7702     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7703     if (Result.isInvalid())
7704       return StmtError();
7705 
7706     ExprsChanged |= Result.get() != OutputExpr;
7707 
7708     Exprs.push_back(Result.get());
7709   }
7710 
7711   // Go through the inputs.
7712   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7713     Names.push_back(S->getInputIdentifier(I));
7714 
7715     // No need to transform the constraint literal.
7716     Constraints.push_back(S->getInputConstraintLiteral(I));
7717 
7718     // Transform the input expr.
7719     Expr *InputExpr = S->getInputExpr(I);
7720     ExprResult Result = getDerived().TransformExpr(InputExpr);
7721     if (Result.isInvalid())
7722       return StmtError();
7723 
7724     ExprsChanged |= Result.get() != InputExpr;
7725 
7726     Exprs.push_back(Result.get());
7727   }
7728 
7729   // Go through the Labels.
7730   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7731     Names.push_back(S->getLabelIdentifier(I));
7732 
7733     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7734     if (Result.isInvalid())
7735       return StmtError();
7736     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7737     Exprs.push_back(Result.get());
7738   }
7739   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7740     return S;
7741 
7742   // Go through the clobbers.
7743   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7744     Clobbers.push_back(S->getClobberStringLiteral(I));
7745 
7746   // No need to transform the asm string literal.
7747   AsmString = S->getAsmString();
7748   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7749                                         S->isVolatile(), S->getNumOutputs(),
7750                                         S->getNumInputs(), Names.data(),
7751                                         Constraints, Exprs, AsmString.get(),
7752                                         Clobbers, S->getNumLabels(),
7753                                         S->getRParenLoc());
7754 }
7755 
7756 template<typename Derived>
7757 StmtResult
7758 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7759   ArrayRef<Token> AsmToks =
7760     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7761 
7762   bool HadError = false, HadChange = false;
7763 
7764   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7765   SmallVector<Expr*, 8> TransformedExprs;
7766   TransformedExprs.reserve(SrcExprs.size());
7767   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7768     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7769     if (!Result.isUsable()) {
7770       HadError = true;
7771     } else {
7772       HadChange |= (Result.get() != SrcExprs[i]);
7773       TransformedExprs.push_back(Result.get());
7774     }
7775   }
7776 
7777   if (HadError) return StmtError();
7778   if (!HadChange && !getDerived().AlwaysRebuild())
7779     return Owned(S);
7780 
7781   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7782                                        AsmToks, S->getAsmString(),
7783                                        S->getNumOutputs(), S->getNumInputs(),
7784                                        S->getAllConstraints(), S->getClobbers(),
7785                                        TransformedExprs, S->getEndLoc());
7786 }
7787 
7788 // C++ Coroutines TS
7789 
7790 template<typename Derived>
7791 StmtResult
7792 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7793   auto *ScopeInfo = SemaRef.getCurFunction();
7794   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7795   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7796          ScopeInfo->NeedsCoroutineSuspends &&
7797          ScopeInfo->CoroutineSuspends.first == nullptr &&
7798          ScopeInfo->CoroutineSuspends.second == nullptr &&
7799          "expected clean scope info");
7800 
7801   // Set that we have (possibly-invalid) suspend points before we do anything
7802   // that may fail.
7803   ScopeInfo->setNeedsCoroutineSuspends(false);
7804 
7805   // We re-build the coroutine promise object (and the coroutine parameters its
7806   // type and constructor depend on) based on the types used in our current
7807   // function. We must do so, and set it on the current FunctionScopeInfo,
7808   // before attempting to transform the other parts of the coroutine body
7809   // statement, such as the implicit suspend statements (because those
7810   // statements reference the FunctionScopeInfo::CoroutinePromise).
7811   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7812     return StmtError();
7813   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7814   if (!Promise)
7815     return StmtError();
7816   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7817   ScopeInfo->CoroutinePromise = Promise;
7818 
7819   // Transform the implicit coroutine statements constructed using dependent
7820   // types during the previous parse: initial and final suspensions, the return
7821   // object, and others. We also transform the coroutine function's body.
7822   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7823   if (InitSuspend.isInvalid())
7824     return StmtError();
7825   StmtResult FinalSuspend =
7826       getDerived().TransformStmt(S->getFinalSuspendStmt());
7827   if (FinalSuspend.isInvalid() ||
7828       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7829     return StmtError();
7830   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7831   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7832 
7833   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7834   if (BodyRes.isInvalid())
7835     return StmtError();
7836 
7837   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7838   if (Builder.isInvalid())
7839     return StmtError();
7840 
7841   Expr *ReturnObject = S->getReturnValueInit();
7842   assert(ReturnObject && "the return object is expected to be valid");
7843   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7844                                                      /*NoCopyInit*/ false);
7845   if (Res.isInvalid())
7846     return StmtError();
7847   Builder.ReturnValue = Res.get();
7848 
7849   // If during the previous parse the coroutine still had a dependent promise
7850   // statement, we may need to build some implicit coroutine statements
7851   // (such as exception and fallthrough handlers) for the first time.
7852   if (S->hasDependentPromiseType()) {
7853     // We can only build these statements, however, if the current promise type
7854     // is not dependent.
7855     if (!Promise->getType()->isDependentType()) {
7856       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7857              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7858              "these nodes should not have been built yet");
7859       if (!Builder.buildDependentStatements())
7860         return StmtError();
7861     }
7862   } else {
7863     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7864       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7865       if (Res.isInvalid())
7866         return StmtError();
7867       Builder.OnFallthrough = Res.get();
7868     }
7869 
7870     if (auto *OnException = S->getExceptionHandler()) {
7871       StmtResult Res = getDerived().TransformStmt(OnException);
7872       if (Res.isInvalid())
7873         return StmtError();
7874       Builder.OnException = Res.get();
7875     }
7876 
7877     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7878       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7879       if (Res.isInvalid())
7880         return StmtError();
7881       Builder.ReturnStmtOnAllocFailure = Res.get();
7882     }
7883 
7884     // Transform any additional statements we may have already built
7885     assert(S->getAllocate() && S->getDeallocate() &&
7886            "allocation and deallocation calls must already be built");
7887     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7888     if (AllocRes.isInvalid())
7889       return StmtError();
7890     Builder.Allocate = AllocRes.get();
7891 
7892     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7893     if (DeallocRes.isInvalid())
7894       return StmtError();
7895     Builder.Deallocate = DeallocRes.get();
7896 
7897     assert(S->getResultDecl() && "ResultDecl must already be built");
7898     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7899     if (ResultDecl.isInvalid())
7900       return StmtError();
7901     Builder.ResultDecl = ResultDecl.get();
7902 
7903     if (auto *ReturnStmt = S->getReturnStmt()) {
7904       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7905       if (Res.isInvalid())
7906         return StmtError();
7907       Builder.ReturnStmt = Res.get();
7908     }
7909   }
7910 
7911   return getDerived().RebuildCoroutineBodyStmt(Builder);
7912 }
7913 
7914 template<typename Derived>
7915 StmtResult
7916 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7917   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7918                                                         /*NotCopyInit*/false);
7919   if (Result.isInvalid())
7920     return StmtError();
7921 
7922   // Always rebuild; we don't know if this needs to be injected into a new
7923   // context or if the promise type has changed.
7924   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7925                                           S->isImplicit());
7926 }
7927 
7928 template<typename Derived>
7929 ExprResult
7930 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7931   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7932                                                         /*NotCopyInit*/false);
7933   if (Result.isInvalid())
7934     return ExprError();
7935 
7936   // Always rebuild; we don't know if this needs to be injected into a new
7937   // context or if the promise type has changed.
7938   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7939                                          E->isImplicit());
7940 }
7941 
7942 template <typename Derived>
7943 ExprResult
7944 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7945   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7946                                                         /*NotCopyInit*/ false);
7947   if (OperandResult.isInvalid())
7948     return ExprError();
7949 
7950   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7951           E->getOperatorCoawaitLookup());
7952 
7953   if (LookupResult.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().RebuildDependentCoawaitExpr(
7959       E->getKeywordLoc(), OperandResult.get(),
7960       cast<UnresolvedLookupExpr>(LookupResult.get()));
7961 }
7962 
7963 template<typename Derived>
7964 ExprResult
7965 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7966   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7967                                                         /*NotCopyInit*/false);
7968   if (Result.isInvalid())
7969     return ExprError();
7970 
7971   // Always rebuild; we don't know if this needs to be injected into a new
7972   // context or if the promise type has changed.
7973   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7974 }
7975 
7976 // Objective-C Statements.
7977 
7978 template<typename Derived>
7979 StmtResult
7980 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7981   // Transform the body of the @try.
7982   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7983   if (TryBody.isInvalid())
7984     return StmtError();
7985 
7986   // Transform the @catch statements (if present).
7987   bool AnyCatchChanged = false;
7988   SmallVector<Stmt*, 8> CatchStmts;
7989   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7990     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7991     if (Catch.isInvalid())
7992       return StmtError();
7993     if (Catch.get() != S->getCatchStmt(I))
7994       AnyCatchChanged = true;
7995     CatchStmts.push_back(Catch.get());
7996   }
7997 
7998   // Transform the @finally statement (if present).
7999   StmtResult Finally;
8000   if (S->getFinallyStmt()) {
8001     Finally = getDerived().TransformStmt(S->getFinallyStmt());
8002     if (Finally.isInvalid())
8003       return StmtError();
8004   }
8005 
8006   // If nothing changed, just retain this statement.
8007   if (!getDerived().AlwaysRebuild() &&
8008       TryBody.get() == S->getTryBody() &&
8009       !AnyCatchChanged &&
8010       Finally.get() == S->getFinallyStmt())
8011     return S;
8012 
8013   // Build a new statement.
8014   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
8015                                            CatchStmts, Finally.get());
8016 }
8017 
8018 template<typename Derived>
8019 StmtResult
8020 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
8021   // Transform the @catch parameter, if there is one.
8022   VarDecl *Var = nullptr;
8023   if (VarDecl *FromVar = S->getCatchParamDecl()) {
8024     TypeSourceInfo *TSInfo = nullptr;
8025     if (FromVar->getTypeSourceInfo()) {
8026       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
8027       if (!TSInfo)
8028         return StmtError();
8029     }
8030 
8031     QualType T;
8032     if (TSInfo)
8033       T = TSInfo->getType();
8034     else {
8035       T = getDerived().TransformType(FromVar->getType());
8036       if (T.isNull())
8037         return StmtError();
8038     }
8039 
8040     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
8041     if (!Var)
8042       return StmtError();
8043   }
8044 
8045   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8046   if (Body.isInvalid())
8047     return StmtError();
8048 
8049   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8050                                              S->getRParenLoc(),
8051                                              Var, Body.get());
8052 }
8053 
8054 template<typename Derived>
8055 StmtResult
8056 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8057   // Transform the body.
8058   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8059   if (Body.isInvalid())
8060     return StmtError();
8061 
8062   // If nothing changed, just retain this statement.
8063   if (!getDerived().AlwaysRebuild() &&
8064       Body.get() == S->getFinallyBody())
8065     return S;
8066 
8067   // Build a new statement.
8068   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8069                                                Body.get());
8070 }
8071 
8072 template<typename Derived>
8073 StmtResult
8074 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8075   ExprResult Operand;
8076   if (S->getThrowExpr()) {
8077     Operand = getDerived().TransformExpr(S->getThrowExpr());
8078     if (Operand.isInvalid())
8079       return StmtError();
8080   }
8081 
8082   if (!getDerived().AlwaysRebuild() &&
8083       Operand.get() == S->getThrowExpr())
8084     return S;
8085 
8086   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8087 }
8088 
8089 template<typename Derived>
8090 StmtResult
8091 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8092                                                   ObjCAtSynchronizedStmt *S) {
8093   // Transform the object we are locking.
8094   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8095   if (Object.isInvalid())
8096     return StmtError();
8097   Object =
8098     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8099                                                   Object.get());
8100   if (Object.isInvalid())
8101     return StmtError();
8102 
8103   // Transform the body.
8104   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8105   if (Body.isInvalid())
8106     return StmtError();
8107 
8108   // If nothing change, just retain the current statement.
8109   if (!getDerived().AlwaysRebuild() &&
8110       Object.get() == S->getSynchExpr() &&
8111       Body.get() == S->getSynchBody())
8112     return S;
8113 
8114   // Build a new statement.
8115   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8116                                                     Object.get(), Body.get());
8117 }
8118 
8119 template<typename Derived>
8120 StmtResult
8121 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8122                                               ObjCAutoreleasePoolStmt *S) {
8123   // Transform the body.
8124   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8125   if (Body.isInvalid())
8126     return StmtError();
8127 
8128   // If nothing changed, just retain this statement.
8129   if (!getDerived().AlwaysRebuild() &&
8130       Body.get() == S->getSubStmt())
8131     return S;
8132 
8133   // Build a new statement.
8134   return getDerived().RebuildObjCAutoreleasePoolStmt(
8135                         S->getAtLoc(), Body.get());
8136 }
8137 
8138 template<typename Derived>
8139 StmtResult
8140 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8141                                                   ObjCForCollectionStmt *S) {
8142   // Transform the element statement.
8143   StmtResult Element =
8144       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8145   if (Element.isInvalid())
8146     return StmtError();
8147 
8148   // Transform the collection expression.
8149   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8150   if (Collection.isInvalid())
8151     return StmtError();
8152 
8153   // Transform the body.
8154   StmtResult Body = getDerived().TransformStmt(S->getBody());
8155   if (Body.isInvalid())
8156     return StmtError();
8157 
8158   // If nothing changed, just retain this statement.
8159   if (!getDerived().AlwaysRebuild() &&
8160       Element.get() == S->getElement() &&
8161       Collection.get() == S->getCollection() &&
8162       Body.get() == S->getBody())
8163     return S;
8164 
8165   // Build a new statement.
8166   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8167                                                    Element.get(),
8168                                                    Collection.get(),
8169                                                    S->getRParenLoc(),
8170                                                    Body.get());
8171 }
8172 
8173 template <typename Derived>
8174 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8175   // Transform the exception declaration, if any.
8176   VarDecl *Var = nullptr;
8177   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8178     TypeSourceInfo *T =
8179         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8180     if (!T)
8181       return StmtError();
8182 
8183     Var = getDerived().RebuildExceptionDecl(
8184         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8185         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8186     if (!Var || Var->isInvalidDecl())
8187       return StmtError();
8188   }
8189 
8190   // Transform the actual exception handler.
8191   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8192   if (Handler.isInvalid())
8193     return StmtError();
8194 
8195   if (!getDerived().AlwaysRebuild() && !Var &&
8196       Handler.get() == S->getHandlerBlock())
8197     return S;
8198 
8199   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8200 }
8201 
8202 template <typename Derived>
8203 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8204   // Transform the try block itself.
8205   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8206   if (TryBlock.isInvalid())
8207     return StmtError();
8208 
8209   // Transform the handlers.
8210   bool HandlerChanged = false;
8211   SmallVector<Stmt *, 8> Handlers;
8212   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8213     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8214     if (Handler.isInvalid())
8215       return StmtError();
8216 
8217     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8218     Handlers.push_back(Handler.getAs<Stmt>());
8219   }
8220 
8221   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8222       !HandlerChanged)
8223     return S;
8224 
8225   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8226                                         Handlers);
8227 }
8228 
8229 template<typename Derived>
8230 StmtResult
8231 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8232   StmtResult Init =
8233       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8234   if (Init.isInvalid())
8235     return StmtError();
8236 
8237   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8238   if (Range.isInvalid())
8239     return StmtError();
8240 
8241   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8242   if (Begin.isInvalid())
8243     return StmtError();
8244   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8245   if (End.isInvalid())
8246     return StmtError();
8247 
8248   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8249   if (Cond.isInvalid())
8250     return StmtError();
8251   if (Cond.get())
8252     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8253   if (Cond.isInvalid())
8254     return StmtError();
8255   if (Cond.get())
8256     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8257 
8258   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8259   if (Inc.isInvalid())
8260     return StmtError();
8261   if (Inc.get())
8262     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8263 
8264   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8265   if (LoopVar.isInvalid())
8266     return StmtError();
8267 
8268   StmtResult NewStmt = S;
8269   if (getDerived().AlwaysRebuild() ||
8270       Init.get() != S->getInit() ||
8271       Range.get() != S->getRangeStmt() ||
8272       Begin.get() != S->getBeginStmt() ||
8273       End.get() != S->getEndStmt() ||
8274       Cond.get() != S->getCond() ||
8275       Inc.get() != S->getInc() ||
8276       LoopVar.get() != S->getLoopVarStmt()) {
8277     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8278                                                   S->getCoawaitLoc(), Init.get(),
8279                                                   S->getColonLoc(), Range.get(),
8280                                                   Begin.get(), End.get(),
8281                                                   Cond.get(),
8282                                                   Inc.get(), LoopVar.get(),
8283                                                   S->getRParenLoc());
8284     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8285       // Might not have attached any initializer to the loop variable.
8286       getSema().ActOnInitializerError(
8287           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8288       return StmtError();
8289     }
8290   }
8291 
8292   StmtResult Body = getDerived().TransformStmt(S->getBody());
8293   if (Body.isInvalid())
8294     return StmtError();
8295 
8296   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8297   // it now so we have a new statement to attach the body to.
8298   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8299     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8300                                                   S->getCoawaitLoc(), Init.get(),
8301                                                   S->getColonLoc(), Range.get(),
8302                                                   Begin.get(), End.get(),
8303                                                   Cond.get(),
8304                                                   Inc.get(), LoopVar.get(),
8305                                                   S->getRParenLoc());
8306     if (NewStmt.isInvalid())
8307       return StmtError();
8308   }
8309 
8310   if (NewStmt.get() == S)
8311     return S;
8312 
8313   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8314 }
8315 
8316 template<typename Derived>
8317 StmtResult
8318 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8319                                                     MSDependentExistsStmt *S) {
8320   // Transform the nested-name-specifier, if any.
8321   NestedNameSpecifierLoc QualifierLoc;
8322   if (S->getQualifierLoc()) {
8323     QualifierLoc
8324       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8325     if (!QualifierLoc)
8326       return StmtError();
8327   }
8328 
8329   // Transform the declaration name.
8330   DeclarationNameInfo NameInfo = S->getNameInfo();
8331   if (NameInfo.getName()) {
8332     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8333     if (!NameInfo.getName())
8334       return StmtError();
8335   }
8336 
8337   // Check whether anything changed.
8338   if (!getDerived().AlwaysRebuild() &&
8339       QualifierLoc == S->getQualifierLoc() &&
8340       NameInfo.getName() == S->getNameInfo().getName())
8341     return S;
8342 
8343   // Determine whether this name exists, if we can.
8344   CXXScopeSpec SS;
8345   SS.Adopt(QualifierLoc);
8346   bool Dependent = false;
8347   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8348   case Sema::IER_Exists:
8349     if (S->isIfExists())
8350       break;
8351 
8352     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8353 
8354   case Sema::IER_DoesNotExist:
8355     if (S->isIfNotExists())
8356       break;
8357 
8358     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8359 
8360   case Sema::IER_Dependent:
8361     Dependent = true;
8362     break;
8363 
8364   case Sema::IER_Error:
8365     return StmtError();
8366   }
8367 
8368   // We need to continue with the instantiation, so do so now.
8369   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8370   if (SubStmt.isInvalid())
8371     return StmtError();
8372 
8373   // If we have resolved the name, just transform to the substatement.
8374   if (!Dependent)
8375     return SubStmt;
8376 
8377   // The name is still dependent, so build a dependent expression again.
8378   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8379                                                    S->isIfExists(),
8380                                                    QualifierLoc,
8381                                                    NameInfo,
8382                                                    SubStmt.get());
8383 }
8384 
8385 template<typename Derived>
8386 ExprResult
8387 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8388   NestedNameSpecifierLoc QualifierLoc;
8389   if (E->getQualifierLoc()) {
8390     QualifierLoc
8391     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8392     if (!QualifierLoc)
8393       return ExprError();
8394   }
8395 
8396   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8397     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8398   if (!PD)
8399     return ExprError();
8400 
8401   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8402   if (Base.isInvalid())
8403     return ExprError();
8404 
8405   return new (SemaRef.getASTContext())
8406       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8407                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8408                         QualifierLoc, E->getMemberLoc());
8409 }
8410 
8411 template <typename Derived>
8412 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8413     MSPropertySubscriptExpr *E) {
8414   auto BaseRes = getDerived().TransformExpr(E->getBase());
8415   if (BaseRes.isInvalid())
8416     return ExprError();
8417   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8418   if (IdxRes.isInvalid())
8419     return ExprError();
8420 
8421   if (!getDerived().AlwaysRebuild() &&
8422       BaseRes.get() == E->getBase() &&
8423       IdxRes.get() == E->getIdx())
8424     return E;
8425 
8426   return getDerived().RebuildArraySubscriptExpr(
8427       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8428 }
8429 
8430 template <typename Derived>
8431 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8432   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8433   if (TryBlock.isInvalid())
8434     return StmtError();
8435 
8436   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8437   if (Handler.isInvalid())
8438     return StmtError();
8439 
8440   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8441       Handler.get() == S->getHandler())
8442     return S;
8443 
8444   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8445                                         TryBlock.get(), Handler.get());
8446 }
8447 
8448 template <typename Derived>
8449 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8450   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8451   if (Block.isInvalid())
8452     return StmtError();
8453 
8454   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8455 }
8456 
8457 template <typename Derived>
8458 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8459   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8460   if (FilterExpr.isInvalid())
8461     return StmtError();
8462 
8463   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8464   if (Block.isInvalid())
8465     return StmtError();
8466 
8467   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8468                                            Block.get());
8469 }
8470 
8471 template <typename Derived>
8472 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8473   if (isa<SEHFinallyStmt>(Handler))
8474     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8475   else
8476     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8477 }
8478 
8479 template<typename Derived>
8480 StmtResult
8481 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8482   return S;
8483 }
8484 
8485 //===----------------------------------------------------------------------===//
8486 // OpenMP directive transformation
8487 //===----------------------------------------------------------------------===//
8488 
8489 template <typename Derived>
8490 StmtResult
8491 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8492   // OMPCanonicalLoops are eliminated during transformation, since they will be
8493   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8494   // after transformation.
8495   return getDerived().TransformStmt(L->getLoopStmt());
8496 }
8497 
8498 template <typename Derived>
8499 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8500     OMPExecutableDirective *D) {
8501 
8502   // Transform the clauses
8503   llvm::SmallVector<OMPClause *, 16> TClauses;
8504   ArrayRef<OMPClause *> Clauses = D->clauses();
8505   TClauses.reserve(Clauses.size());
8506   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8507        I != E; ++I) {
8508     if (*I) {
8509       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8510       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8511       getDerived().getSema().EndOpenMPClause();
8512       if (Clause)
8513         TClauses.push_back(Clause);
8514     } else {
8515       TClauses.push_back(nullptr);
8516     }
8517   }
8518   StmtResult AssociatedStmt;
8519   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8520     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8521                                                   /*CurScope=*/nullptr);
8522     StmtResult Body;
8523     {
8524       Sema::CompoundScopeRAII CompoundScope(getSema());
8525       Stmt *CS;
8526       if (D->getDirectiveKind() == OMPD_atomic ||
8527           D->getDirectiveKind() == OMPD_critical ||
8528           D->getDirectiveKind() == OMPD_section ||
8529           D->getDirectiveKind() == OMPD_master)
8530         CS = D->getAssociatedStmt();
8531       else
8532         CS = D->getRawStmt();
8533       Body = getDerived().TransformStmt(CS);
8534       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8535           getSema().getLangOpts().OpenMPIRBuilder)
8536         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8537     }
8538     AssociatedStmt =
8539         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8540     if (AssociatedStmt.isInvalid()) {
8541       return StmtError();
8542     }
8543   }
8544   if (TClauses.size() != Clauses.size()) {
8545     return StmtError();
8546   }
8547 
8548   // Transform directive name for 'omp critical' directive.
8549   DeclarationNameInfo DirName;
8550   if (D->getDirectiveKind() == OMPD_critical) {
8551     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8552     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8553   }
8554   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8555   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8556     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8557   } else if (D->getDirectiveKind() == OMPD_cancel) {
8558     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8559   }
8560 
8561   return getDerived().RebuildOMPExecutableDirective(
8562       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8563       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8564 }
8565 
8566 template <typename Derived>
8567 StmtResult
8568 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8569   // TODO: Fix This
8570   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8571       << getOpenMPDirectiveName(D->getDirectiveKind());
8572   return StmtError();
8573 }
8574 
8575 template <typename Derived>
8576 StmtResult
8577 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8578   DeclarationNameInfo DirName;
8579   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8580                                              D->getBeginLoc());
8581   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8582   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8583   return Res;
8584 }
8585 
8586 template <typename Derived>
8587 StmtResult
8588 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8589   DeclarationNameInfo DirName;
8590   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8591                                              D->getBeginLoc());
8592   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8593   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8594   return Res;
8595 }
8596 
8597 template <typename Derived>
8598 StmtResult
8599 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8600   DeclarationNameInfo DirName;
8601   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8602                                              nullptr, D->getBeginLoc());
8603   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8604   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8605   return Res;
8606 }
8607 
8608 template <typename Derived>
8609 StmtResult
8610 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8611   DeclarationNameInfo DirName;
8612   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8613                                              nullptr, D->getBeginLoc());
8614   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8615   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8616   return Res;
8617 }
8618 
8619 template <typename Derived>
8620 StmtResult
8621 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8622   DeclarationNameInfo DirName;
8623   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8624                                              D->getBeginLoc());
8625   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8626   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8627   return Res;
8628 }
8629 
8630 template <typename Derived>
8631 StmtResult
8632 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8633   DeclarationNameInfo DirName;
8634   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8635                                              D->getBeginLoc());
8636   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8637   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8638   return Res;
8639 }
8640 
8641 template <typename Derived>
8642 StmtResult
8643 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8644   DeclarationNameInfo DirName;
8645   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8646                                              D->getBeginLoc());
8647   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8648   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8649   return Res;
8650 }
8651 
8652 template <typename Derived>
8653 StmtResult
8654 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8655   DeclarationNameInfo DirName;
8656   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8657                                              D->getBeginLoc());
8658   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8659   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8660   return Res;
8661 }
8662 
8663 template <typename Derived>
8664 StmtResult
8665 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8666   DeclarationNameInfo DirName;
8667   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8668                                              D->getBeginLoc());
8669   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8670   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8671   return Res;
8672 }
8673 
8674 template <typename Derived>
8675 StmtResult
8676 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8677   DeclarationNameInfo DirName;
8678   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8679                                              D->getBeginLoc());
8680   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8681   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8682   return Res;
8683 }
8684 
8685 template <typename Derived>
8686 StmtResult
8687 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8688   getDerived().getSema().StartOpenMPDSABlock(
8689       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8690   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8691   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8692   return Res;
8693 }
8694 
8695 template <typename Derived>
8696 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8697     OMPParallelForDirective *D) {
8698   DeclarationNameInfo DirName;
8699   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8700                                              nullptr, D->getBeginLoc());
8701   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8702   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8703   return Res;
8704 }
8705 
8706 template <typename Derived>
8707 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8708     OMPParallelForSimdDirective *D) {
8709   DeclarationNameInfo DirName;
8710   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8711                                              nullptr, D->getBeginLoc());
8712   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8713   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8714   return Res;
8715 }
8716 
8717 template <typename Derived>
8718 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8719     OMPParallelMasterDirective *D) {
8720   DeclarationNameInfo DirName;
8721   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8722                                              nullptr, D->getBeginLoc());
8723   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8724   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8725   return Res;
8726 }
8727 
8728 template <typename Derived>
8729 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8730     OMPParallelSectionsDirective *D) {
8731   DeclarationNameInfo DirName;
8732   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8733                                              nullptr, D->getBeginLoc());
8734   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8735   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8736   return Res;
8737 }
8738 
8739 template <typename Derived>
8740 StmtResult
8741 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8742   DeclarationNameInfo DirName;
8743   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8744                                              D->getBeginLoc());
8745   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8746   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8747   return Res;
8748 }
8749 
8750 template <typename Derived>
8751 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8752     OMPTaskyieldDirective *D) {
8753   DeclarationNameInfo DirName;
8754   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8755                                              D->getBeginLoc());
8756   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8757   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8758   return Res;
8759 }
8760 
8761 template <typename Derived>
8762 StmtResult
8763 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8764   DeclarationNameInfo DirName;
8765   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8766                                              D->getBeginLoc());
8767   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8768   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8769   return Res;
8770 }
8771 
8772 template <typename Derived>
8773 StmtResult
8774 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8775   DeclarationNameInfo DirName;
8776   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8777                                              D->getBeginLoc());
8778   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8779   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8780   return Res;
8781 }
8782 
8783 template <typename Derived>
8784 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8785     OMPTaskgroupDirective *D) {
8786   DeclarationNameInfo DirName;
8787   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8788                                              D->getBeginLoc());
8789   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8790   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8791   return Res;
8792 }
8793 
8794 template <typename Derived>
8795 StmtResult
8796 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8797   DeclarationNameInfo DirName;
8798   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8799                                              D->getBeginLoc());
8800   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8801   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8802   return Res;
8803 }
8804 
8805 template <typename Derived>
8806 StmtResult
8807 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8808   DeclarationNameInfo DirName;
8809   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8810                                              D->getBeginLoc());
8811   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8812   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8813   return Res;
8814 }
8815 
8816 template <typename Derived>
8817 StmtResult
8818 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8819   DeclarationNameInfo DirName;
8820   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8821                                              D->getBeginLoc());
8822   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8823   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8824   return Res;
8825 }
8826 
8827 template <typename Derived>
8828 StmtResult
8829 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8830   DeclarationNameInfo DirName;
8831   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8832                                              D->getBeginLoc());
8833   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8834   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8835   return Res;
8836 }
8837 
8838 template <typename Derived>
8839 StmtResult
8840 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8841   DeclarationNameInfo DirName;
8842   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8843                                              D->getBeginLoc());
8844   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8845   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8846   return Res;
8847 }
8848 
8849 template <typename Derived>
8850 StmtResult
8851 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8852   DeclarationNameInfo DirName;
8853   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8854                                              D->getBeginLoc());
8855   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8856   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8857   return Res;
8858 }
8859 
8860 template <typename Derived>
8861 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8862     OMPTargetDataDirective *D) {
8863   DeclarationNameInfo DirName;
8864   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8865                                              D->getBeginLoc());
8866   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8867   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8868   return Res;
8869 }
8870 
8871 template <typename Derived>
8872 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8873     OMPTargetEnterDataDirective *D) {
8874   DeclarationNameInfo DirName;
8875   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8876                                              nullptr, D->getBeginLoc());
8877   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8878   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8879   return Res;
8880 }
8881 
8882 template <typename Derived>
8883 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8884     OMPTargetExitDataDirective *D) {
8885   DeclarationNameInfo DirName;
8886   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8887                                              nullptr, D->getBeginLoc());
8888   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8889   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8890   return Res;
8891 }
8892 
8893 template <typename Derived>
8894 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8895     OMPTargetParallelDirective *D) {
8896   DeclarationNameInfo DirName;
8897   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8898                                              nullptr, D->getBeginLoc());
8899   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8900   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8901   return Res;
8902 }
8903 
8904 template <typename Derived>
8905 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8906     OMPTargetParallelForDirective *D) {
8907   DeclarationNameInfo DirName;
8908   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8909                                              nullptr, D->getBeginLoc());
8910   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8911   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8912   return Res;
8913 }
8914 
8915 template <typename Derived>
8916 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8917     OMPTargetUpdateDirective *D) {
8918   DeclarationNameInfo DirName;
8919   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8920                                              nullptr, D->getBeginLoc());
8921   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8922   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8923   return Res;
8924 }
8925 
8926 template <typename Derived>
8927 StmtResult
8928 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8929   DeclarationNameInfo DirName;
8930   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8931                                              D->getBeginLoc());
8932   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8933   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8934   return Res;
8935 }
8936 
8937 template <typename Derived>
8938 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8939     OMPCancellationPointDirective *D) {
8940   DeclarationNameInfo DirName;
8941   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8942                                              nullptr, D->getBeginLoc());
8943   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8944   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8945   return Res;
8946 }
8947 
8948 template <typename Derived>
8949 StmtResult
8950 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8951   DeclarationNameInfo DirName;
8952   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8953                                              D->getBeginLoc());
8954   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8955   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8956   return Res;
8957 }
8958 
8959 template <typename Derived>
8960 StmtResult
8961 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8962   DeclarationNameInfo DirName;
8963   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8964                                              D->getBeginLoc());
8965   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8966   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8967   return Res;
8968 }
8969 
8970 template <typename Derived>
8971 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8972     OMPTaskLoopSimdDirective *D) {
8973   DeclarationNameInfo DirName;
8974   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8975                                              nullptr, D->getBeginLoc());
8976   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8977   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8978   return Res;
8979 }
8980 
8981 template <typename Derived>
8982 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8983     OMPMasterTaskLoopDirective *D) {
8984   DeclarationNameInfo DirName;
8985   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8986                                              nullptr, D->getBeginLoc());
8987   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8988   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8989   return Res;
8990 }
8991 
8992 template <typename Derived>
8993 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8994     OMPMasterTaskLoopSimdDirective *D) {
8995   DeclarationNameInfo DirName;
8996   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8997                                              nullptr, D->getBeginLoc());
8998   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8999   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9000   return Res;
9001 }
9002 
9003 template <typename Derived>
9004 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
9005     OMPParallelMasterTaskLoopDirective *D) {
9006   DeclarationNameInfo DirName;
9007   getDerived().getSema().StartOpenMPDSABlock(
9008       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
9009   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9010   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9011   return Res;
9012 }
9013 
9014 template <typename Derived>
9015 StmtResult
9016 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
9017     OMPParallelMasterTaskLoopSimdDirective *D) {
9018   DeclarationNameInfo DirName;
9019   getDerived().getSema().StartOpenMPDSABlock(
9020       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
9021   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9022   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9023   return Res;
9024 }
9025 
9026 template <typename Derived>
9027 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
9028     OMPDistributeDirective *D) {
9029   DeclarationNameInfo DirName;
9030   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
9031                                              D->getBeginLoc());
9032   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9033   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9034   return Res;
9035 }
9036 
9037 template <typename Derived>
9038 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
9039     OMPDistributeParallelForDirective *D) {
9040   DeclarationNameInfo DirName;
9041   getDerived().getSema().StartOpenMPDSABlock(
9042       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9043   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9044   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9045   return Res;
9046 }
9047 
9048 template <typename Derived>
9049 StmtResult
9050 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9051     OMPDistributeParallelForSimdDirective *D) {
9052   DeclarationNameInfo DirName;
9053   getDerived().getSema().StartOpenMPDSABlock(
9054       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9055   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9056   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9057   return Res;
9058 }
9059 
9060 template <typename Derived>
9061 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9062     OMPDistributeSimdDirective *D) {
9063   DeclarationNameInfo DirName;
9064   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9065                                              nullptr, D->getBeginLoc());
9066   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9067   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9068   return Res;
9069 }
9070 
9071 template <typename Derived>
9072 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9073     OMPTargetParallelForSimdDirective *D) {
9074   DeclarationNameInfo DirName;
9075   getDerived().getSema().StartOpenMPDSABlock(
9076       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9077   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9078   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9079   return Res;
9080 }
9081 
9082 template <typename Derived>
9083 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9084     OMPTargetSimdDirective *D) {
9085   DeclarationNameInfo DirName;
9086   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9087                                              D->getBeginLoc());
9088   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9089   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9090   return Res;
9091 }
9092 
9093 template <typename Derived>
9094 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9095     OMPTeamsDistributeDirective *D) {
9096   DeclarationNameInfo DirName;
9097   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9098                                              nullptr, D->getBeginLoc());
9099   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9100   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9101   return Res;
9102 }
9103 
9104 template <typename Derived>
9105 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9106     OMPTeamsDistributeSimdDirective *D) {
9107   DeclarationNameInfo DirName;
9108   getDerived().getSema().StartOpenMPDSABlock(
9109       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9110   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9111   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9112   return Res;
9113 }
9114 
9115 template <typename Derived>
9116 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9117     OMPTeamsDistributeParallelForSimdDirective *D) {
9118   DeclarationNameInfo DirName;
9119   getDerived().getSema().StartOpenMPDSABlock(
9120       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9121       D->getBeginLoc());
9122   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9123   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9124   return Res;
9125 }
9126 
9127 template <typename Derived>
9128 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9129     OMPTeamsDistributeParallelForDirective *D) {
9130   DeclarationNameInfo DirName;
9131   getDerived().getSema().StartOpenMPDSABlock(
9132       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9133   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9134   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9135   return Res;
9136 }
9137 
9138 template <typename Derived>
9139 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9140     OMPTargetTeamsDirective *D) {
9141   DeclarationNameInfo DirName;
9142   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9143                                              nullptr, D->getBeginLoc());
9144   auto Res = getDerived().TransformOMPExecutableDirective(D);
9145   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9146   return Res;
9147 }
9148 
9149 template <typename Derived>
9150 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9151     OMPTargetTeamsDistributeDirective *D) {
9152   DeclarationNameInfo DirName;
9153   getDerived().getSema().StartOpenMPDSABlock(
9154       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9155   auto Res = getDerived().TransformOMPExecutableDirective(D);
9156   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9157   return Res;
9158 }
9159 
9160 template <typename Derived>
9161 StmtResult
9162 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9163     OMPTargetTeamsDistributeParallelForDirective *D) {
9164   DeclarationNameInfo DirName;
9165   getDerived().getSema().StartOpenMPDSABlock(
9166       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9167       D->getBeginLoc());
9168   auto Res = getDerived().TransformOMPExecutableDirective(D);
9169   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9170   return Res;
9171 }
9172 
9173 template <typename Derived>
9174 StmtResult TreeTransform<Derived>::
9175     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9176         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9177   DeclarationNameInfo DirName;
9178   getDerived().getSema().StartOpenMPDSABlock(
9179       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9180       D->getBeginLoc());
9181   auto Res = getDerived().TransformOMPExecutableDirective(D);
9182   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9183   return Res;
9184 }
9185 
9186 template <typename Derived>
9187 StmtResult
9188 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9189     OMPTargetTeamsDistributeSimdDirective *D) {
9190   DeclarationNameInfo DirName;
9191   getDerived().getSema().StartOpenMPDSABlock(
9192       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9193   auto Res = getDerived().TransformOMPExecutableDirective(D);
9194   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9195   return Res;
9196 }
9197 
9198 template <typename Derived>
9199 StmtResult
9200 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9201   DeclarationNameInfo DirName;
9202   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9203                                              D->getBeginLoc());
9204   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9205   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9206   return Res;
9207 }
9208 
9209 template <typename Derived>
9210 StmtResult
9211 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9212   DeclarationNameInfo DirName;
9213   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9214                                              D->getBeginLoc());
9215   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9216   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9217   return Res;
9218 }
9219 
9220 template <typename Derived>
9221 StmtResult
9222 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9223   DeclarationNameInfo DirName;
9224   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9225                                              D->getBeginLoc());
9226   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9227   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9228   return Res;
9229 }
9230 
9231 template <typename Derived>
9232 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9233     OMPGenericLoopDirective *D) {
9234   DeclarationNameInfo DirName;
9235   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9236                                              D->getBeginLoc());
9237   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9238   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9239   return Res;
9240 }
9241 
9242 //===----------------------------------------------------------------------===//
9243 // OpenMP clause transformation
9244 //===----------------------------------------------------------------------===//
9245 template <typename Derived>
9246 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9247   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9248   if (Cond.isInvalid())
9249     return nullptr;
9250   return getDerived().RebuildOMPIfClause(
9251       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9252       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9253 }
9254 
9255 template <typename Derived>
9256 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9257   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9258   if (Cond.isInvalid())
9259     return nullptr;
9260   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9261                                             C->getLParenLoc(), C->getEndLoc());
9262 }
9263 
9264 template <typename Derived>
9265 OMPClause *
9266 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9267   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9268   if (NumThreads.isInvalid())
9269     return nullptr;
9270   return getDerived().RebuildOMPNumThreadsClause(
9271       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9272 }
9273 
9274 template <typename Derived>
9275 OMPClause *
9276 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9277   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9278   if (E.isInvalid())
9279     return nullptr;
9280   return getDerived().RebuildOMPSafelenClause(
9281       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9282 }
9283 
9284 template <typename Derived>
9285 OMPClause *
9286 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9287   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9288   if (E.isInvalid())
9289     return nullptr;
9290   return getDerived().RebuildOMPAllocatorClause(
9291       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9292 }
9293 
9294 template <typename Derived>
9295 OMPClause *
9296 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9297   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9298   if (E.isInvalid())
9299     return nullptr;
9300   return getDerived().RebuildOMPSimdlenClause(
9301       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9302 }
9303 
9304 template <typename Derived>
9305 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9306   SmallVector<Expr *, 4> TransformedSizes;
9307   TransformedSizes.reserve(C->getNumSizes());
9308   bool Changed = false;
9309   for (Expr *E : C->getSizesRefs()) {
9310     if (!E) {
9311       TransformedSizes.push_back(nullptr);
9312       continue;
9313     }
9314 
9315     ExprResult T = getDerived().TransformExpr(E);
9316     if (T.isInvalid())
9317       return nullptr;
9318     if (E != T.get())
9319       Changed = true;
9320     TransformedSizes.push_back(T.get());
9321   }
9322 
9323   if (!Changed && !getDerived().AlwaysRebuild())
9324     return C;
9325   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9326                                C->getLParenLoc(), C->getEndLoc());
9327 }
9328 
9329 template <typename Derived>
9330 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9331   if (!getDerived().AlwaysRebuild())
9332     return C;
9333   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9334 }
9335 
9336 template <typename Derived>
9337 OMPClause *
9338 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9339   ExprResult T = getDerived().TransformExpr(C->getFactor());
9340   if (T.isInvalid())
9341     return nullptr;
9342   Expr *Factor = T.get();
9343   bool Changed = Factor != C->getFactor();
9344 
9345   if (!Changed && !getDerived().AlwaysRebuild())
9346     return C;
9347   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9348                                  C->getEndLoc());
9349 }
9350 
9351 template <typename Derived>
9352 OMPClause *
9353 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9354   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9355   if (E.isInvalid())
9356     return nullptr;
9357   return getDerived().RebuildOMPCollapseClause(
9358       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9359 }
9360 
9361 template <typename Derived>
9362 OMPClause *
9363 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9364   return getDerived().RebuildOMPDefaultClause(
9365       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9366       C->getLParenLoc(), C->getEndLoc());
9367 }
9368 
9369 template <typename Derived>
9370 OMPClause *
9371 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9372   return getDerived().RebuildOMPProcBindClause(
9373       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9374       C->getLParenLoc(), C->getEndLoc());
9375 }
9376 
9377 template <typename Derived>
9378 OMPClause *
9379 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9380   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9381   if (E.isInvalid())
9382     return nullptr;
9383   return getDerived().RebuildOMPScheduleClause(
9384       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9385       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9386       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9387       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9388 }
9389 
9390 template <typename Derived>
9391 OMPClause *
9392 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9393   ExprResult E;
9394   if (auto *Num = C->getNumForLoops()) {
9395     E = getDerived().TransformExpr(Num);
9396     if (E.isInvalid())
9397       return nullptr;
9398   }
9399   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9400                                               C->getLParenLoc(), E.get());
9401 }
9402 
9403 template <typename Derived>
9404 OMPClause *
9405 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9406   ExprResult E;
9407   if (Expr *Evt = C->getEventHandler()) {
9408     E = getDerived().TransformExpr(Evt);
9409     if (E.isInvalid())
9410       return nullptr;
9411   }
9412   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9413                                              C->getLParenLoc(), C->getEndLoc());
9414 }
9415 
9416 template <typename Derived>
9417 OMPClause *
9418 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9419   // No need to rebuild this clause, no template-dependent parameters.
9420   return C;
9421 }
9422 
9423 template <typename Derived>
9424 OMPClause *
9425 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9426   // No need to rebuild this clause, no template-dependent parameters.
9427   return C;
9428 }
9429 
9430 template <typename Derived>
9431 OMPClause *
9432 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9433   // No need to rebuild this clause, no template-dependent parameters.
9434   return C;
9435 }
9436 
9437 template <typename Derived>
9438 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9439   // No need to rebuild this clause, no template-dependent parameters.
9440   return C;
9441 }
9442 
9443 template <typename Derived>
9444 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9445   // No need to rebuild this clause, no template-dependent parameters.
9446   return C;
9447 }
9448 
9449 template <typename Derived>
9450 OMPClause *
9451 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9452   // No need to rebuild this clause, no template-dependent parameters.
9453   return C;
9454 }
9455 
9456 template <typename Derived>
9457 OMPClause *
9458 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9459   // No need to rebuild this clause, no template-dependent parameters.
9460   return C;
9461 }
9462 
9463 template <typename Derived>
9464 OMPClause *
9465 TreeTransform<Derived>::TransformOMPCompareClause(OMPCompareClause *C) {
9466   // No need to rebuild this clause, no template-dependent parameters.
9467   return C;
9468 }
9469 
9470 template <typename Derived>
9471 OMPClause *
9472 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9473   // No need to rebuild this clause, no template-dependent parameters.
9474   return C;
9475 }
9476 
9477 template <typename Derived>
9478 OMPClause *
9479 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9480   // No need to rebuild this clause, no template-dependent parameters.
9481   return C;
9482 }
9483 
9484 template <typename Derived>
9485 OMPClause *
9486 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9487   // No need to rebuild this clause, no template-dependent parameters.
9488   return C;
9489 }
9490 
9491 template <typename Derived>
9492 OMPClause *
9493 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9494   // No need to rebuild this clause, no template-dependent parameters.
9495   return C;
9496 }
9497 
9498 template <typename Derived>
9499 OMPClause *
9500 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9501   // No need to rebuild this clause, no template-dependent parameters.
9502   return C;
9503 }
9504 
9505 template <typename Derived>
9506 OMPClause *
9507 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9508   // No need to rebuild this clause, no template-dependent parameters.
9509   return C;
9510 }
9511 
9512 template <typename Derived>
9513 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9514   // No need to rebuild this clause, no template-dependent parameters.
9515   return C;
9516 }
9517 
9518 template <typename Derived>
9519 OMPClause *
9520 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9521   // No need to rebuild this clause, no template-dependent parameters.
9522   return C;
9523 }
9524 
9525 template <typename Derived>
9526 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9527   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9528   if (IVR.isInvalid())
9529     return nullptr;
9530 
9531   llvm::SmallVector<Expr *, 8> PrefExprs;
9532   PrefExprs.reserve(C->varlist_size() - 1);
9533   for (Expr *E : llvm::drop_begin(C->varlists())) {
9534     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9535     if (ER.isInvalid())
9536       return nullptr;
9537     PrefExprs.push_back(ER.get());
9538   }
9539   return getDerived().RebuildOMPInitClause(
9540       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9541       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9542 }
9543 
9544 template <typename Derived>
9545 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9546   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9547   if (ER.isInvalid())
9548     return nullptr;
9549   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9550                                           C->getLParenLoc(), C->getVarLoc(),
9551                                           C->getEndLoc());
9552 }
9553 
9554 template <typename Derived>
9555 OMPClause *
9556 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9557   ExprResult ER;
9558   if (Expr *IV = C->getInteropVar()) {
9559     ER = getDerived().TransformExpr(IV);
9560     if (ER.isInvalid())
9561       return nullptr;
9562   }
9563   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9564                                               C->getLParenLoc(), C->getVarLoc(),
9565                                               C->getEndLoc());
9566 }
9567 
9568 template <typename Derived>
9569 OMPClause *
9570 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9571   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9572   if (Cond.isInvalid())
9573     return nullptr;
9574   return getDerived().RebuildOMPNovariantsClause(
9575       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9576 }
9577 
9578 template <typename Derived>
9579 OMPClause *
9580 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9581   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9582   if (Cond.isInvalid())
9583     return nullptr;
9584   return getDerived().RebuildOMPNocontextClause(
9585       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9586 }
9587 
9588 template <typename Derived>
9589 OMPClause *
9590 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9591   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9592   if (ThreadID.isInvalid())
9593     return nullptr;
9594   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9595                                              C->getLParenLoc(), C->getEndLoc());
9596 }
9597 
9598 template <typename Derived>
9599 OMPClause *TreeTransform<Derived>::TransformOMPAlignClause(OMPAlignClause *C) {
9600   ExprResult E = getDerived().TransformExpr(C->getAlignment());
9601   if (E.isInvalid())
9602     return nullptr;
9603   return getDerived().RebuildOMPAlignClause(E.get(), C->getBeginLoc(),
9604                                             C->getLParenLoc(), C->getEndLoc());
9605 }
9606 
9607 template <typename Derived>
9608 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9609     OMPUnifiedAddressClause *C) {
9610   llvm_unreachable("unified_address clause cannot appear in dependent context");
9611 }
9612 
9613 template <typename Derived>
9614 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9615     OMPUnifiedSharedMemoryClause *C) {
9616   llvm_unreachable(
9617       "unified_shared_memory clause cannot appear in dependent context");
9618 }
9619 
9620 template <typename Derived>
9621 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9622     OMPReverseOffloadClause *C) {
9623   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9624 }
9625 
9626 template <typename Derived>
9627 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9628     OMPDynamicAllocatorsClause *C) {
9629   llvm_unreachable(
9630       "dynamic_allocators clause cannot appear in dependent context");
9631 }
9632 
9633 template <typename Derived>
9634 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9635     OMPAtomicDefaultMemOrderClause *C) {
9636   llvm_unreachable(
9637       "atomic_default_mem_order clause cannot appear in dependent context");
9638 }
9639 
9640 template <typename Derived>
9641 OMPClause *
9642 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9643   llvm::SmallVector<Expr *, 16> Vars;
9644   Vars.reserve(C->varlist_size());
9645   for (auto *VE : C->varlists()) {
9646     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9647     if (EVar.isInvalid())
9648       return nullptr;
9649     Vars.push_back(EVar.get());
9650   }
9651   return getDerived().RebuildOMPPrivateClause(
9652       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9653 }
9654 
9655 template <typename Derived>
9656 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9657     OMPFirstprivateClause *C) {
9658   llvm::SmallVector<Expr *, 16> Vars;
9659   Vars.reserve(C->varlist_size());
9660   for (auto *VE : C->varlists()) {
9661     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9662     if (EVar.isInvalid())
9663       return nullptr;
9664     Vars.push_back(EVar.get());
9665   }
9666   return getDerived().RebuildOMPFirstprivateClause(
9667       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9668 }
9669 
9670 template <typename Derived>
9671 OMPClause *
9672 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9673   llvm::SmallVector<Expr *, 16> Vars;
9674   Vars.reserve(C->varlist_size());
9675   for (auto *VE : C->varlists()) {
9676     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9677     if (EVar.isInvalid())
9678       return nullptr;
9679     Vars.push_back(EVar.get());
9680   }
9681   return getDerived().RebuildOMPLastprivateClause(
9682       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9683       C->getLParenLoc(), C->getEndLoc());
9684 }
9685 
9686 template <typename Derived>
9687 OMPClause *
9688 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9689   llvm::SmallVector<Expr *, 16> Vars;
9690   Vars.reserve(C->varlist_size());
9691   for (auto *VE : C->varlists()) {
9692     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9693     if (EVar.isInvalid())
9694       return nullptr;
9695     Vars.push_back(EVar.get());
9696   }
9697   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9698                                              C->getLParenLoc(), C->getEndLoc());
9699 }
9700 
9701 template <typename Derived>
9702 OMPClause *
9703 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9704   llvm::SmallVector<Expr *, 16> Vars;
9705   Vars.reserve(C->varlist_size());
9706   for (auto *VE : C->varlists()) {
9707     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9708     if (EVar.isInvalid())
9709       return nullptr;
9710     Vars.push_back(EVar.get());
9711   }
9712   CXXScopeSpec ReductionIdScopeSpec;
9713   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9714 
9715   DeclarationNameInfo NameInfo = C->getNameInfo();
9716   if (NameInfo.getName()) {
9717     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9718     if (!NameInfo.getName())
9719       return nullptr;
9720   }
9721   // Build a list of all UDR decls with the same names ranged by the Scopes.
9722   // The Scope boundary is a duplication of the previous decl.
9723   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9724   for (auto *E : C->reduction_ops()) {
9725     // Transform all the decls.
9726     if (E) {
9727       auto *ULE = cast<UnresolvedLookupExpr>(E);
9728       UnresolvedSet<8> Decls;
9729       for (auto *D : ULE->decls()) {
9730         NamedDecl *InstD =
9731             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9732         Decls.addDecl(InstD, InstD->getAccess());
9733       }
9734       UnresolvedReductions.push_back(
9735        UnresolvedLookupExpr::Create(
9736           SemaRef.Context, /*NamingClass=*/nullptr,
9737           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9738           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9739           Decls.begin(), Decls.end()));
9740     } else
9741       UnresolvedReductions.push_back(nullptr);
9742   }
9743   return getDerived().RebuildOMPReductionClause(
9744       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9745       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9746       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9747 }
9748 
9749 template <typename Derived>
9750 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9751     OMPTaskReductionClause *C) {
9752   llvm::SmallVector<Expr *, 16> Vars;
9753   Vars.reserve(C->varlist_size());
9754   for (auto *VE : C->varlists()) {
9755     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9756     if (EVar.isInvalid())
9757       return nullptr;
9758     Vars.push_back(EVar.get());
9759   }
9760   CXXScopeSpec ReductionIdScopeSpec;
9761   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9762 
9763   DeclarationNameInfo NameInfo = C->getNameInfo();
9764   if (NameInfo.getName()) {
9765     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9766     if (!NameInfo.getName())
9767       return nullptr;
9768   }
9769   // Build a list of all UDR decls with the same names ranged by the Scopes.
9770   // The Scope boundary is a duplication of the previous decl.
9771   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9772   for (auto *E : C->reduction_ops()) {
9773     // Transform all the decls.
9774     if (E) {
9775       auto *ULE = cast<UnresolvedLookupExpr>(E);
9776       UnresolvedSet<8> Decls;
9777       for (auto *D : ULE->decls()) {
9778         NamedDecl *InstD =
9779             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9780         Decls.addDecl(InstD, InstD->getAccess());
9781       }
9782       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9783           SemaRef.Context, /*NamingClass=*/nullptr,
9784           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9785           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9786     } else
9787       UnresolvedReductions.push_back(nullptr);
9788   }
9789   return getDerived().RebuildOMPTaskReductionClause(
9790       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9791       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9792 }
9793 
9794 template <typename Derived>
9795 OMPClause *
9796 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9797   llvm::SmallVector<Expr *, 16> Vars;
9798   Vars.reserve(C->varlist_size());
9799   for (auto *VE : C->varlists()) {
9800     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9801     if (EVar.isInvalid())
9802       return nullptr;
9803     Vars.push_back(EVar.get());
9804   }
9805   CXXScopeSpec ReductionIdScopeSpec;
9806   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9807 
9808   DeclarationNameInfo NameInfo = C->getNameInfo();
9809   if (NameInfo.getName()) {
9810     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9811     if (!NameInfo.getName())
9812       return nullptr;
9813   }
9814   // Build a list of all UDR decls with the same names ranged by the Scopes.
9815   // The Scope boundary is a duplication of the previous decl.
9816   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9817   for (auto *E : C->reduction_ops()) {
9818     // Transform all the decls.
9819     if (E) {
9820       auto *ULE = cast<UnresolvedLookupExpr>(E);
9821       UnresolvedSet<8> Decls;
9822       for (auto *D : ULE->decls()) {
9823         NamedDecl *InstD =
9824             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9825         Decls.addDecl(InstD, InstD->getAccess());
9826       }
9827       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9828           SemaRef.Context, /*NamingClass=*/nullptr,
9829           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9830           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9831     } else
9832       UnresolvedReductions.push_back(nullptr);
9833   }
9834   return getDerived().RebuildOMPInReductionClause(
9835       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9836       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9837 }
9838 
9839 template <typename Derived>
9840 OMPClause *
9841 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9842   llvm::SmallVector<Expr *, 16> Vars;
9843   Vars.reserve(C->varlist_size());
9844   for (auto *VE : C->varlists()) {
9845     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9846     if (EVar.isInvalid())
9847       return nullptr;
9848     Vars.push_back(EVar.get());
9849   }
9850   ExprResult Step = getDerived().TransformExpr(C->getStep());
9851   if (Step.isInvalid())
9852     return nullptr;
9853   return getDerived().RebuildOMPLinearClause(
9854       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9855       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9856 }
9857 
9858 template <typename Derived>
9859 OMPClause *
9860 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9861   llvm::SmallVector<Expr *, 16> Vars;
9862   Vars.reserve(C->varlist_size());
9863   for (auto *VE : C->varlists()) {
9864     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9865     if (EVar.isInvalid())
9866       return nullptr;
9867     Vars.push_back(EVar.get());
9868   }
9869   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9870   if (Alignment.isInvalid())
9871     return nullptr;
9872   return getDerived().RebuildOMPAlignedClause(
9873       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9874       C->getColonLoc(), C->getEndLoc());
9875 }
9876 
9877 template <typename Derived>
9878 OMPClause *
9879 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9880   llvm::SmallVector<Expr *, 16> Vars;
9881   Vars.reserve(C->varlist_size());
9882   for (auto *VE : C->varlists()) {
9883     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9884     if (EVar.isInvalid())
9885       return nullptr;
9886     Vars.push_back(EVar.get());
9887   }
9888   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9889                                              C->getLParenLoc(), C->getEndLoc());
9890 }
9891 
9892 template <typename Derived>
9893 OMPClause *
9894 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9895   llvm::SmallVector<Expr *, 16> Vars;
9896   Vars.reserve(C->varlist_size());
9897   for (auto *VE : C->varlists()) {
9898     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9899     if (EVar.isInvalid())
9900       return nullptr;
9901     Vars.push_back(EVar.get());
9902   }
9903   return getDerived().RebuildOMPCopyprivateClause(
9904       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9905 }
9906 
9907 template <typename Derived>
9908 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9909   llvm::SmallVector<Expr *, 16> Vars;
9910   Vars.reserve(C->varlist_size());
9911   for (auto *VE : C->varlists()) {
9912     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9913     if (EVar.isInvalid())
9914       return nullptr;
9915     Vars.push_back(EVar.get());
9916   }
9917   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9918                                             C->getLParenLoc(), C->getEndLoc());
9919 }
9920 
9921 template <typename Derived>
9922 OMPClause *
9923 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9924   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9925   if (E.isInvalid())
9926     return nullptr;
9927   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9928                                              C->getLParenLoc(), C->getEndLoc());
9929 }
9930 
9931 template <typename Derived>
9932 OMPClause *
9933 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9934   llvm::SmallVector<Expr *, 16> Vars;
9935   Expr *DepModifier = C->getModifier();
9936   if (DepModifier) {
9937     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9938     if (DepModRes.isInvalid())
9939       return nullptr;
9940     DepModifier = DepModRes.get();
9941   }
9942   Vars.reserve(C->varlist_size());
9943   for (auto *VE : C->varlists()) {
9944     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9945     if (EVar.isInvalid())
9946       return nullptr;
9947     Vars.push_back(EVar.get());
9948   }
9949   return getDerived().RebuildOMPDependClause(
9950       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9951       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9952       C->getEndLoc());
9953 }
9954 
9955 template <typename Derived>
9956 OMPClause *
9957 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9958   ExprResult E = getDerived().TransformExpr(C->getDevice());
9959   if (E.isInvalid())
9960     return nullptr;
9961   return getDerived().RebuildOMPDeviceClause(
9962       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9963       C->getModifierLoc(), C->getEndLoc());
9964 }
9965 
9966 template <typename Derived, class T>
9967 bool transformOMPMappableExprListClause(
9968     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9969     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9970     DeclarationNameInfo &MapperIdInfo,
9971     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9972   // Transform expressions in the list.
9973   Vars.reserve(C->varlist_size());
9974   for (auto *VE : C->varlists()) {
9975     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9976     if (EVar.isInvalid())
9977       return true;
9978     Vars.push_back(EVar.get());
9979   }
9980   // Transform mapper scope specifier and identifier.
9981   NestedNameSpecifierLoc QualifierLoc;
9982   if (C->getMapperQualifierLoc()) {
9983     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9984         C->getMapperQualifierLoc());
9985     if (!QualifierLoc)
9986       return true;
9987   }
9988   MapperIdScopeSpec.Adopt(QualifierLoc);
9989   MapperIdInfo = C->getMapperIdInfo();
9990   if (MapperIdInfo.getName()) {
9991     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9992     if (!MapperIdInfo.getName())
9993       return true;
9994   }
9995   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9996   // the previous user-defined mapper lookup in dependent environment.
9997   for (auto *E : C->mapperlists()) {
9998     // Transform all the decls.
9999     if (E) {
10000       auto *ULE = cast<UnresolvedLookupExpr>(E);
10001       UnresolvedSet<8> Decls;
10002       for (auto *D : ULE->decls()) {
10003         NamedDecl *InstD =
10004             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
10005         Decls.addDecl(InstD, InstD->getAccess());
10006       }
10007       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
10008           TT.getSema().Context, /*NamingClass=*/nullptr,
10009           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
10010           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
10011           Decls.end()));
10012     } else {
10013       UnresolvedMappers.push_back(nullptr);
10014     }
10015   }
10016   return false;
10017 }
10018 
10019 template <typename Derived>
10020 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
10021   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10022   llvm::SmallVector<Expr *, 16> Vars;
10023   CXXScopeSpec MapperIdScopeSpec;
10024   DeclarationNameInfo MapperIdInfo;
10025   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10026   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
10027           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10028     return nullptr;
10029   return getDerived().RebuildOMPMapClause(
10030       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
10031       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
10032       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10033 }
10034 
10035 template <typename Derived>
10036 OMPClause *
10037 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
10038   Expr *Allocator = C->getAllocator();
10039   if (Allocator) {
10040     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
10041     if (AllocatorRes.isInvalid())
10042       return nullptr;
10043     Allocator = AllocatorRes.get();
10044   }
10045   llvm::SmallVector<Expr *, 16> Vars;
10046   Vars.reserve(C->varlist_size());
10047   for (auto *VE : C->varlists()) {
10048     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10049     if (EVar.isInvalid())
10050       return nullptr;
10051     Vars.push_back(EVar.get());
10052   }
10053   return getDerived().RebuildOMPAllocateClause(
10054       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
10055       C->getEndLoc());
10056 }
10057 
10058 template <typename Derived>
10059 OMPClause *
10060 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10061   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10062   if (E.isInvalid())
10063     return nullptr;
10064   return getDerived().RebuildOMPNumTeamsClause(
10065       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10066 }
10067 
10068 template <typename Derived>
10069 OMPClause *
10070 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10071   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10072   if (E.isInvalid())
10073     return nullptr;
10074   return getDerived().RebuildOMPThreadLimitClause(
10075       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10076 }
10077 
10078 template <typename Derived>
10079 OMPClause *
10080 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10081   ExprResult E = getDerived().TransformExpr(C->getPriority());
10082   if (E.isInvalid())
10083     return nullptr;
10084   return getDerived().RebuildOMPPriorityClause(
10085       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10086 }
10087 
10088 template <typename Derived>
10089 OMPClause *
10090 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10091   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10092   if (E.isInvalid())
10093     return nullptr;
10094   return getDerived().RebuildOMPGrainsizeClause(
10095       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10096 }
10097 
10098 template <typename Derived>
10099 OMPClause *
10100 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10101   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10102   if (E.isInvalid())
10103     return nullptr;
10104   return getDerived().RebuildOMPNumTasksClause(
10105       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10106 }
10107 
10108 template <typename Derived>
10109 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10110   ExprResult E = getDerived().TransformExpr(C->getHint());
10111   if (E.isInvalid())
10112     return nullptr;
10113   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10114                                            C->getLParenLoc(), C->getEndLoc());
10115 }
10116 
10117 template <typename Derived>
10118 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10119     OMPDistScheduleClause *C) {
10120   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10121   if (E.isInvalid())
10122     return nullptr;
10123   return getDerived().RebuildOMPDistScheduleClause(
10124       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10125       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10126 }
10127 
10128 template <typename Derived>
10129 OMPClause *
10130 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10131   // Rebuild Defaultmap Clause since we need to invoke the checking of
10132   // defaultmap(none:variable-category) after template initialization.
10133   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10134                                                  C->getDefaultmapKind(),
10135                                                  C->getBeginLoc(),
10136                                                  C->getLParenLoc(),
10137                                                  C->getDefaultmapModifierLoc(),
10138                                                  C->getDefaultmapKindLoc(),
10139                                                  C->getEndLoc());
10140 }
10141 
10142 template <typename Derived>
10143 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10144   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10145   llvm::SmallVector<Expr *, 16> Vars;
10146   CXXScopeSpec MapperIdScopeSpec;
10147   DeclarationNameInfo MapperIdInfo;
10148   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10149   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10150           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10151     return nullptr;
10152   return getDerived().RebuildOMPToClause(
10153       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10154       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10155 }
10156 
10157 template <typename Derived>
10158 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10159   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10160   llvm::SmallVector<Expr *, 16> Vars;
10161   CXXScopeSpec MapperIdScopeSpec;
10162   DeclarationNameInfo MapperIdInfo;
10163   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10164   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10165           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10166     return nullptr;
10167   return getDerived().RebuildOMPFromClause(
10168       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10169       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10170 }
10171 
10172 template <typename Derived>
10173 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10174     OMPUseDevicePtrClause *C) {
10175   llvm::SmallVector<Expr *, 16> Vars;
10176   Vars.reserve(C->varlist_size());
10177   for (auto *VE : C->varlists()) {
10178     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10179     if (EVar.isInvalid())
10180       return nullptr;
10181     Vars.push_back(EVar.get());
10182   }
10183   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10184   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10185 }
10186 
10187 template <typename Derived>
10188 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10189     OMPUseDeviceAddrClause *C) {
10190   llvm::SmallVector<Expr *, 16> Vars;
10191   Vars.reserve(C->varlist_size());
10192   for (auto *VE : C->varlists()) {
10193     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10194     if (EVar.isInvalid())
10195       return nullptr;
10196     Vars.push_back(EVar.get());
10197   }
10198   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10199   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10200 }
10201 
10202 template <typename Derived>
10203 OMPClause *
10204 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10205   llvm::SmallVector<Expr *, 16> Vars;
10206   Vars.reserve(C->varlist_size());
10207   for (auto *VE : C->varlists()) {
10208     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10209     if (EVar.isInvalid())
10210       return nullptr;
10211     Vars.push_back(EVar.get());
10212   }
10213   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10214   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10215 }
10216 
10217 template <typename Derived>
10218 OMPClause *
10219 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10220   llvm::SmallVector<Expr *, 16> Vars;
10221   Vars.reserve(C->varlist_size());
10222   for (auto *VE : C->varlists()) {
10223     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10224     if (EVar.isInvalid())
10225       return nullptr;
10226     Vars.push_back(EVar.get());
10227   }
10228   return getDerived().RebuildOMPNontemporalClause(
10229       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10230 }
10231 
10232 template <typename Derived>
10233 OMPClause *
10234 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10235   llvm::SmallVector<Expr *, 16> Vars;
10236   Vars.reserve(C->varlist_size());
10237   for (auto *VE : C->varlists()) {
10238     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10239     if (EVar.isInvalid())
10240       return nullptr;
10241     Vars.push_back(EVar.get());
10242   }
10243   return getDerived().RebuildOMPInclusiveClause(
10244       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10245 }
10246 
10247 template <typename Derived>
10248 OMPClause *
10249 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10250   llvm::SmallVector<Expr *, 16> Vars;
10251   Vars.reserve(C->varlist_size());
10252   for (auto *VE : C->varlists()) {
10253     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10254     if (EVar.isInvalid())
10255       return nullptr;
10256     Vars.push_back(EVar.get());
10257   }
10258   return getDerived().RebuildOMPExclusiveClause(
10259       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10260 }
10261 
10262 template <typename Derived>
10263 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10264     OMPUsesAllocatorsClause *C) {
10265   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10266   Data.reserve(C->getNumberOfAllocators());
10267   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10268     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10269     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10270     if (Allocator.isInvalid())
10271       continue;
10272     ExprResult AllocatorTraits;
10273     if (Expr *AT = D.AllocatorTraits) {
10274       AllocatorTraits = getDerived().TransformExpr(AT);
10275       if (AllocatorTraits.isInvalid())
10276         continue;
10277     }
10278     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10279     NewD.Allocator = Allocator.get();
10280     NewD.AllocatorTraits = AllocatorTraits.get();
10281     NewD.LParenLoc = D.LParenLoc;
10282     NewD.RParenLoc = D.RParenLoc;
10283   }
10284   return getDerived().RebuildOMPUsesAllocatorsClause(
10285       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10286 }
10287 
10288 template <typename Derived>
10289 OMPClause *
10290 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10291   SmallVector<Expr *, 4> Locators;
10292   Locators.reserve(C->varlist_size());
10293   ExprResult ModifierRes;
10294   if (Expr *Modifier = C->getModifier()) {
10295     ModifierRes = getDerived().TransformExpr(Modifier);
10296     if (ModifierRes.isInvalid())
10297       return nullptr;
10298   }
10299   for (Expr *E : C->varlists()) {
10300     ExprResult Locator = getDerived().TransformExpr(E);
10301     if (Locator.isInvalid())
10302       continue;
10303     Locators.push_back(Locator.get());
10304   }
10305   return getDerived().RebuildOMPAffinityClause(
10306       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10307       ModifierRes.get(), Locators);
10308 }
10309 
10310 template <typename Derived>
10311 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10312   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10313                                             C->getBeginLoc(), C->getLParenLoc(),
10314                                             C->getEndLoc());
10315 }
10316 
10317 template <typename Derived>
10318 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10319   return getDerived().RebuildOMPBindClause(
10320       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10321       C->getLParenLoc(), C->getEndLoc());
10322 }
10323 
10324 //===----------------------------------------------------------------------===//
10325 // Expression transformation
10326 //===----------------------------------------------------------------------===//
10327 template<typename Derived>
10328 ExprResult
10329 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10330   return TransformExpr(E->getSubExpr());
10331 }
10332 
10333 template <typename Derived>
10334 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10335     SYCLUniqueStableNameExpr *E) {
10336   if (!E->isTypeDependent())
10337     return E;
10338 
10339   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10340 
10341   if (!NewT)
10342     return ExprError();
10343 
10344   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10345     return E;
10346 
10347   return getDerived().RebuildSYCLUniqueStableNameExpr(
10348       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10349 }
10350 
10351 template<typename Derived>
10352 ExprResult
10353 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10354   if (!E->isTypeDependent())
10355     return E;
10356 
10357   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10358                                             E->getIdentKind());
10359 }
10360 
10361 template<typename Derived>
10362 ExprResult
10363 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10364   NestedNameSpecifierLoc QualifierLoc;
10365   if (E->getQualifierLoc()) {
10366     QualifierLoc
10367       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10368     if (!QualifierLoc)
10369       return ExprError();
10370   }
10371 
10372   ValueDecl *ND
10373     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10374                                                          E->getDecl()));
10375   if (!ND)
10376     return ExprError();
10377 
10378   NamedDecl *Found = ND;
10379   if (E->getFoundDecl() != E->getDecl()) {
10380     Found = cast_or_null<NamedDecl>(
10381         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10382     if (!Found)
10383       return ExprError();
10384   }
10385 
10386   DeclarationNameInfo NameInfo = E->getNameInfo();
10387   if (NameInfo.getName()) {
10388     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10389     if (!NameInfo.getName())
10390       return ExprError();
10391   }
10392 
10393   if (!getDerived().AlwaysRebuild() &&
10394       QualifierLoc == E->getQualifierLoc() &&
10395       ND == E->getDecl() &&
10396       Found == E->getFoundDecl() &&
10397       NameInfo.getName() == E->getDecl()->getDeclName() &&
10398       !E->hasExplicitTemplateArgs()) {
10399 
10400     // Mark it referenced in the new context regardless.
10401     // FIXME: this is a bit instantiation-specific.
10402     SemaRef.MarkDeclRefReferenced(E);
10403 
10404     return E;
10405   }
10406 
10407   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10408   if (E->hasExplicitTemplateArgs()) {
10409     TemplateArgs = &TransArgs;
10410     TransArgs.setLAngleLoc(E->getLAngleLoc());
10411     TransArgs.setRAngleLoc(E->getRAngleLoc());
10412     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10413                                                 E->getNumTemplateArgs(),
10414                                                 TransArgs))
10415       return ExprError();
10416   }
10417 
10418   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10419                                          Found, TemplateArgs);
10420 }
10421 
10422 template<typename Derived>
10423 ExprResult
10424 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10425   return E;
10426 }
10427 
10428 template <typename Derived>
10429 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10430     FixedPointLiteral *E) {
10431   return E;
10432 }
10433 
10434 template<typename Derived>
10435 ExprResult
10436 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10437   return E;
10438 }
10439 
10440 template<typename Derived>
10441 ExprResult
10442 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10443   return E;
10444 }
10445 
10446 template<typename Derived>
10447 ExprResult
10448 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10449   return E;
10450 }
10451 
10452 template<typename Derived>
10453 ExprResult
10454 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10455   return E;
10456 }
10457 
10458 template<typename Derived>
10459 ExprResult
10460 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10461   if (FunctionDecl *FD = E->getDirectCallee())
10462     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10463   return SemaRef.MaybeBindToTemporary(E);
10464 }
10465 
10466 template<typename Derived>
10467 ExprResult
10468 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10469   ExprResult ControllingExpr =
10470     getDerived().TransformExpr(E->getControllingExpr());
10471   if (ControllingExpr.isInvalid())
10472     return ExprError();
10473 
10474   SmallVector<Expr *, 4> AssocExprs;
10475   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10476   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10477     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10478     if (TSI) {
10479       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10480       if (!AssocType)
10481         return ExprError();
10482       AssocTypes.push_back(AssocType);
10483     } else {
10484       AssocTypes.push_back(nullptr);
10485     }
10486 
10487     ExprResult AssocExpr =
10488         getDerived().TransformExpr(Assoc.getAssociationExpr());
10489     if (AssocExpr.isInvalid())
10490       return ExprError();
10491     AssocExprs.push_back(AssocExpr.get());
10492   }
10493 
10494   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10495                                                   E->getDefaultLoc(),
10496                                                   E->getRParenLoc(),
10497                                                   ControllingExpr.get(),
10498                                                   AssocTypes,
10499                                                   AssocExprs);
10500 }
10501 
10502 template<typename Derived>
10503 ExprResult
10504 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10505   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10506   if (SubExpr.isInvalid())
10507     return ExprError();
10508 
10509   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10510     return E;
10511 
10512   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10513                                        E->getRParen());
10514 }
10515 
10516 /// The operand of a unary address-of operator has special rules: it's
10517 /// allowed to refer to a non-static member of a class even if there's no 'this'
10518 /// object available.
10519 template<typename Derived>
10520 ExprResult
10521 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10522   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10523     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10524   else
10525     return getDerived().TransformExpr(E);
10526 }
10527 
10528 template<typename Derived>
10529 ExprResult
10530 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10531   ExprResult SubExpr;
10532   if (E->getOpcode() == UO_AddrOf)
10533     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10534   else
10535     SubExpr = TransformExpr(E->getSubExpr());
10536   if (SubExpr.isInvalid())
10537     return ExprError();
10538 
10539   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10540     return E;
10541 
10542   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10543                                            E->getOpcode(),
10544                                            SubExpr.get());
10545 }
10546 
10547 template<typename Derived>
10548 ExprResult
10549 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10550   // Transform the type.
10551   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10552   if (!Type)
10553     return ExprError();
10554 
10555   // Transform all of the components into components similar to what the
10556   // parser uses.
10557   // FIXME: It would be slightly more efficient in the non-dependent case to
10558   // just map FieldDecls, rather than requiring the rebuilder to look for
10559   // the fields again. However, __builtin_offsetof is rare enough in
10560   // template code that we don't care.
10561   bool ExprChanged = false;
10562   typedef Sema::OffsetOfComponent Component;
10563   SmallVector<Component, 4> Components;
10564   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10565     const OffsetOfNode &ON = E->getComponent(I);
10566     Component Comp;
10567     Comp.isBrackets = true;
10568     Comp.LocStart = ON.getSourceRange().getBegin();
10569     Comp.LocEnd = ON.getSourceRange().getEnd();
10570     switch (ON.getKind()) {
10571     case OffsetOfNode::Array: {
10572       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10573       ExprResult Index = getDerived().TransformExpr(FromIndex);
10574       if (Index.isInvalid())
10575         return ExprError();
10576 
10577       ExprChanged = ExprChanged || Index.get() != FromIndex;
10578       Comp.isBrackets = true;
10579       Comp.U.E = Index.get();
10580       break;
10581     }
10582 
10583     case OffsetOfNode::Field:
10584     case OffsetOfNode::Identifier:
10585       Comp.isBrackets = false;
10586       Comp.U.IdentInfo = ON.getFieldName();
10587       if (!Comp.U.IdentInfo)
10588         continue;
10589 
10590       break;
10591 
10592     case OffsetOfNode::Base:
10593       // Will be recomputed during the rebuild.
10594       continue;
10595     }
10596 
10597     Components.push_back(Comp);
10598   }
10599 
10600   // If nothing changed, retain the existing expression.
10601   if (!getDerived().AlwaysRebuild() &&
10602       Type == E->getTypeSourceInfo() &&
10603       !ExprChanged)
10604     return E;
10605 
10606   // Build a new offsetof expression.
10607   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10608                                           Components, E->getRParenLoc());
10609 }
10610 
10611 template<typename Derived>
10612 ExprResult
10613 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10614   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10615          "opaque value expression requires transformation");
10616   return E;
10617 }
10618 
10619 template<typename Derived>
10620 ExprResult
10621 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10622   return E;
10623 }
10624 
10625 template <typename Derived>
10626 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10627   llvm::SmallVector<Expr *, 8> Children;
10628   bool Changed = false;
10629   for (Expr *C : E->subExpressions()) {
10630     ExprResult NewC = getDerived().TransformExpr(C);
10631     if (NewC.isInvalid())
10632       return ExprError();
10633     Children.push_back(NewC.get());
10634 
10635     Changed |= NewC.get() != C;
10636   }
10637   if (!getDerived().AlwaysRebuild() && !Changed)
10638     return E;
10639   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10640                                           Children, E->getType());
10641 }
10642 
10643 template<typename Derived>
10644 ExprResult
10645 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10646   // Rebuild the syntactic form.  The original syntactic form has
10647   // opaque-value expressions in it, so strip those away and rebuild
10648   // the result.  This is a really awful way of doing this, but the
10649   // better solution (rebuilding the semantic expressions and
10650   // rebinding OVEs as necessary) doesn't work; we'd need
10651   // TreeTransform to not strip away implicit conversions.
10652   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10653   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10654   if (result.isInvalid()) return ExprError();
10655 
10656   // If that gives us a pseudo-object result back, the pseudo-object
10657   // expression must have been an lvalue-to-rvalue conversion which we
10658   // should reapply.
10659   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10660     result = SemaRef.checkPseudoObjectRValue(result.get());
10661 
10662   return result;
10663 }
10664 
10665 template<typename Derived>
10666 ExprResult
10667 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10668                                                 UnaryExprOrTypeTraitExpr *E) {
10669   if (E->isArgumentType()) {
10670     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10671 
10672     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10673     if (!NewT)
10674       return ExprError();
10675 
10676     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10677       return E;
10678 
10679     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10680                                                     E->getKind(),
10681                                                     E->getSourceRange());
10682   }
10683 
10684   // C++0x [expr.sizeof]p1:
10685   //   The operand is either an expression, which is an unevaluated operand
10686   //   [...]
10687   EnterExpressionEvaluationContext Unevaluated(
10688       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10689       Sema::ReuseLambdaContextDecl);
10690 
10691   // Try to recover if we have something like sizeof(T::X) where X is a type.
10692   // Notably, there must be *exactly* one set of parens if X is a type.
10693   TypeSourceInfo *RecoveryTSI = nullptr;
10694   ExprResult SubExpr;
10695   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10696   if (auto *DRE =
10697           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10698     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10699         PE, DRE, false, &RecoveryTSI);
10700   else
10701     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10702 
10703   if (RecoveryTSI) {
10704     return getDerived().RebuildUnaryExprOrTypeTrait(
10705         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10706   } else if (SubExpr.isInvalid())
10707     return ExprError();
10708 
10709   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10710     return E;
10711 
10712   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10713                                                   E->getOperatorLoc(),
10714                                                   E->getKind(),
10715                                                   E->getSourceRange());
10716 }
10717 
10718 template<typename Derived>
10719 ExprResult
10720 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10721   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10722   if (LHS.isInvalid())
10723     return ExprError();
10724 
10725   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10726   if (RHS.isInvalid())
10727     return ExprError();
10728 
10729 
10730   if (!getDerived().AlwaysRebuild() &&
10731       LHS.get() == E->getLHS() &&
10732       RHS.get() == E->getRHS())
10733     return E;
10734 
10735   return getDerived().RebuildArraySubscriptExpr(
10736       LHS.get(),
10737       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10738 }
10739 
10740 template <typename Derived>
10741 ExprResult
10742 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10743   ExprResult Base = getDerived().TransformExpr(E->getBase());
10744   if (Base.isInvalid())
10745     return ExprError();
10746 
10747   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10748   if (RowIdx.isInvalid())
10749     return ExprError();
10750 
10751   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10752   if (ColumnIdx.isInvalid())
10753     return ExprError();
10754 
10755   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10756       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10757     return E;
10758 
10759   return getDerived().RebuildMatrixSubscriptExpr(
10760       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10761 }
10762 
10763 template <typename Derived>
10764 ExprResult
10765 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10766   ExprResult Base = getDerived().TransformExpr(E->getBase());
10767   if (Base.isInvalid())
10768     return ExprError();
10769 
10770   ExprResult LowerBound;
10771   if (E->getLowerBound()) {
10772     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10773     if (LowerBound.isInvalid())
10774       return ExprError();
10775   }
10776 
10777   ExprResult Length;
10778   if (E->getLength()) {
10779     Length = getDerived().TransformExpr(E->getLength());
10780     if (Length.isInvalid())
10781       return ExprError();
10782   }
10783 
10784   ExprResult Stride;
10785   if (Expr *Str = E->getStride()) {
10786     Stride = getDerived().TransformExpr(Str);
10787     if (Stride.isInvalid())
10788       return ExprError();
10789   }
10790 
10791   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10792       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10793     return E;
10794 
10795   return getDerived().RebuildOMPArraySectionExpr(
10796       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10797       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10798       E->getRBracketLoc());
10799 }
10800 
10801 template <typename Derived>
10802 ExprResult
10803 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10804   ExprResult Base = getDerived().TransformExpr(E->getBase());
10805   if (Base.isInvalid())
10806     return ExprError();
10807 
10808   SmallVector<Expr *, 4> Dims;
10809   bool ErrorFound = false;
10810   for (Expr *Dim : E->getDimensions()) {
10811     ExprResult DimRes = getDerived().TransformExpr(Dim);
10812     if (DimRes.isInvalid()) {
10813       ErrorFound = true;
10814       continue;
10815     }
10816     Dims.push_back(DimRes.get());
10817   }
10818 
10819   if (ErrorFound)
10820     return ExprError();
10821   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10822                                                  E->getRParenLoc(), Dims,
10823                                                  E->getBracketsRanges());
10824 }
10825 
10826 template <typename Derived>
10827 ExprResult
10828 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10829   unsigned NumIterators = E->numOfIterators();
10830   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10831 
10832   bool ErrorFound = false;
10833   bool NeedToRebuild = getDerived().AlwaysRebuild();
10834   for (unsigned I = 0; I < NumIterators; ++I) {
10835     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10836     Data[I].DeclIdent = D->getIdentifier();
10837     Data[I].DeclIdentLoc = D->getLocation();
10838     if (D->getLocation() == D->getBeginLoc()) {
10839       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10840              "Implicit type must be int.");
10841     } else {
10842       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10843       QualType DeclTy = getDerived().TransformType(D->getType());
10844       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10845     }
10846     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10847     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10848     ExprResult End = getDerived().TransformExpr(Range.End);
10849     ExprResult Step = getDerived().TransformExpr(Range.Step);
10850     ErrorFound = ErrorFound ||
10851                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10852                                                !Data[I].Type.get().isNull())) ||
10853                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10854     if (ErrorFound)
10855       continue;
10856     Data[I].Range.Begin = Begin.get();
10857     Data[I].Range.End = End.get();
10858     Data[I].Range.Step = Step.get();
10859     Data[I].AssignLoc = E->getAssignLoc(I);
10860     Data[I].ColonLoc = E->getColonLoc(I);
10861     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10862     NeedToRebuild =
10863         NeedToRebuild ||
10864         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10865                                        D->getType().getTypePtrOrNull()) ||
10866         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10867         Range.Step != Data[I].Range.Step;
10868   }
10869   if (ErrorFound)
10870     return ExprError();
10871   if (!NeedToRebuild)
10872     return E;
10873 
10874   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10875       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10876   if (!Res.isUsable())
10877     return Res;
10878   auto *IE = cast<OMPIteratorExpr>(Res.get());
10879   for (unsigned I = 0; I < NumIterators; ++I)
10880     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10881                                       IE->getIteratorDecl(I));
10882   return Res;
10883 }
10884 
10885 template<typename Derived>
10886 ExprResult
10887 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10888   // Transform the callee.
10889   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10890   if (Callee.isInvalid())
10891     return ExprError();
10892 
10893   // Transform arguments.
10894   bool ArgChanged = false;
10895   SmallVector<Expr*, 8> Args;
10896   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10897                                   &ArgChanged))
10898     return ExprError();
10899 
10900   if (!getDerived().AlwaysRebuild() &&
10901       Callee.get() == E->getCallee() &&
10902       !ArgChanged)
10903     return SemaRef.MaybeBindToTemporary(E);
10904 
10905   // FIXME: Wrong source location information for the '('.
10906   SourceLocation FakeLParenLoc
10907     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10908 
10909   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10910   if (E->hasStoredFPFeatures()) {
10911     FPOptionsOverride NewOverrides = E->getFPFeatures();
10912     getSema().CurFPFeatures =
10913         NewOverrides.applyOverrides(getSema().getLangOpts());
10914     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10915   }
10916 
10917   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10918                                       Args,
10919                                       E->getRParenLoc());
10920 }
10921 
10922 template<typename Derived>
10923 ExprResult
10924 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10925   ExprResult Base = getDerived().TransformExpr(E->getBase());
10926   if (Base.isInvalid())
10927     return ExprError();
10928 
10929   NestedNameSpecifierLoc QualifierLoc;
10930   if (E->hasQualifier()) {
10931     QualifierLoc
10932       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10933 
10934     if (!QualifierLoc)
10935       return ExprError();
10936   }
10937   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10938 
10939   ValueDecl *Member
10940     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10941                                                          E->getMemberDecl()));
10942   if (!Member)
10943     return ExprError();
10944 
10945   NamedDecl *FoundDecl = E->getFoundDecl();
10946   if (FoundDecl == E->getMemberDecl()) {
10947     FoundDecl = Member;
10948   } else {
10949     FoundDecl = cast_or_null<NamedDecl>(
10950                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10951     if (!FoundDecl)
10952       return ExprError();
10953   }
10954 
10955   if (!getDerived().AlwaysRebuild() &&
10956       Base.get() == E->getBase() &&
10957       QualifierLoc == E->getQualifierLoc() &&
10958       Member == E->getMemberDecl() &&
10959       FoundDecl == E->getFoundDecl() &&
10960       !E->hasExplicitTemplateArgs()) {
10961 
10962     // Mark it referenced in the new context regardless.
10963     // FIXME: this is a bit instantiation-specific.
10964     SemaRef.MarkMemberReferenced(E);
10965 
10966     return E;
10967   }
10968 
10969   TemplateArgumentListInfo TransArgs;
10970   if (E->hasExplicitTemplateArgs()) {
10971     TransArgs.setLAngleLoc(E->getLAngleLoc());
10972     TransArgs.setRAngleLoc(E->getRAngleLoc());
10973     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10974                                                 E->getNumTemplateArgs(),
10975                                                 TransArgs))
10976       return ExprError();
10977   }
10978 
10979   // FIXME: Bogus source location for the operator
10980   SourceLocation FakeOperatorLoc =
10981       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10982 
10983   // FIXME: to do this check properly, we will need to preserve the
10984   // first-qualifier-in-scope here, just in case we had a dependent
10985   // base (and therefore couldn't do the check) and a
10986   // nested-name-qualifier (and therefore could do the lookup).
10987   NamedDecl *FirstQualifierInScope = nullptr;
10988   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10989   if (MemberNameInfo.getName()) {
10990     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10991     if (!MemberNameInfo.getName())
10992       return ExprError();
10993   }
10994 
10995   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10996                                         E->isArrow(),
10997                                         QualifierLoc,
10998                                         TemplateKWLoc,
10999                                         MemberNameInfo,
11000                                         Member,
11001                                         FoundDecl,
11002                                         (E->hasExplicitTemplateArgs()
11003                                            ? &TransArgs : nullptr),
11004                                         FirstQualifierInScope);
11005 }
11006 
11007 template<typename Derived>
11008 ExprResult
11009 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
11010   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11011   if (LHS.isInvalid())
11012     return ExprError();
11013 
11014   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11015   if (RHS.isInvalid())
11016     return ExprError();
11017 
11018   if (!getDerived().AlwaysRebuild() &&
11019       LHS.get() == E->getLHS() &&
11020       RHS.get() == E->getRHS())
11021     return E;
11022 
11023   if (E->isCompoundAssignmentOp())
11024     // FPFeatures has already been established from trailing storage
11025     return getDerived().RebuildBinaryOperator(
11026         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
11027   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11028   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11029   getSema().CurFPFeatures =
11030       NewOverrides.applyOverrides(getSema().getLangOpts());
11031   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11032   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
11033                                             LHS.get(), RHS.get());
11034 }
11035 
11036 template <typename Derived>
11037 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
11038     CXXRewrittenBinaryOperator *E) {
11039   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
11040 
11041   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
11042   if (LHS.isInvalid())
11043     return ExprError();
11044 
11045   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
11046   if (RHS.isInvalid())
11047     return ExprError();
11048 
11049   // Extract the already-resolved callee declarations so that we can restrict
11050   // ourselves to using them as the unqualified lookup results when rebuilding.
11051   UnresolvedSet<2> UnqualLookups;
11052   bool ChangedAnyLookups = false;
11053   Expr *PossibleBinOps[] = {E->getSemanticForm(),
11054                             const_cast<Expr *>(Decomp.InnerBinOp)};
11055   for (Expr *PossibleBinOp : PossibleBinOps) {
11056     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11057     if (!Op)
11058       continue;
11059     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11060     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11061       continue;
11062 
11063     // Transform the callee in case we built a call to a local extern
11064     // declaration.
11065     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11066         E->getOperatorLoc(), Callee->getFoundDecl()));
11067     if (!Found)
11068       return ExprError();
11069     if (Found != Callee->getFoundDecl())
11070       ChangedAnyLookups = true;
11071     UnqualLookups.addDecl(Found);
11072   }
11073 
11074   if (!getDerived().AlwaysRebuild() && !ChangedAnyLookups &&
11075       LHS.get() == Decomp.LHS && RHS.get() == Decomp.RHS) {
11076     // Mark all functions used in the rewrite as referenced. Note that when
11077     // a < b is rewritten to (a <=> b) < 0, both the <=> and the < might be
11078     // function calls, and/or there might be a user-defined conversion sequence
11079     // applied to the operands of the <.
11080     // FIXME: this is a bit instantiation-specific.
11081     const Expr *StopAt[] = {Decomp.LHS, Decomp.RHS};
11082     SemaRef.MarkDeclarationsReferencedInExpr(E, false, StopAt);
11083     return E;
11084   }
11085 
11086   return getDerived().RebuildCXXRewrittenBinaryOperator(
11087       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11088 }
11089 
11090 template<typename Derived>
11091 ExprResult
11092 TreeTransform<Derived>::TransformCompoundAssignOperator(
11093                                                       CompoundAssignOperator *E) {
11094   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11095   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11096   getSema().CurFPFeatures =
11097       NewOverrides.applyOverrides(getSema().getLangOpts());
11098   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11099   return getDerived().TransformBinaryOperator(E);
11100 }
11101 
11102 template<typename Derived>
11103 ExprResult TreeTransform<Derived>::
11104 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11105   // Just rebuild the common and RHS expressions and see whether we
11106   // get any changes.
11107 
11108   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11109   if (commonExpr.isInvalid())
11110     return ExprError();
11111 
11112   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11113   if (rhs.isInvalid())
11114     return ExprError();
11115 
11116   if (!getDerived().AlwaysRebuild() &&
11117       commonExpr.get() == e->getCommon() &&
11118       rhs.get() == e->getFalseExpr())
11119     return e;
11120 
11121   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11122                                                  e->getQuestionLoc(),
11123                                                  nullptr,
11124                                                  e->getColonLoc(),
11125                                                  rhs.get());
11126 }
11127 
11128 template<typename Derived>
11129 ExprResult
11130 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11131   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11132   if (Cond.isInvalid())
11133     return ExprError();
11134 
11135   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11136   if (LHS.isInvalid())
11137     return ExprError();
11138 
11139   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11140   if (RHS.isInvalid())
11141     return ExprError();
11142 
11143   if (!getDerived().AlwaysRebuild() &&
11144       Cond.get() == E->getCond() &&
11145       LHS.get() == E->getLHS() &&
11146       RHS.get() == E->getRHS())
11147     return E;
11148 
11149   return getDerived().RebuildConditionalOperator(Cond.get(),
11150                                                  E->getQuestionLoc(),
11151                                                  LHS.get(),
11152                                                  E->getColonLoc(),
11153                                                  RHS.get());
11154 }
11155 
11156 template<typename Derived>
11157 ExprResult
11158 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11159   // Implicit casts are eliminated during transformation, since they
11160   // will be recomputed by semantic analysis after transformation.
11161   return getDerived().TransformExpr(E->getSubExprAsWritten());
11162 }
11163 
11164 template<typename Derived>
11165 ExprResult
11166 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11167   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11168   if (!Type)
11169     return ExprError();
11170 
11171   ExprResult SubExpr
11172     = getDerived().TransformExpr(E->getSubExprAsWritten());
11173   if (SubExpr.isInvalid())
11174     return ExprError();
11175 
11176   if (!getDerived().AlwaysRebuild() &&
11177       Type == E->getTypeInfoAsWritten() &&
11178       SubExpr.get() == E->getSubExpr())
11179     return E;
11180 
11181   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11182                                             Type,
11183                                             E->getRParenLoc(),
11184                                             SubExpr.get());
11185 }
11186 
11187 template<typename Derived>
11188 ExprResult
11189 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11190   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11191   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11192   if (!NewT)
11193     return ExprError();
11194 
11195   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11196   if (Init.isInvalid())
11197     return ExprError();
11198 
11199   if (!getDerived().AlwaysRebuild() &&
11200       OldT == NewT &&
11201       Init.get() == E->getInitializer())
11202     return SemaRef.MaybeBindToTemporary(E);
11203 
11204   // Note: the expression type doesn't necessarily match the
11205   // type-as-written, but that's okay, because it should always be
11206   // derivable from the initializer.
11207 
11208   return getDerived().RebuildCompoundLiteralExpr(
11209       E->getLParenLoc(), NewT,
11210       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11211 }
11212 
11213 template<typename Derived>
11214 ExprResult
11215 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11216   ExprResult Base = getDerived().TransformExpr(E->getBase());
11217   if (Base.isInvalid())
11218     return ExprError();
11219 
11220   if (!getDerived().AlwaysRebuild() &&
11221       Base.get() == E->getBase())
11222     return E;
11223 
11224   // FIXME: Bad source location
11225   SourceLocation FakeOperatorLoc =
11226       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11227   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11228                                                   E->getAccessorLoc(),
11229                                                   E->getAccessor());
11230 }
11231 
11232 template<typename Derived>
11233 ExprResult
11234 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11235   if (InitListExpr *Syntactic = E->getSyntacticForm())
11236     E = Syntactic;
11237 
11238   bool InitChanged = false;
11239 
11240   EnterExpressionEvaluationContext Context(
11241       getSema(), EnterExpressionEvaluationContext::InitList);
11242 
11243   SmallVector<Expr*, 4> Inits;
11244   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11245                                   Inits, &InitChanged))
11246     return ExprError();
11247 
11248   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11249     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11250     // in some cases. We can't reuse it in general, because the syntactic and
11251     // semantic forms are linked, and we can't know that semantic form will
11252     // match even if the syntactic form does.
11253   }
11254 
11255   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11256                                       E->getRBraceLoc());
11257 }
11258 
11259 template<typename Derived>
11260 ExprResult
11261 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11262   Designation Desig;
11263 
11264   // transform the initializer value
11265   ExprResult Init = getDerived().TransformExpr(E->getInit());
11266   if (Init.isInvalid())
11267     return ExprError();
11268 
11269   // transform the designators.
11270   SmallVector<Expr*, 4> ArrayExprs;
11271   bool ExprChanged = false;
11272   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11273     if (D.isFieldDesignator()) {
11274       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11275                                                D.getDotLoc(),
11276                                                D.getFieldLoc()));
11277       if (D.getField()) {
11278         FieldDecl *Field = cast_or_null<FieldDecl>(
11279             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11280         if (Field != D.getField())
11281           // Rebuild the expression when the transformed FieldDecl is
11282           // different to the already assigned FieldDecl.
11283           ExprChanged = true;
11284       } else {
11285         // Ensure that the designator expression is rebuilt when there isn't
11286         // a resolved FieldDecl in the designator as we don't want to assign
11287         // a FieldDecl to a pattern designator that will be instantiated again.
11288         ExprChanged = true;
11289       }
11290       continue;
11291     }
11292 
11293     if (D.isArrayDesignator()) {
11294       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11295       if (Index.isInvalid())
11296         return ExprError();
11297 
11298       Desig.AddDesignator(
11299           Designator::getArray(Index.get(), D.getLBracketLoc()));
11300 
11301       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11302       ArrayExprs.push_back(Index.get());
11303       continue;
11304     }
11305 
11306     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11307     ExprResult Start
11308       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11309     if (Start.isInvalid())
11310       return ExprError();
11311 
11312     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11313     if (End.isInvalid())
11314       return ExprError();
11315 
11316     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11317                                                   End.get(),
11318                                                   D.getLBracketLoc(),
11319                                                   D.getEllipsisLoc()));
11320 
11321     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11322                   End.get() != E->getArrayRangeEnd(D);
11323 
11324     ArrayExprs.push_back(Start.get());
11325     ArrayExprs.push_back(End.get());
11326   }
11327 
11328   if (!getDerived().AlwaysRebuild() &&
11329       Init.get() == E->getInit() &&
11330       !ExprChanged)
11331     return E;
11332 
11333   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11334                                                 E->getEqualOrColonLoc(),
11335                                                 E->usesGNUSyntax(), Init.get());
11336 }
11337 
11338 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11339 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11340 template<typename Derived>
11341 ExprResult
11342 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11343     DesignatedInitUpdateExpr *E) {
11344   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11345                    "initializer");
11346   return ExprError();
11347 }
11348 
11349 template<typename Derived>
11350 ExprResult
11351 TreeTransform<Derived>::TransformNoInitExpr(
11352     NoInitExpr *E) {
11353   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11354   return ExprError();
11355 }
11356 
11357 template<typename Derived>
11358 ExprResult
11359 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11360   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11361   return ExprError();
11362 }
11363 
11364 template<typename Derived>
11365 ExprResult
11366 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11367   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11368   return ExprError();
11369 }
11370 
11371 template<typename Derived>
11372 ExprResult
11373 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11374                                                      ImplicitValueInitExpr *E) {
11375   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11376 
11377   // FIXME: Will we ever have proper type location here? Will we actually
11378   // need to transform the type?
11379   QualType T = getDerived().TransformType(E->getType());
11380   if (T.isNull())
11381     return ExprError();
11382 
11383   if (!getDerived().AlwaysRebuild() &&
11384       T == E->getType())
11385     return E;
11386 
11387   return getDerived().RebuildImplicitValueInitExpr(T);
11388 }
11389 
11390 template<typename Derived>
11391 ExprResult
11392 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11393   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11394   if (!TInfo)
11395     return ExprError();
11396 
11397   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11398   if (SubExpr.isInvalid())
11399     return ExprError();
11400 
11401   if (!getDerived().AlwaysRebuild() &&
11402       TInfo == E->getWrittenTypeInfo() &&
11403       SubExpr.get() == E->getSubExpr())
11404     return E;
11405 
11406   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11407                                        TInfo, E->getRParenLoc());
11408 }
11409 
11410 template<typename Derived>
11411 ExprResult
11412 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11413   bool ArgumentChanged = false;
11414   SmallVector<Expr*, 4> Inits;
11415   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11416                      &ArgumentChanged))
11417     return ExprError();
11418 
11419   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11420                                            Inits,
11421                                            E->getRParenLoc());
11422 }
11423 
11424 /// Transform an address-of-label expression.
11425 ///
11426 /// By default, the transformation of an address-of-label expression always
11427 /// rebuilds the expression, so that the label identifier can be resolved to
11428 /// the corresponding label statement by semantic analysis.
11429 template<typename Derived>
11430 ExprResult
11431 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11432   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11433                                         E->getLabel());
11434   if (!LD)
11435     return ExprError();
11436 
11437   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11438                                            cast<LabelDecl>(LD));
11439 }
11440 
11441 template<typename Derived>
11442 ExprResult
11443 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11444   SemaRef.ActOnStartStmtExpr();
11445   StmtResult SubStmt
11446     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11447   if (SubStmt.isInvalid()) {
11448     SemaRef.ActOnStmtExprError();
11449     return ExprError();
11450   }
11451 
11452   unsigned OldDepth = E->getTemplateDepth();
11453   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11454 
11455   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11456       SubStmt.get() == E->getSubStmt()) {
11457     // Calling this an 'error' is unintuitive, but it does the right thing.
11458     SemaRef.ActOnStmtExprError();
11459     return SemaRef.MaybeBindToTemporary(E);
11460   }
11461 
11462   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11463                                       E->getRParenLoc(), NewDepth);
11464 }
11465 
11466 template<typename Derived>
11467 ExprResult
11468 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11469   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11470   if (Cond.isInvalid())
11471     return ExprError();
11472 
11473   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11474   if (LHS.isInvalid())
11475     return ExprError();
11476 
11477   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11478   if (RHS.isInvalid())
11479     return ExprError();
11480 
11481   if (!getDerived().AlwaysRebuild() &&
11482       Cond.get() == E->getCond() &&
11483       LHS.get() == E->getLHS() &&
11484       RHS.get() == E->getRHS())
11485     return E;
11486 
11487   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11488                                         Cond.get(), LHS.get(), RHS.get(),
11489                                         E->getRParenLoc());
11490 }
11491 
11492 template<typename Derived>
11493 ExprResult
11494 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11495   return E;
11496 }
11497 
11498 template<typename Derived>
11499 ExprResult
11500 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11501   switch (E->getOperator()) {
11502   case OO_New:
11503   case OO_Delete:
11504   case OO_Array_New:
11505   case OO_Array_Delete:
11506     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11507 
11508   case OO_Call: {
11509     // This is a call to an object's operator().
11510     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11511 
11512     // Transform the object itself.
11513     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11514     if (Object.isInvalid())
11515       return ExprError();
11516 
11517     // FIXME: Poor location information
11518     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11519         static_cast<Expr *>(Object.get())->getEndLoc());
11520 
11521     // Transform the call arguments.
11522     SmallVector<Expr*, 8> Args;
11523     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11524                                     Args))
11525       return ExprError();
11526 
11527     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11528                                         E->getEndLoc());
11529   }
11530 
11531 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11532   case OO_##Name:
11533 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11534 #include "clang/Basic/OperatorKinds.def"
11535   case OO_Subscript:
11536     // Handled below.
11537     break;
11538 
11539   case OO_Conditional:
11540     llvm_unreachable("conditional operator is not actually overloadable");
11541 
11542   case OO_None:
11543   case NUM_OVERLOADED_OPERATORS:
11544     llvm_unreachable("not an overloaded operator?");
11545   }
11546 
11547   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11548   if (Callee.isInvalid())
11549     return ExprError();
11550 
11551   ExprResult First;
11552   if (E->getOperator() == OO_Amp)
11553     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11554   else
11555     First = getDerived().TransformExpr(E->getArg(0));
11556   if (First.isInvalid())
11557     return ExprError();
11558 
11559   ExprResult Second;
11560   if (E->getNumArgs() == 2) {
11561     Second = getDerived().TransformExpr(E->getArg(1));
11562     if (Second.isInvalid())
11563       return ExprError();
11564   }
11565 
11566   if (!getDerived().AlwaysRebuild() &&
11567       Callee.get() == E->getCallee() &&
11568       First.get() == E->getArg(0) &&
11569       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11570     return SemaRef.MaybeBindToTemporary(E);
11571 
11572   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11573   FPOptionsOverride NewOverrides(E->getFPFeatures());
11574   getSema().CurFPFeatures =
11575       NewOverrides.applyOverrides(getSema().getLangOpts());
11576   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11577 
11578   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11579                                                  E->getOperatorLoc(),
11580                                                  Callee.get(),
11581                                                  First.get(),
11582                                                  Second.get());
11583 }
11584 
11585 template<typename Derived>
11586 ExprResult
11587 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11588   return getDerived().TransformCallExpr(E);
11589 }
11590 
11591 template <typename Derived>
11592 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11593   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11594                          getSema().CurContext != E->getParentContext();
11595 
11596   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11597     return E;
11598 
11599   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11600                                            E->getEndLoc(),
11601                                            getSema().CurContext);
11602 }
11603 
11604 template<typename Derived>
11605 ExprResult
11606 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11607   // Transform the callee.
11608   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11609   if (Callee.isInvalid())
11610     return ExprError();
11611 
11612   // Transform exec config.
11613   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11614   if (EC.isInvalid())
11615     return ExprError();
11616 
11617   // Transform arguments.
11618   bool ArgChanged = false;
11619   SmallVector<Expr*, 8> Args;
11620   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11621                                   &ArgChanged))
11622     return ExprError();
11623 
11624   if (!getDerived().AlwaysRebuild() &&
11625       Callee.get() == E->getCallee() &&
11626       !ArgChanged)
11627     return SemaRef.MaybeBindToTemporary(E);
11628 
11629   // FIXME: Wrong source location information for the '('.
11630   SourceLocation FakeLParenLoc
11631     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11632   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11633                                       Args,
11634                                       E->getRParenLoc(), EC.get());
11635 }
11636 
11637 template<typename Derived>
11638 ExprResult
11639 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11640   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11641   if (!Type)
11642     return ExprError();
11643 
11644   ExprResult SubExpr
11645     = getDerived().TransformExpr(E->getSubExprAsWritten());
11646   if (SubExpr.isInvalid())
11647     return ExprError();
11648 
11649   if (!getDerived().AlwaysRebuild() &&
11650       Type == E->getTypeInfoAsWritten() &&
11651       SubExpr.get() == E->getSubExpr())
11652     return E;
11653   return getDerived().RebuildCXXNamedCastExpr(
11654       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11655       Type, E->getAngleBrackets().getEnd(),
11656       // FIXME. this should be '(' location
11657       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11658 }
11659 
11660 template<typename Derived>
11661 ExprResult
11662 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11663   TypeSourceInfo *TSI =
11664       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11665   if (!TSI)
11666     return ExprError();
11667 
11668   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11669   if (Sub.isInvalid())
11670     return ExprError();
11671 
11672   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11673                                                 Sub.get(), BCE->getEndLoc());
11674 }
11675 
11676 template<typename Derived>
11677 ExprResult
11678 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11679   return getDerived().TransformCXXNamedCastExpr(E);
11680 }
11681 
11682 template<typename Derived>
11683 ExprResult
11684 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11685   return getDerived().TransformCXXNamedCastExpr(E);
11686 }
11687 
11688 template<typename Derived>
11689 ExprResult
11690 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11691                                                       CXXReinterpretCastExpr *E) {
11692   return getDerived().TransformCXXNamedCastExpr(E);
11693 }
11694 
11695 template<typename Derived>
11696 ExprResult
11697 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11698   return getDerived().TransformCXXNamedCastExpr(E);
11699 }
11700 
11701 template<typename Derived>
11702 ExprResult
11703 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11704   return getDerived().TransformCXXNamedCastExpr(E);
11705 }
11706 
11707 template<typename Derived>
11708 ExprResult
11709 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11710                                                      CXXFunctionalCastExpr *E) {
11711   TypeSourceInfo *Type =
11712       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11713   if (!Type)
11714     return ExprError();
11715 
11716   ExprResult SubExpr
11717     = getDerived().TransformExpr(E->getSubExprAsWritten());
11718   if (SubExpr.isInvalid())
11719     return ExprError();
11720 
11721   if (!getDerived().AlwaysRebuild() &&
11722       Type == E->getTypeInfoAsWritten() &&
11723       SubExpr.get() == E->getSubExpr())
11724     return E;
11725 
11726   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11727                                                    E->getLParenLoc(),
11728                                                    SubExpr.get(),
11729                                                    E->getRParenLoc(),
11730                                                    E->isListInitialization());
11731 }
11732 
11733 template<typename Derived>
11734 ExprResult
11735 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11736   if (E->isTypeOperand()) {
11737     TypeSourceInfo *TInfo
11738       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11739     if (!TInfo)
11740       return ExprError();
11741 
11742     if (!getDerived().AlwaysRebuild() &&
11743         TInfo == E->getTypeOperandSourceInfo())
11744       return E;
11745 
11746     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11747                                              TInfo, E->getEndLoc());
11748   }
11749 
11750   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11751   // type.  We must not unilaterally enter unevaluated context here, as then
11752   // semantic processing can re-transform an already transformed operand.
11753   Expr *Op = E->getExprOperand();
11754   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11755   if (E->isGLValue())
11756     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11757       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11758         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11759 
11760   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11761                                                Sema::ReuseLambdaContextDecl);
11762 
11763   ExprResult SubExpr = getDerived().TransformExpr(Op);
11764   if (SubExpr.isInvalid())
11765     return ExprError();
11766 
11767   if (!getDerived().AlwaysRebuild() &&
11768       SubExpr.get() == E->getExprOperand())
11769     return E;
11770 
11771   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11772                                            SubExpr.get(), E->getEndLoc());
11773 }
11774 
11775 template<typename Derived>
11776 ExprResult
11777 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11778   if (E->isTypeOperand()) {
11779     TypeSourceInfo *TInfo
11780       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11781     if (!TInfo)
11782       return ExprError();
11783 
11784     if (!getDerived().AlwaysRebuild() &&
11785         TInfo == E->getTypeOperandSourceInfo())
11786       return E;
11787 
11788     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11789                                              TInfo, E->getEndLoc());
11790   }
11791 
11792   EnterExpressionEvaluationContext Unevaluated(
11793       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11794 
11795   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11796   if (SubExpr.isInvalid())
11797     return ExprError();
11798 
11799   if (!getDerived().AlwaysRebuild() &&
11800       SubExpr.get() == E->getExprOperand())
11801     return E;
11802 
11803   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11804                                            SubExpr.get(), E->getEndLoc());
11805 }
11806 
11807 template<typename Derived>
11808 ExprResult
11809 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11810   return E;
11811 }
11812 
11813 template<typename Derived>
11814 ExprResult
11815 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11816                                                      CXXNullPtrLiteralExpr *E) {
11817   return E;
11818 }
11819 
11820 template<typename Derived>
11821 ExprResult
11822 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11823   QualType T = getSema().getCurrentThisType();
11824 
11825   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11826     // Mark it referenced in the new context regardless.
11827     // FIXME: this is a bit instantiation-specific.
11828     getSema().MarkThisReferenced(E);
11829     return E;
11830   }
11831 
11832   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11833 }
11834 
11835 template<typename Derived>
11836 ExprResult
11837 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11838   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11839   if (SubExpr.isInvalid())
11840     return ExprError();
11841 
11842   if (!getDerived().AlwaysRebuild() &&
11843       SubExpr.get() == E->getSubExpr())
11844     return E;
11845 
11846   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11847                                           E->isThrownVariableInScope());
11848 }
11849 
11850 template<typename Derived>
11851 ExprResult
11852 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11853   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11854       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11855   if (!Param)
11856     return ExprError();
11857 
11858   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11859       E->getUsedContext() == SemaRef.CurContext)
11860     return E;
11861 
11862   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11863 }
11864 
11865 template<typename Derived>
11866 ExprResult
11867 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11868   FieldDecl *Field = cast_or_null<FieldDecl>(
11869       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11870   if (!Field)
11871     return ExprError();
11872 
11873   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11874       E->getUsedContext() == SemaRef.CurContext)
11875     return E;
11876 
11877   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11878 }
11879 
11880 template<typename Derived>
11881 ExprResult
11882 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11883                                                     CXXScalarValueInitExpr *E) {
11884   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11885   if (!T)
11886     return ExprError();
11887 
11888   if (!getDerived().AlwaysRebuild() &&
11889       T == E->getTypeSourceInfo())
11890     return E;
11891 
11892   return getDerived().RebuildCXXScalarValueInitExpr(T,
11893                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11894                                                     E->getRParenLoc());
11895 }
11896 
11897 template<typename Derived>
11898 ExprResult
11899 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11900   // Transform the type that we're allocating
11901   TypeSourceInfo *AllocTypeInfo =
11902       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11903   if (!AllocTypeInfo)
11904     return ExprError();
11905 
11906   // Transform the size of the array we're allocating (if any).
11907   Optional<Expr *> ArraySize;
11908   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11909     ExprResult NewArraySize;
11910     if (*OldArraySize) {
11911       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11912       if (NewArraySize.isInvalid())
11913         return ExprError();
11914     }
11915     ArraySize = NewArraySize.get();
11916   }
11917 
11918   // Transform the placement arguments (if any).
11919   bool ArgumentChanged = false;
11920   SmallVector<Expr*, 8> PlacementArgs;
11921   if (getDerived().TransformExprs(E->getPlacementArgs(),
11922                                   E->getNumPlacementArgs(), true,
11923                                   PlacementArgs, &ArgumentChanged))
11924     return ExprError();
11925 
11926   // Transform the initializer (if any).
11927   Expr *OldInit = E->getInitializer();
11928   ExprResult NewInit;
11929   if (OldInit)
11930     NewInit = getDerived().TransformInitializer(OldInit, true);
11931   if (NewInit.isInvalid())
11932     return ExprError();
11933 
11934   // Transform new operator and delete operator.
11935   FunctionDecl *OperatorNew = nullptr;
11936   if (E->getOperatorNew()) {
11937     OperatorNew = cast_or_null<FunctionDecl>(
11938         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11939     if (!OperatorNew)
11940       return ExprError();
11941   }
11942 
11943   FunctionDecl *OperatorDelete = nullptr;
11944   if (E->getOperatorDelete()) {
11945     OperatorDelete = cast_or_null<FunctionDecl>(
11946         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11947     if (!OperatorDelete)
11948       return ExprError();
11949   }
11950 
11951   if (!getDerived().AlwaysRebuild() &&
11952       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11953       ArraySize == E->getArraySize() &&
11954       NewInit.get() == OldInit &&
11955       OperatorNew == E->getOperatorNew() &&
11956       OperatorDelete == E->getOperatorDelete() &&
11957       !ArgumentChanged) {
11958     // Mark any declarations we need as referenced.
11959     // FIXME: instantiation-specific.
11960     if (OperatorNew)
11961       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11962     if (OperatorDelete)
11963       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11964 
11965     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11966       QualType ElementType
11967         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11968       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11969         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11970         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11971           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11972         }
11973       }
11974     }
11975 
11976     return E;
11977   }
11978 
11979   QualType AllocType = AllocTypeInfo->getType();
11980   if (!ArraySize) {
11981     // If no array size was specified, but the new expression was
11982     // instantiated with an array type (e.g., "new T" where T is
11983     // instantiated with "int[4]"), extract the outer bound from the
11984     // array type as our array size. We do this with constant and
11985     // dependently-sized array types.
11986     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11987     if (!ArrayT) {
11988       // Do nothing
11989     } else if (const ConstantArrayType *ConsArrayT
11990                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11991       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11992                                          SemaRef.Context.getSizeType(),
11993                                          /*FIXME:*/ E->getBeginLoc());
11994       AllocType = ConsArrayT->getElementType();
11995     } else if (const DependentSizedArrayType *DepArrayT
11996                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11997       if (DepArrayT->getSizeExpr()) {
11998         ArraySize = DepArrayT->getSizeExpr();
11999         AllocType = DepArrayT->getElementType();
12000       }
12001     }
12002   }
12003 
12004   return getDerived().RebuildCXXNewExpr(
12005       E->getBeginLoc(), E->isGlobalNew(),
12006       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
12007       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
12008       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
12009 }
12010 
12011 template<typename Derived>
12012 ExprResult
12013 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
12014   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
12015   if (Operand.isInvalid())
12016     return ExprError();
12017 
12018   // Transform the delete operator, if known.
12019   FunctionDecl *OperatorDelete = nullptr;
12020   if (E->getOperatorDelete()) {
12021     OperatorDelete = cast_or_null<FunctionDecl>(
12022         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
12023     if (!OperatorDelete)
12024       return ExprError();
12025   }
12026 
12027   if (!getDerived().AlwaysRebuild() &&
12028       Operand.get() == E->getArgument() &&
12029       OperatorDelete == E->getOperatorDelete()) {
12030     // Mark any declarations we need as referenced.
12031     // FIXME: instantiation-specific.
12032     if (OperatorDelete)
12033       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
12034 
12035     if (!E->getArgument()->isTypeDependent()) {
12036       QualType Destroyed = SemaRef.Context.getBaseElementType(
12037                                                          E->getDestroyedType());
12038       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
12039         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
12040         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
12041                                        SemaRef.LookupDestructor(Record));
12042       }
12043     }
12044 
12045     return E;
12046   }
12047 
12048   return getDerived().RebuildCXXDeleteExpr(
12049       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
12050 }
12051 
12052 template<typename Derived>
12053 ExprResult
12054 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
12055                                                      CXXPseudoDestructorExpr *E) {
12056   ExprResult Base = getDerived().TransformExpr(E->getBase());
12057   if (Base.isInvalid())
12058     return ExprError();
12059 
12060   ParsedType ObjectTypePtr;
12061   bool MayBePseudoDestructor = false;
12062   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12063                                               E->getOperatorLoc(),
12064                                         E->isArrow()? tok::arrow : tok::period,
12065                                               ObjectTypePtr,
12066                                               MayBePseudoDestructor);
12067   if (Base.isInvalid())
12068     return ExprError();
12069 
12070   QualType ObjectType = ObjectTypePtr.get();
12071   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12072   if (QualifierLoc) {
12073     QualifierLoc
12074       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12075     if (!QualifierLoc)
12076       return ExprError();
12077   }
12078   CXXScopeSpec SS;
12079   SS.Adopt(QualifierLoc);
12080 
12081   PseudoDestructorTypeStorage Destroyed;
12082   if (E->getDestroyedTypeInfo()) {
12083     TypeSourceInfo *DestroyedTypeInfo
12084       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12085                                                 ObjectType, nullptr, SS);
12086     if (!DestroyedTypeInfo)
12087       return ExprError();
12088     Destroyed = DestroyedTypeInfo;
12089   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12090     // We aren't likely to be able to resolve the identifier down to a type
12091     // now anyway, so just retain the identifier.
12092     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12093                                             E->getDestroyedTypeLoc());
12094   } else {
12095     // Look for a destructor known with the given name.
12096     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12097                                               *E->getDestroyedTypeIdentifier(),
12098                                                 E->getDestroyedTypeLoc(),
12099                                                 /*Scope=*/nullptr,
12100                                                 SS, ObjectTypePtr,
12101                                                 false);
12102     if (!T)
12103       return ExprError();
12104 
12105     Destroyed
12106       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12107                                                  E->getDestroyedTypeLoc());
12108   }
12109 
12110   TypeSourceInfo *ScopeTypeInfo = nullptr;
12111   if (E->getScopeTypeInfo()) {
12112     CXXScopeSpec EmptySS;
12113     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12114                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12115     if (!ScopeTypeInfo)
12116       return ExprError();
12117   }
12118 
12119   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12120                                                      E->getOperatorLoc(),
12121                                                      E->isArrow(),
12122                                                      SS,
12123                                                      ScopeTypeInfo,
12124                                                      E->getColonColonLoc(),
12125                                                      E->getTildeLoc(),
12126                                                      Destroyed);
12127 }
12128 
12129 template <typename Derived>
12130 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12131                                                         bool RequiresADL,
12132                                                         LookupResult &R) {
12133   // Transform all the decls.
12134   bool AllEmptyPacks = true;
12135   for (auto *OldD : Old->decls()) {
12136     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12137     if (!InstD) {
12138       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12139       // This can happen because of dependent hiding.
12140       if (isa<UsingShadowDecl>(OldD))
12141         continue;
12142       else {
12143         R.clear();
12144         return true;
12145       }
12146     }
12147 
12148     // Expand using pack declarations.
12149     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12150     ArrayRef<NamedDecl*> Decls = SingleDecl;
12151     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12152       Decls = UPD->expansions();
12153 
12154     // Expand using declarations.
12155     for (auto *D : Decls) {
12156       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12157         for (auto *SD : UD->shadows())
12158           R.addDecl(SD);
12159       } else {
12160         R.addDecl(D);
12161       }
12162     }
12163 
12164     AllEmptyPacks &= Decls.empty();
12165   };
12166 
12167   // C++ [temp.res]/8.4.2:
12168   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12169   //   a name in the template definition found a using-declaration, but the
12170   //   lookup in the corresponding scope in the instantiation odoes not find
12171   //   any declarations because the using-declaration was a pack expansion and
12172   //   the corresponding pack is empty
12173   if (AllEmptyPacks && !RequiresADL) {
12174     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12175         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12176     return true;
12177   }
12178 
12179   // Resolve a kind, but don't do any further analysis.  If it's
12180   // ambiguous, the callee needs to deal with it.
12181   R.resolveKind();
12182   return false;
12183 }
12184 
12185 template<typename Derived>
12186 ExprResult
12187 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12188                                                   UnresolvedLookupExpr *Old) {
12189   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12190                  Sema::LookupOrdinaryName);
12191 
12192   // Transform the declaration set.
12193   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12194     return ExprError();
12195 
12196   // Rebuild the nested-name qualifier, if present.
12197   CXXScopeSpec SS;
12198   if (Old->getQualifierLoc()) {
12199     NestedNameSpecifierLoc QualifierLoc
12200       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12201     if (!QualifierLoc)
12202       return ExprError();
12203 
12204     SS.Adopt(QualifierLoc);
12205   }
12206 
12207   if (Old->getNamingClass()) {
12208     CXXRecordDecl *NamingClass
12209       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12210                                                             Old->getNameLoc(),
12211                                                         Old->getNamingClass()));
12212     if (!NamingClass) {
12213       R.clear();
12214       return ExprError();
12215     }
12216 
12217     R.setNamingClass(NamingClass);
12218   }
12219 
12220   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12221 
12222   // If we have neither explicit template arguments, nor the template keyword,
12223   // it's a normal declaration name or member reference.
12224   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12225     NamedDecl *D = R.getAsSingle<NamedDecl>();
12226     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12227     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12228     // give a good diagnostic.
12229     if (D && D->isCXXInstanceMember()) {
12230       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12231                                                      /*TemplateArgs=*/nullptr,
12232                                                      /*Scope=*/nullptr);
12233     }
12234 
12235     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12236   }
12237 
12238   // If we have template arguments, rebuild them, then rebuild the
12239   // templateid expression.
12240   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12241   if (Old->hasExplicitTemplateArgs() &&
12242       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12243                                               Old->getNumTemplateArgs(),
12244                                               TransArgs)) {
12245     R.clear();
12246     return ExprError();
12247   }
12248 
12249   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12250                                             Old->requiresADL(), &TransArgs);
12251 }
12252 
12253 template<typename Derived>
12254 ExprResult
12255 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12256   bool ArgChanged = false;
12257   SmallVector<TypeSourceInfo *, 4> Args;
12258   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12259     TypeSourceInfo *From = E->getArg(I);
12260     TypeLoc FromTL = From->getTypeLoc();
12261     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12262       TypeLocBuilder TLB;
12263       TLB.reserve(FromTL.getFullDataSize());
12264       QualType To = getDerived().TransformType(TLB, FromTL);
12265       if (To.isNull())
12266         return ExprError();
12267 
12268       if (To == From->getType())
12269         Args.push_back(From);
12270       else {
12271         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12272         ArgChanged = true;
12273       }
12274       continue;
12275     }
12276 
12277     ArgChanged = true;
12278 
12279     // We have a pack expansion. Instantiate it.
12280     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12281     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12282     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12283     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12284 
12285     // Determine whether the set of unexpanded parameter packs can and should
12286     // be expanded.
12287     bool Expand = true;
12288     bool RetainExpansion = false;
12289     Optional<unsigned> OrigNumExpansions =
12290         ExpansionTL.getTypePtr()->getNumExpansions();
12291     Optional<unsigned> NumExpansions = OrigNumExpansions;
12292     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12293                                              PatternTL.getSourceRange(),
12294                                              Unexpanded,
12295                                              Expand, RetainExpansion,
12296                                              NumExpansions))
12297       return ExprError();
12298 
12299     if (!Expand) {
12300       // The transform has determined that we should perform a simple
12301       // transformation on the pack expansion, producing another pack
12302       // expansion.
12303       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12304 
12305       TypeLocBuilder TLB;
12306       TLB.reserve(From->getTypeLoc().getFullDataSize());
12307 
12308       QualType To = getDerived().TransformType(TLB, PatternTL);
12309       if (To.isNull())
12310         return ExprError();
12311 
12312       To = getDerived().RebuildPackExpansionType(To,
12313                                                  PatternTL.getSourceRange(),
12314                                                  ExpansionTL.getEllipsisLoc(),
12315                                                  NumExpansions);
12316       if (To.isNull())
12317         return ExprError();
12318 
12319       PackExpansionTypeLoc ToExpansionTL
12320         = TLB.push<PackExpansionTypeLoc>(To);
12321       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12322       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12323       continue;
12324     }
12325 
12326     // Expand the pack expansion by substituting for each argument in the
12327     // pack(s).
12328     for (unsigned I = 0; I != *NumExpansions; ++I) {
12329       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12330       TypeLocBuilder TLB;
12331       TLB.reserve(PatternTL.getFullDataSize());
12332       QualType To = getDerived().TransformType(TLB, PatternTL);
12333       if (To.isNull())
12334         return ExprError();
12335 
12336       if (To->containsUnexpandedParameterPack()) {
12337         To = getDerived().RebuildPackExpansionType(To,
12338                                                    PatternTL.getSourceRange(),
12339                                                    ExpansionTL.getEllipsisLoc(),
12340                                                    NumExpansions);
12341         if (To.isNull())
12342           return ExprError();
12343 
12344         PackExpansionTypeLoc ToExpansionTL
12345           = TLB.push<PackExpansionTypeLoc>(To);
12346         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12347       }
12348 
12349       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12350     }
12351 
12352     if (!RetainExpansion)
12353       continue;
12354 
12355     // If we're supposed to retain a pack expansion, do so by temporarily
12356     // forgetting the partially-substituted parameter pack.
12357     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12358 
12359     TypeLocBuilder TLB;
12360     TLB.reserve(From->getTypeLoc().getFullDataSize());
12361 
12362     QualType To = getDerived().TransformType(TLB, PatternTL);
12363     if (To.isNull())
12364       return ExprError();
12365 
12366     To = getDerived().RebuildPackExpansionType(To,
12367                                                PatternTL.getSourceRange(),
12368                                                ExpansionTL.getEllipsisLoc(),
12369                                                NumExpansions);
12370     if (To.isNull())
12371       return ExprError();
12372 
12373     PackExpansionTypeLoc ToExpansionTL
12374       = TLB.push<PackExpansionTypeLoc>(To);
12375     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12376     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12377   }
12378 
12379   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12380     return E;
12381 
12382   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12383                                        E->getEndLoc());
12384 }
12385 
12386 template<typename Derived>
12387 ExprResult
12388 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12389                                                  ConceptSpecializationExpr *E) {
12390   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12391   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12392   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12393                                               Old->NumTemplateArgs, TransArgs))
12394     return ExprError();
12395 
12396   return getDerived().RebuildConceptSpecializationExpr(
12397       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12398       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12399       &TransArgs);
12400 }
12401 
12402 template<typename Derived>
12403 ExprResult
12404 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12405   SmallVector<ParmVarDecl*, 4> TransParams;
12406   SmallVector<QualType, 4> TransParamTypes;
12407   Sema::ExtParameterInfoBuilder ExtParamInfos;
12408 
12409   // C++2a [expr.prim.req]p2
12410   // Expressions appearing within a requirement-body are unevaluated operands.
12411   EnterExpressionEvaluationContext Ctx(
12412       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12413 
12414   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12415       getSema().Context, getSema().CurContext,
12416       E->getBody()->getBeginLoc());
12417 
12418   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12419 
12420   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12421                                                E->getLocalParameters(),
12422                                                /*ParamTypes=*/nullptr,
12423                                                /*ParamInfos=*/nullptr,
12424                                                TransParamTypes, &TransParams,
12425                                                ExtParamInfos))
12426     return ExprError();
12427 
12428   for (ParmVarDecl *Param : TransParams)
12429     Param->setDeclContext(Body);
12430 
12431   SmallVector<concepts::Requirement *, 4> TransReqs;
12432   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12433                                                      TransReqs))
12434     return ExprError();
12435 
12436   for (concepts::Requirement *Req : TransReqs) {
12437     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12438       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12439         ER->getReturnTypeRequirement()
12440                 .getTypeConstraintTemplateParameterList()->getParam(0)
12441                 ->setDeclContext(Body);
12442       }
12443     }
12444   }
12445 
12446   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12447                                           TransParams, TransReqs,
12448                                           E->getRBraceLoc());
12449 }
12450 
12451 template<typename Derived>
12452 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12453     ArrayRef<concepts::Requirement *> Reqs,
12454     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12455   for (concepts::Requirement *Req : Reqs) {
12456     concepts::Requirement *TransReq = nullptr;
12457     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12458       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12459     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12460       TransReq = getDerived().TransformExprRequirement(ExprReq);
12461     else
12462       TransReq = getDerived().TransformNestedRequirement(
12463                      cast<concepts::NestedRequirement>(Req));
12464     if (!TransReq)
12465       return true;
12466     Transformed.push_back(TransReq);
12467   }
12468   return false;
12469 }
12470 
12471 template<typename Derived>
12472 concepts::TypeRequirement *
12473 TreeTransform<Derived>::TransformTypeRequirement(
12474     concepts::TypeRequirement *Req) {
12475   if (Req->isSubstitutionFailure()) {
12476     if (getDerived().AlwaysRebuild())
12477       return getDerived().RebuildTypeRequirement(
12478               Req->getSubstitutionDiagnostic());
12479     return Req;
12480   }
12481   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12482   if (!TransType)
12483     return nullptr;
12484   return getDerived().RebuildTypeRequirement(TransType);
12485 }
12486 
12487 template<typename Derived>
12488 concepts::ExprRequirement *
12489 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12490   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12491   if (Req->isExprSubstitutionFailure())
12492     TransExpr = Req->getExprSubstitutionDiagnostic();
12493   else {
12494     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12495     if (TransExprRes.isInvalid())
12496       return nullptr;
12497     TransExpr = TransExprRes.get();
12498   }
12499 
12500   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12501   const auto &RetReq = Req->getReturnTypeRequirement();
12502   if (RetReq.isEmpty())
12503     TransRetReq.emplace();
12504   else if (RetReq.isSubstitutionFailure())
12505     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12506   else if (RetReq.isTypeConstraint()) {
12507     TemplateParameterList *OrigTPL =
12508         RetReq.getTypeConstraintTemplateParameterList();
12509     TemplateParameterList *TPL =
12510         getDerived().TransformTemplateParameterList(OrigTPL);
12511     if (!TPL)
12512       return nullptr;
12513     TransRetReq.emplace(TPL);
12514   }
12515   assert(TransRetReq.hasValue() &&
12516          "All code paths leading here must set TransRetReq");
12517   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12518     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12519                                                Req->getNoexceptLoc(),
12520                                                std::move(*TransRetReq));
12521   return getDerived().RebuildExprRequirement(
12522       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12523       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12524 }
12525 
12526 template<typename Derived>
12527 concepts::NestedRequirement *
12528 TreeTransform<Derived>::TransformNestedRequirement(
12529     concepts::NestedRequirement *Req) {
12530   if (Req->isSubstitutionFailure()) {
12531     if (getDerived().AlwaysRebuild())
12532       return getDerived().RebuildNestedRequirement(
12533           Req->getSubstitutionDiagnostic());
12534     return Req;
12535   }
12536   ExprResult TransConstraint =
12537       getDerived().TransformExpr(Req->getConstraintExpr());
12538   if (TransConstraint.isInvalid())
12539     return nullptr;
12540   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12541 }
12542 
12543 template<typename Derived>
12544 ExprResult
12545 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12546   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12547   if (!T)
12548     return ExprError();
12549 
12550   if (!getDerived().AlwaysRebuild() &&
12551       T == E->getQueriedTypeSourceInfo())
12552     return E;
12553 
12554   ExprResult SubExpr;
12555   {
12556     EnterExpressionEvaluationContext Unevaluated(
12557         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12558     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12559     if (SubExpr.isInvalid())
12560       return ExprError();
12561 
12562     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12563       return E;
12564   }
12565 
12566   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12567                                             SubExpr.get(), E->getEndLoc());
12568 }
12569 
12570 template<typename Derived>
12571 ExprResult
12572 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12573   ExprResult SubExpr;
12574   {
12575     EnterExpressionEvaluationContext Unevaluated(
12576         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12577     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12578     if (SubExpr.isInvalid())
12579       return ExprError();
12580 
12581     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12582       return E;
12583   }
12584 
12585   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12586                                              SubExpr.get(), E->getEndLoc());
12587 }
12588 
12589 template <typename Derived>
12590 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12591     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12592     TypeSourceInfo **RecoveryTSI) {
12593   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12594       DRE, AddrTaken, RecoveryTSI);
12595 
12596   // Propagate both errors and recovered types, which return ExprEmpty.
12597   if (!NewDRE.isUsable())
12598     return NewDRE;
12599 
12600   // We got an expr, wrap it up in parens.
12601   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12602     return PE;
12603   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12604                                        PE->getRParen());
12605 }
12606 
12607 template <typename Derived>
12608 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12609     DependentScopeDeclRefExpr *E) {
12610   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12611                                             nullptr);
12612 }
12613 
12614 template <typename Derived>
12615 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12616     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12617     TypeSourceInfo **RecoveryTSI) {
12618   assert(E->getQualifierLoc());
12619   NestedNameSpecifierLoc QualifierLoc =
12620       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12621   if (!QualifierLoc)
12622     return ExprError();
12623   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12624 
12625   // TODO: If this is a conversion-function-id, verify that the
12626   // destination type name (if present) resolves the same way after
12627   // instantiation as it did in the local scope.
12628 
12629   DeclarationNameInfo NameInfo =
12630       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12631   if (!NameInfo.getName())
12632     return ExprError();
12633 
12634   if (!E->hasExplicitTemplateArgs()) {
12635     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12636         // Note: it is sufficient to compare the Name component of NameInfo:
12637         // if name has not changed, DNLoc has not changed either.
12638         NameInfo.getName() == E->getDeclName())
12639       return E;
12640 
12641     return getDerived().RebuildDependentScopeDeclRefExpr(
12642         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12643         IsAddressOfOperand, RecoveryTSI);
12644   }
12645 
12646   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12647   if (getDerived().TransformTemplateArguments(
12648           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12649     return ExprError();
12650 
12651   return getDerived().RebuildDependentScopeDeclRefExpr(
12652       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12653       RecoveryTSI);
12654 }
12655 
12656 template<typename Derived>
12657 ExprResult
12658 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12659   // CXXConstructExprs other than for list-initialization and
12660   // CXXTemporaryObjectExpr are always implicit, so when we have
12661   // a 1-argument construction we just transform that argument.
12662   if (getDerived().AllowSkippingCXXConstructExpr() &&
12663       ((E->getNumArgs() == 1 ||
12664         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12665        (!getDerived().DropCallArgument(E->getArg(0))) &&
12666        !E->isListInitialization()))
12667     return getDerived().TransformInitializer(E->getArg(0),
12668                                              /*DirectInit*/ false);
12669 
12670   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12671 
12672   QualType T = getDerived().TransformType(E->getType());
12673   if (T.isNull())
12674     return ExprError();
12675 
12676   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12677       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12678   if (!Constructor)
12679     return ExprError();
12680 
12681   bool ArgumentChanged = false;
12682   SmallVector<Expr*, 8> Args;
12683   {
12684     EnterExpressionEvaluationContext Context(
12685         getSema(), EnterExpressionEvaluationContext::InitList,
12686         E->isListInitialization());
12687     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12688                                     &ArgumentChanged))
12689       return ExprError();
12690   }
12691 
12692   if (!getDerived().AlwaysRebuild() &&
12693       T == E->getType() &&
12694       Constructor == E->getConstructor() &&
12695       !ArgumentChanged) {
12696     // Mark the constructor as referenced.
12697     // FIXME: Instantiation-specific
12698     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12699     return E;
12700   }
12701 
12702   return getDerived().RebuildCXXConstructExpr(
12703       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12704       E->hadMultipleCandidates(), E->isListInitialization(),
12705       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12706       E->getConstructionKind(), E->getParenOrBraceRange());
12707 }
12708 
12709 template<typename Derived>
12710 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12711     CXXInheritedCtorInitExpr *E) {
12712   QualType T = getDerived().TransformType(E->getType());
12713   if (T.isNull())
12714     return ExprError();
12715 
12716   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12717       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12718   if (!Constructor)
12719     return ExprError();
12720 
12721   if (!getDerived().AlwaysRebuild() &&
12722       T == E->getType() &&
12723       Constructor == E->getConstructor()) {
12724     // Mark the constructor as referenced.
12725     // FIXME: Instantiation-specific
12726     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12727     return E;
12728   }
12729 
12730   return getDerived().RebuildCXXInheritedCtorInitExpr(
12731       T, E->getLocation(), Constructor,
12732       E->constructsVBase(), E->inheritedFromVBase());
12733 }
12734 
12735 /// Transform a C++ temporary-binding expression.
12736 ///
12737 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12738 /// transform the subexpression and return that.
12739 template<typename Derived>
12740 ExprResult
12741 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12742   return getDerived().TransformExpr(E->getSubExpr());
12743 }
12744 
12745 /// Transform a C++ expression that contains cleanups that should
12746 /// be run after the expression is evaluated.
12747 ///
12748 /// Since ExprWithCleanups nodes are implicitly generated, we
12749 /// just transform the subexpression and return that.
12750 template<typename Derived>
12751 ExprResult
12752 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12753   return getDerived().TransformExpr(E->getSubExpr());
12754 }
12755 
12756 template<typename Derived>
12757 ExprResult
12758 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12759                                                     CXXTemporaryObjectExpr *E) {
12760   TypeSourceInfo *T =
12761       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12762   if (!T)
12763     return ExprError();
12764 
12765   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12766       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12767   if (!Constructor)
12768     return ExprError();
12769 
12770   bool ArgumentChanged = false;
12771   SmallVector<Expr*, 8> Args;
12772   Args.reserve(E->getNumArgs());
12773   {
12774     EnterExpressionEvaluationContext Context(
12775         getSema(), EnterExpressionEvaluationContext::InitList,
12776         E->isListInitialization());
12777     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12778                        &ArgumentChanged))
12779       return ExprError();
12780   }
12781 
12782   if (!getDerived().AlwaysRebuild() &&
12783       T == E->getTypeSourceInfo() &&
12784       Constructor == E->getConstructor() &&
12785       !ArgumentChanged) {
12786     // FIXME: Instantiation-specific
12787     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12788     return SemaRef.MaybeBindToTemporary(E);
12789   }
12790 
12791   // FIXME: We should just pass E->isListInitialization(), but we're not
12792   // prepared to handle list-initialization without a child InitListExpr.
12793   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12794   return getDerived().RebuildCXXTemporaryObjectExpr(
12795       T, LParenLoc, Args, E->getEndLoc(),
12796       /*ListInitialization=*/LParenLoc.isInvalid());
12797 }
12798 
12799 template<typename Derived>
12800 ExprResult
12801 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12802   // Transform any init-capture expressions before entering the scope of the
12803   // lambda body, because they are not semantically within that scope.
12804   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12805   struct TransformedInitCapture {
12806     // The location of the ... if the result is retaining a pack expansion.
12807     SourceLocation EllipsisLoc;
12808     // Zero or more expansions of the init-capture.
12809     SmallVector<InitCaptureInfoTy, 4> Expansions;
12810   };
12811   SmallVector<TransformedInitCapture, 4> InitCaptures;
12812   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12813   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12814                                     CEnd = E->capture_end();
12815        C != CEnd; ++C) {
12816     if (!E->isInitCapture(C))
12817       continue;
12818 
12819     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12820     VarDecl *OldVD = C->getCapturedVar();
12821 
12822     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12823                                 Optional<unsigned> NumExpansions) {
12824       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12825           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12826 
12827       if (NewExprInitResult.isInvalid()) {
12828         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12829         return;
12830       }
12831       Expr *NewExprInit = NewExprInitResult.get();
12832 
12833       QualType NewInitCaptureType =
12834           getSema().buildLambdaInitCaptureInitialization(
12835               C->getLocation(), OldVD->getType()->isReferenceType(),
12836               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12837               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12838               NewExprInit);
12839       Result.Expansions.push_back(
12840           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12841     };
12842 
12843     // If this is an init-capture pack, consider expanding the pack now.
12844     if (OldVD->isParameterPack()) {
12845       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12846                                              ->getTypeLoc()
12847                                              .castAs<PackExpansionTypeLoc>();
12848       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12849       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12850 
12851       // Determine whether the set of unexpanded parameter packs can and should
12852       // be expanded.
12853       bool Expand = true;
12854       bool RetainExpansion = false;
12855       Optional<unsigned> OrigNumExpansions =
12856           ExpansionTL.getTypePtr()->getNumExpansions();
12857       Optional<unsigned> NumExpansions = OrigNumExpansions;
12858       if (getDerived().TryExpandParameterPacks(
12859               ExpansionTL.getEllipsisLoc(),
12860               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12861               RetainExpansion, NumExpansions))
12862         return ExprError();
12863       if (Expand) {
12864         for (unsigned I = 0; I != *NumExpansions; ++I) {
12865           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12866           SubstInitCapture(SourceLocation(), None);
12867         }
12868       }
12869       if (!Expand || RetainExpansion) {
12870         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12871         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12872         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12873       }
12874     } else {
12875       SubstInitCapture(SourceLocation(), None);
12876     }
12877   }
12878 
12879   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12880   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12881 
12882   // Transform the template parameters, and add them to the current
12883   // instantiation scope. The null case is handled correctly.
12884   auto TPL = getDerived().TransformTemplateParameterList(
12885       E->getTemplateParameterList());
12886   LSI->GLTemplateParameterList = TPL;
12887 
12888   // Transform the type of the original lambda's call operator.
12889   // The transformation MUST be done in the CurrentInstantiationScope since
12890   // it introduces a mapping of the original to the newly created
12891   // transformed parameters.
12892   TypeSourceInfo *NewCallOpTSI = nullptr;
12893   {
12894     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12895     FunctionProtoTypeLoc OldCallOpFPTL =
12896         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12897 
12898     TypeLocBuilder NewCallOpTLBuilder;
12899     SmallVector<QualType, 4> ExceptionStorage;
12900     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12901     QualType NewCallOpType = TransformFunctionProtoType(
12902         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12903         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12904           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12905                                               ExceptionStorage, Changed);
12906         });
12907     if (NewCallOpType.isNull())
12908       return ExprError();
12909     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12910                                                         NewCallOpType);
12911   }
12912 
12913   // Transform the trailing requires clause
12914   ExprResult NewTrailingRequiresClause;
12915   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12916     // FIXME: Concepts: Substitution into requires clause should only happen
12917     //                  when checking satisfaction.
12918     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12919 
12920   // Create the local class that will describe the lambda.
12921   // FIXME: KnownDependent below is wrong when substituting inside a templated
12922   // context that isn't a DeclContext (such as a variable template).
12923   CXXRecordDecl *OldClass = E->getLambdaClass();
12924   CXXRecordDecl *Class
12925     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12926                                         NewCallOpTSI,
12927                                         /*KnownDependent=*/false,
12928                                         E->getCaptureDefault());
12929   getDerived().transformedLocalDecl(OldClass, {Class});
12930 
12931   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12932   if (getDerived().ReplacingOriginal())
12933     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12934                                OldClass->getLambdaManglingNumber(),
12935                                OldClass->getDeviceLambdaManglingNumber(),
12936                                OldClass->getLambdaContextDecl());
12937 
12938   // Build the call operator.
12939   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12940       Class, E->getIntroducerRange(), NewCallOpTSI,
12941       E->getCallOperator()->getEndLoc(),
12942       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12943       E->getCallOperator()->getConstexprKind(),
12944       NewTrailingRequiresClause.get());
12945 
12946   LSI->CallOperator = NewCallOperator;
12947 
12948   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12949   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12950 
12951   // Number the lambda for linkage purposes if necessary.
12952   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12953 
12954   // Introduce the context of the call operator.
12955   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12956                                  /*NewThisContext*/false);
12957 
12958   // Enter the scope of the lambda.
12959   getSema().buildLambdaScope(LSI, NewCallOperator,
12960                              E->getIntroducerRange(),
12961                              E->getCaptureDefault(),
12962                              E->getCaptureDefaultLoc(),
12963                              E->hasExplicitParameters(),
12964                              E->hasExplicitResultType(),
12965                              E->isMutable());
12966 
12967   bool Invalid = false;
12968 
12969   // Transform captures.
12970   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12971                                  CEnd = E->capture_end();
12972        C != CEnd; ++C) {
12973     // When we hit the first implicit capture, tell Sema that we've finished
12974     // the list of explicit captures.
12975     if (C->isImplicit())
12976       break;
12977 
12978     // Capturing 'this' is trivial.
12979     if (C->capturesThis()) {
12980       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12981                                     /*BuildAndDiagnose*/ true, nullptr,
12982                                     C->getCaptureKind() == LCK_StarThis);
12983       continue;
12984     }
12985     // Captured expression will be recaptured during captured variables
12986     // rebuilding.
12987     if (C->capturesVLAType())
12988       continue;
12989 
12990     // Rebuild init-captures, including the implied field declaration.
12991     if (E->isInitCapture(C)) {
12992       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12993 
12994       VarDecl *OldVD = C->getCapturedVar();
12995       llvm::SmallVector<Decl*, 4> NewVDs;
12996 
12997       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12998         ExprResult Init = Info.first;
12999         QualType InitQualType = Info.second;
13000         if (Init.isInvalid() || InitQualType.isNull()) {
13001           Invalid = true;
13002           break;
13003         }
13004         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
13005             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
13006             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
13007         if (!NewVD) {
13008           Invalid = true;
13009           break;
13010         }
13011         NewVDs.push_back(NewVD);
13012         getSema().addInitCapture(LSI, NewVD);
13013       }
13014 
13015       if (Invalid)
13016         break;
13017 
13018       getDerived().transformedLocalDecl(OldVD, NewVDs);
13019       continue;
13020     }
13021 
13022     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13023 
13024     // Determine the capture kind for Sema.
13025     Sema::TryCaptureKind Kind
13026       = C->isImplicit()? Sema::TryCapture_Implicit
13027                        : C->getCaptureKind() == LCK_ByCopy
13028                            ? Sema::TryCapture_ExplicitByVal
13029                            : Sema::TryCapture_ExplicitByRef;
13030     SourceLocation EllipsisLoc;
13031     if (C->isPackExpansion()) {
13032       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
13033       bool ShouldExpand = false;
13034       bool RetainExpansion = false;
13035       Optional<unsigned> NumExpansions;
13036       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
13037                                                C->getLocation(),
13038                                                Unexpanded,
13039                                                ShouldExpand, RetainExpansion,
13040                                                NumExpansions)) {
13041         Invalid = true;
13042         continue;
13043       }
13044 
13045       if (ShouldExpand) {
13046         // The transform has determined that we should perform an expansion;
13047         // transform and capture each of the arguments.
13048         // expansion of the pattern. Do so.
13049         VarDecl *Pack = C->getCapturedVar();
13050         for (unsigned I = 0; I != *NumExpansions; ++I) {
13051           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13052           VarDecl *CapturedVar
13053             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13054                                                                Pack));
13055           if (!CapturedVar) {
13056             Invalid = true;
13057             continue;
13058           }
13059 
13060           // Capture the transformed variable.
13061           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
13062         }
13063 
13064         // FIXME: Retain a pack expansion if RetainExpansion is true.
13065 
13066         continue;
13067       }
13068 
13069       EllipsisLoc = C->getEllipsisLoc();
13070     }
13071 
13072     // Transform the captured variable.
13073     VarDecl *CapturedVar
13074       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13075                                                          C->getCapturedVar()));
13076     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13077       Invalid = true;
13078       continue;
13079     }
13080 
13081     // Capture the transformed variable.
13082     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13083                                  EllipsisLoc);
13084   }
13085   getSema().finishLambdaExplicitCaptures(LSI);
13086 
13087   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13088   // evaluation context even if we're not transforming the function body.
13089   getSema().PushExpressionEvaluationContext(
13090       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13091 
13092   // Instantiate the body of the lambda expression.
13093   StmtResult Body =
13094       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13095 
13096   // ActOnLambda* will pop the function scope for us.
13097   FuncScopeCleanup.disable();
13098 
13099   if (Body.isInvalid()) {
13100     SavedContext.pop();
13101     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13102                                /*IsInstantiation=*/true);
13103     return ExprError();
13104   }
13105 
13106   // Copy the LSI before ActOnFinishFunctionBody removes it.
13107   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13108   // the call operator.
13109   auto LSICopy = *LSI;
13110   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13111                                     /*IsInstantiation*/ true);
13112   SavedContext.pop();
13113 
13114   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13115                                    &LSICopy);
13116 }
13117 
13118 template<typename Derived>
13119 StmtResult
13120 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13121   return TransformStmt(S);
13122 }
13123 
13124 template<typename Derived>
13125 StmtResult
13126 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13127   // Transform captures.
13128   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13129                                  CEnd = E->capture_end();
13130        C != CEnd; ++C) {
13131     // When we hit the first implicit capture, tell Sema that we've finished
13132     // the list of explicit captures.
13133     if (!C->isImplicit())
13134       continue;
13135 
13136     // Capturing 'this' is trivial.
13137     if (C->capturesThis()) {
13138       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13139                                     /*BuildAndDiagnose*/ true, nullptr,
13140                                     C->getCaptureKind() == LCK_StarThis);
13141       continue;
13142     }
13143     // Captured expression will be recaptured during captured variables
13144     // rebuilding.
13145     if (C->capturesVLAType())
13146       continue;
13147 
13148     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13149     assert(!E->isInitCapture(C) && "implicit init-capture?");
13150 
13151     // Transform the captured variable.
13152     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13153         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13154     if (!CapturedVar || CapturedVar->isInvalidDecl())
13155       return StmtError();
13156 
13157     // Capture the transformed variable.
13158     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13159   }
13160 
13161   return S;
13162 }
13163 
13164 template<typename Derived>
13165 ExprResult
13166 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13167                                                   CXXUnresolvedConstructExpr *E) {
13168   TypeSourceInfo *T =
13169       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13170   if (!T)
13171     return ExprError();
13172 
13173   bool ArgumentChanged = false;
13174   SmallVector<Expr*, 8> Args;
13175   Args.reserve(E->getNumArgs());
13176   {
13177     EnterExpressionEvaluationContext Context(
13178         getSema(), EnterExpressionEvaluationContext::InitList,
13179         E->isListInitialization());
13180     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13181                                     &ArgumentChanged))
13182       return ExprError();
13183   }
13184 
13185   if (!getDerived().AlwaysRebuild() &&
13186       T == E->getTypeSourceInfo() &&
13187       !ArgumentChanged)
13188     return E;
13189 
13190   // FIXME: we're faking the locations of the commas
13191   return getDerived().RebuildCXXUnresolvedConstructExpr(
13192       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13193 }
13194 
13195 template<typename Derived>
13196 ExprResult
13197 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13198                                              CXXDependentScopeMemberExpr *E) {
13199   // Transform the base of the expression.
13200   ExprResult Base((Expr*) nullptr);
13201   Expr *OldBase;
13202   QualType BaseType;
13203   QualType ObjectType;
13204   if (!E->isImplicitAccess()) {
13205     OldBase = E->getBase();
13206     Base = getDerived().TransformExpr(OldBase);
13207     if (Base.isInvalid())
13208       return ExprError();
13209 
13210     // Start the member reference and compute the object's type.
13211     ParsedType ObjectTy;
13212     bool MayBePseudoDestructor = false;
13213     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13214                                                 E->getOperatorLoc(),
13215                                       E->isArrow()? tok::arrow : tok::period,
13216                                                 ObjectTy,
13217                                                 MayBePseudoDestructor);
13218     if (Base.isInvalid())
13219       return ExprError();
13220 
13221     ObjectType = ObjectTy.get();
13222     BaseType = ((Expr*) Base.get())->getType();
13223   } else {
13224     OldBase = nullptr;
13225     BaseType = getDerived().TransformType(E->getBaseType());
13226     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13227   }
13228 
13229   // Transform the first part of the nested-name-specifier that qualifies
13230   // the member name.
13231   NamedDecl *FirstQualifierInScope
13232     = getDerived().TransformFirstQualifierInScope(
13233                                             E->getFirstQualifierFoundInScope(),
13234                                             E->getQualifierLoc().getBeginLoc());
13235 
13236   NestedNameSpecifierLoc QualifierLoc;
13237   if (E->getQualifier()) {
13238     QualifierLoc
13239       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13240                                                      ObjectType,
13241                                                      FirstQualifierInScope);
13242     if (!QualifierLoc)
13243       return ExprError();
13244   }
13245 
13246   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13247 
13248   // TODO: If this is a conversion-function-id, verify that the
13249   // destination type name (if present) resolves the same way after
13250   // instantiation as it did in the local scope.
13251 
13252   DeclarationNameInfo NameInfo
13253     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13254   if (!NameInfo.getName())
13255     return ExprError();
13256 
13257   if (!E->hasExplicitTemplateArgs()) {
13258     // This is a reference to a member without an explicitly-specified
13259     // template argument list. Optimize for this common case.
13260     if (!getDerived().AlwaysRebuild() &&
13261         Base.get() == OldBase &&
13262         BaseType == E->getBaseType() &&
13263         QualifierLoc == E->getQualifierLoc() &&
13264         NameInfo.getName() == E->getMember() &&
13265         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13266       return E;
13267 
13268     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13269                                                        BaseType,
13270                                                        E->isArrow(),
13271                                                        E->getOperatorLoc(),
13272                                                        QualifierLoc,
13273                                                        TemplateKWLoc,
13274                                                        FirstQualifierInScope,
13275                                                        NameInfo,
13276                                                        /*TemplateArgs*/nullptr);
13277   }
13278 
13279   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13280   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13281                                               E->getNumTemplateArgs(),
13282                                               TransArgs))
13283     return ExprError();
13284 
13285   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13286                                                      BaseType,
13287                                                      E->isArrow(),
13288                                                      E->getOperatorLoc(),
13289                                                      QualifierLoc,
13290                                                      TemplateKWLoc,
13291                                                      FirstQualifierInScope,
13292                                                      NameInfo,
13293                                                      &TransArgs);
13294 }
13295 
13296 template <typename Derived>
13297 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13298     UnresolvedMemberExpr *Old) {
13299   // Transform the base of the expression.
13300   ExprResult Base((Expr *)nullptr);
13301   QualType BaseType;
13302   if (!Old->isImplicitAccess()) {
13303     Base = getDerived().TransformExpr(Old->getBase());
13304     if (Base.isInvalid())
13305       return ExprError();
13306     Base =
13307         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13308     if (Base.isInvalid())
13309       return ExprError();
13310     BaseType = Base.get()->getType();
13311   } else {
13312     BaseType = getDerived().TransformType(Old->getBaseType());
13313   }
13314 
13315   NestedNameSpecifierLoc QualifierLoc;
13316   if (Old->getQualifierLoc()) {
13317     QualifierLoc =
13318         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13319     if (!QualifierLoc)
13320       return ExprError();
13321   }
13322 
13323   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13324 
13325   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13326 
13327   // Transform the declaration set.
13328   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13329     return ExprError();
13330 
13331   // Determine the naming class.
13332   if (Old->getNamingClass()) {
13333     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13334         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13335     if (!NamingClass)
13336       return ExprError();
13337 
13338     R.setNamingClass(NamingClass);
13339   }
13340 
13341   TemplateArgumentListInfo TransArgs;
13342   if (Old->hasExplicitTemplateArgs()) {
13343     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13344     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13345     if (getDerived().TransformTemplateArguments(
13346             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13347       return ExprError();
13348   }
13349 
13350   // FIXME: to do this check properly, we will need to preserve the
13351   // first-qualifier-in-scope here, just in case we had a dependent
13352   // base (and therefore couldn't do the check) and a
13353   // nested-name-qualifier (and therefore could do the lookup).
13354   NamedDecl *FirstQualifierInScope = nullptr;
13355 
13356   return getDerived().RebuildUnresolvedMemberExpr(
13357       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13358       TemplateKWLoc, FirstQualifierInScope, R,
13359       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13360 }
13361 
13362 template<typename Derived>
13363 ExprResult
13364 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13365   EnterExpressionEvaluationContext Unevaluated(
13366       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13367   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13368   if (SubExpr.isInvalid())
13369     return ExprError();
13370 
13371   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13372     return E;
13373 
13374   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13375 }
13376 
13377 template<typename Derived>
13378 ExprResult
13379 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13380   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13381   if (Pattern.isInvalid())
13382     return ExprError();
13383 
13384   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13385     return E;
13386 
13387   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13388                                            E->getNumExpansions());
13389 }
13390 
13391 template<typename Derived>
13392 ExprResult
13393 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13394   // If E is not value-dependent, then nothing will change when we transform it.
13395   // Note: This is an instantiation-centric view.
13396   if (!E->isValueDependent())
13397     return E;
13398 
13399   EnterExpressionEvaluationContext Unevaluated(
13400       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13401 
13402   ArrayRef<TemplateArgument> PackArgs;
13403   TemplateArgument ArgStorage;
13404 
13405   // Find the argument list to transform.
13406   if (E->isPartiallySubstituted()) {
13407     PackArgs = E->getPartialArguments();
13408   } else if (E->isValueDependent()) {
13409     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13410     bool ShouldExpand = false;
13411     bool RetainExpansion = false;
13412     Optional<unsigned> NumExpansions;
13413     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13414                                              Unexpanded,
13415                                              ShouldExpand, RetainExpansion,
13416                                              NumExpansions))
13417       return ExprError();
13418 
13419     // If we need to expand the pack, build a template argument from it and
13420     // expand that.
13421     if (ShouldExpand) {
13422       auto *Pack = E->getPack();
13423       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13424         ArgStorage = getSema().Context.getPackExpansionType(
13425             getSema().Context.getTypeDeclType(TTPD), None);
13426       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13427         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13428       } else {
13429         auto *VD = cast<ValueDecl>(Pack);
13430         ExprResult DRE = getSema().BuildDeclRefExpr(
13431             VD, VD->getType().getNonLValueExprType(getSema().Context),
13432             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13433             E->getPackLoc());
13434         if (DRE.isInvalid())
13435           return ExprError();
13436         ArgStorage = new (getSema().Context) PackExpansionExpr(
13437             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13438       }
13439       PackArgs = ArgStorage;
13440     }
13441   }
13442 
13443   // If we're not expanding the pack, just transform the decl.
13444   if (!PackArgs.size()) {
13445     auto *Pack = cast_or_null<NamedDecl>(
13446         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13447     if (!Pack)
13448       return ExprError();
13449     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13450                                               E->getPackLoc(),
13451                                               E->getRParenLoc(), None, None);
13452   }
13453 
13454   // Try to compute the result without performing a partial substitution.
13455   Optional<unsigned> Result = 0;
13456   for (const TemplateArgument &Arg : PackArgs) {
13457     if (!Arg.isPackExpansion()) {
13458       Result = *Result + 1;
13459       continue;
13460     }
13461 
13462     TemplateArgumentLoc ArgLoc;
13463     InventTemplateArgumentLoc(Arg, ArgLoc);
13464 
13465     // Find the pattern of the pack expansion.
13466     SourceLocation Ellipsis;
13467     Optional<unsigned> OrigNumExpansions;
13468     TemplateArgumentLoc Pattern =
13469         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13470                                                           OrigNumExpansions);
13471 
13472     // Substitute under the pack expansion. Do not expand the pack (yet).
13473     TemplateArgumentLoc OutPattern;
13474     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13475     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13476                                                /*Uneval*/ true))
13477       return true;
13478 
13479     // See if we can determine the number of arguments from the result.
13480     Optional<unsigned> NumExpansions =
13481         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13482     if (!NumExpansions) {
13483       // No: we must be in an alias template expansion, and we're going to need
13484       // to actually expand the packs.
13485       Result = None;
13486       break;
13487     }
13488 
13489     Result = *Result + *NumExpansions;
13490   }
13491 
13492   // Common case: we could determine the number of expansions without
13493   // substituting.
13494   if (Result)
13495     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13496                                               E->getPackLoc(),
13497                                               E->getRParenLoc(), *Result, None);
13498 
13499   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13500                                                E->getPackLoc());
13501   {
13502     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13503     typedef TemplateArgumentLocInventIterator<
13504         Derived, const TemplateArgument*> PackLocIterator;
13505     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13506                                    PackLocIterator(*this, PackArgs.end()),
13507                                    TransformedPackArgs, /*Uneval*/true))
13508       return ExprError();
13509   }
13510 
13511   // Check whether we managed to fully-expand the pack.
13512   // FIXME: Is it possible for us to do so and not hit the early exit path?
13513   SmallVector<TemplateArgument, 8> Args;
13514   bool PartialSubstitution = false;
13515   for (auto &Loc : TransformedPackArgs.arguments()) {
13516     Args.push_back(Loc.getArgument());
13517     if (Loc.getArgument().isPackExpansion())
13518       PartialSubstitution = true;
13519   }
13520 
13521   if (PartialSubstitution)
13522     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13523                                               E->getPackLoc(),
13524                                               E->getRParenLoc(), None, Args);
13525 
13526   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13527                                             E->getPackLoc(), E->getRParenLoc(),
13528                                             Args.size(), None);
13529 }
13530 
13531 template<typename Derived>
13532 ExprResult
13533 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13534                                           SubstNonTypeTemplateParmPackExpr *E) {
13535   // Default behavior is to do nothing with this transformation.
13536   return E;
13537 }
13538 
13539 template<typename Derived>
13540 ExprResult
13541 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13542                                           SubstNonTypeTemplateParmExpr *E) {
13543   // Default behavior is to do nothing with this transformation.
13544   return E;
13545 }
13546 
13547 template<typename Derived>
13548 ExprResult
13549 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13550   // Default behavior is to do nothing with this transformation.
13551   return E;
13552 }
13553 
13554 template<typename Derived>
13555 ExprResult
13556 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13557                                                   MaterializeTemporaryExpr *E) {
13558   return getDerived().TransformExpr(E->getSubExpr());
13559 }
13560 
13561 template<typename Derived>
13562 ExprResult
13563 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13564   UnresolvedLookupExpr *Callee = nullptr;
13565   if (Expr *OldCallee = E->getCallee()) {
13566     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13567     if (CalleeResult.isInvalid())
13568       return ExprError();
13569     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13570   }
13571 
13572   Expr *Pattern = E->getPattern();
13573 
13574   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13575   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13576   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13577 
13578   // Determine whether the set of unexpanded parameter packs can and should
13579   // be expanded.
13580   bool Expand = true;
13581   bool RetainExpansion = false;
13582   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13583                      NumExpansions = OrigNumExpansions;
13584   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13585                                            Pattern->getSourceRange(),
13586                                            Unexpanded,
13587                                            Expand, RetainExpansion,
13588                                            NumExpansions))
13589     return true;
13590 
13591   if (!Expand) {
13592     // Do not expand any packs here, just transform and rebuild a fold
13593     // expression.
13594     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13595 
13596     ExprResult LHS =
13597         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13598     if (LHS.isInvalid())
13599       return true;
13600 
13601     ExprResult RHS =
13602         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13603     if (RHS.isInvalid())
13604       return true;
13605 
13606     if (!getDerived().AlwaysRebuild() &&
13607         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13608       return E;
13609 
13610     return getDerived().RebuildCXXFoldExpr(
13611         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13612         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13613   }
13614 
13615   // Formally a fold expression expands to nested parenthesized expressions.
13616   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13617   // them.
13618   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13619     SemaRef.Diag(E->getEllipsisLoc(),
13620                  clang::diag::err_fold_expression_limit_exceeded)
13621         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13622         << E->getSourceRange();
13623     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13624     return ExprError();
13625   }
13626 
13627   // The transform has determined that we should perform an elementwise
13628   // expansion of the pattern. Do so.
13629   ExprResult Result = getDerived().TransformExpr(E->getInit());
13630   if (Result.isInvalid())
13631     return true;
13632   bool LeftFold = E->isLeftFold();
13633 
13634   // If we're retaining an expansion for a right fold, it is the innermost
13635   // component and takes the init (if any).
13636   if (!LeftFold && RetainExpansion) {
13637     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13638 
13639     ExprResult Out = getDerived().TransformExpr(Pattern);
13640     if (Out.isInvalid())
13641       return true;
13642 
13643     Result = getDerived().RebuildCXXFoldExpr(
13644         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13645         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13646     if (Result.isInvalid())
13647       return true;
13648   }
13649 
13650   for (unsigned I = 0; I != *NumExpansions; ++I) {
13651     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13652         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13653     ExprResult Out = getDerived().TransformExpr(Pattern);
13654     if (Out.isInvalid())
13655       return true;
13656 
13657     if (Out.get()->containsUnexpandedParameterPack()) {
13658       // We still have a pack; retain a pack expansion for this slice.
13659       Result = getDerived().RebuildCXXFoldExpr(
13660           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13661           E->getOperator(), E->getEllipsisLoc(),
13662           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13663           OrigNumExpansions);
13664     } else if (Result.isUsable()) {
13665       // We've got down to a single element; build a binary operator.
13666       Expr *LHS = LeftFold ? Result.get() : Out.get();
13667       Expr *RHS = LeftFold ? Out.get() : Result.get();
13668       if (Callee)
13669         Result = getDerived().RebuildCXXOperatorCallExpr(
13670             BinaryOperator::getOverloadedOperator(E->getOperator()),
13671             E->getEllipsisLoc(), Callee, LHS, RHS);
13672       else
13673         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13674                                                     E->getOperator(), LHS, RHS);
13675     } else
13676       Result = Out;
13677 
13678     if (Result.isInvalid())
13679       return true;
13680   }
13681 
13682   // If we're retaining an expansion for a left fold, it is the outermost
13683   // component and takes the complete expansion so far as its init (if any).
13684   if (LeftFold && RetainExpansion) {
13685     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13686 
13687     ExprResult Out = getDerived().TransformExpr(Pattern);
13688     if (Out.isInvalid())
13689       return true;
13690 
13691     Result = getDerived().RebuildCXXFoldExpr(
13692         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13693         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13694     if (Result.isInvalid())
13695       return true;
13696   }
13697 
13698   // If we had no init and an empty pack, and we're not retaining an expansion,
13699   // then produce a fallback value or error.
13700   if (Result.isUnset())
13701     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13702                                                 E->getOperator());
13703 
13704   return Result;
13705 }
13706 
13707 template<typename Derived>
13708 ExprResult
13709 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13710     CXXStdInitializerListExpr *E) {
13711   return getDerived().TransformExpr(E->getSubExpr());
13712 }
13713 
13714 template<typename Derived>
13715 ExprResult
13716 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13717   return SemaRef.MaybeBindToTemporary(E);
13718 }
13719 
13720 template<typename Derived>
13721 ExprResult
13722 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13723   return E;
13724 }
13725 
13726 template<typename Derived>
13727 ExprResult
13728 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13729   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13730   if (SubExpr.isInvalid())
13731     return ExprError();
13732 
13733   if (!getDerived().AlwaysRebuild() &&
13734       SubExpr.get() == E->getSubExpr())
13735     return E;
13736 
13737   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13738 }
13739 
13740 template<typename Derived>
13741 ExprResult
13742 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13743   // Transform each of the elements.
13744   SmallVector<Expr *, 8> Elements;
13745   bool ArgChanged = false;
13746   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13747                                   /*IsCall=*/false, Elements, &ArgChanged))
13748     return ExprError();
13749 
13750   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13751     return SemaRef.MaybeBindToTemporary(E);
13752 
13753   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13754                                               Elements.data(),
13755                                               Elements.size());
13756 }
13757 
13758 template<typename Derived>
13759 ExprResult
13760 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13761                                                     ObjCDictionaryLiteral *E) {
13762   // Transform each of the elements.
13763   SmallVector<ObjCDictionaryElement, 8> Elements;
13764   bool ArgChanged = false;
13765   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13766     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13767 
13768     if (OrigElement.isPackExpansion()) {
13769       // This key/value element is a pack expansion.
13770       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13771       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13772       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13773       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13774 
13775       // Determine whether the set of unexpanded parameter packs can
13776       // and should be expanded.
13777       bool Expand = true;
13778       bool RetainExpansion = false;
13779       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13780       Optional<unsigned> NumExpansions = OrigNumExpansions;
13781       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13782                                OrigElement.Value->getEndLoc());
13783       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13784                                                PatternRange, Unexpanded, Expand,
13785                                                RetainExpansion, NumExpansions))
13786         return ExprError();
13787 
13788       if (!Expand) {
13789         // The transform has determined that we should perform a simple
13790         // transformation on the pack expansion, producing another pack
13791         // expansion.
13792         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13793         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13794         if (Key.isInvalid())
13795           return ExprError();
13796 
13797         if (Key.get() != OrigElement.Key)
13798           ArgChanged = true;
13799 
13800         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13801         if (Value.isInvalid())
13802           return ExprError();
13803 
13804         if (Value.get() != OrigElement.Value)
13805           ArgChanged = true;
13806 
13807         ObjCDictionaryElement Expansion = {
13808           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13809         };
13810         Elements.push_back(Expansion);
13811         continue;
13812       }
13813 
13814       // Record right away that the argument was changed.  This needs
13815       // to happen even if the array expands to nothing.
13816       ArgChanged = true;
13817 
13818       // The transform has determined that we should perform an elementwise
13819       // expansion of the pattern. Do so.
13820       for (unsigned I = 0; I != *NumExpansions; ++I) {
13821         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13822         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13823         if (Key.isInvalid())
13824           return ExprError();
13825 
13826         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13827         if (Value.isInvalid())
13828           return ExprError();
13829 
13830         ObjCDictionaryElement Element = {
13831           Key.get(), Value.get(), SourceLocation(), NumExpansions
13832         };
13833 
13834         // If any unexpanded parameter packs remain, we still have a
13835         // pack expansion.
13836         // FIXME: Can this really happen?
13837         if (Key.get()->containsUnexpandedParameterPack() ||
13838             Value.get()->containsUnexpandedParameterPack())
13839           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13840 
13841         Elements.push_back(Element);
13842       }
13843 
13844       // FIXME: Retain a pack expansion if RetainExpansion is true.
13845 
13846       // We've finished with this pack expansion.
13847       continue;
13848     }
13849 
13850     // Transform and check key.
13851     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13852     if (Key.isInvalid())
13853       return ExprError();
13854 
13855     if (Key.get() != OrigElement.Key)
13856       ArgChanged = true;
13857 
13858     // Transform and check value.
13859     ExprResult Value
13860       = getDerived().TransformExpr(OrigElement.Value);
13861     if (Value.isInvalid())
13862       return ExprError();
13863 
13864     if (Value.get() != OrigElement.Value)
13865       ArgChanged = true;
13866 
13867     ObjCDictionaryElement Element = {
13868       Key.get(), Value.get(), SourceLocation(), None
13869     };
13870     Elements.push_back(Element);
13871   }
13872 
13873   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13874     return SemaRef.MaybeBindToTemporary(E);
13875 
13876   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13877                                                    Elements);
13878 }
13879 
13880 template<typename Derived>
13881 ExprResult
13882 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13883   TypeSourceInfo *EncodedTypeInfo
13884     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13885   if (!EncodedTypeInfo)
13886     return ExprError();
13887 
13888   if (!getDerived().AlwaysRebuild() &&
13889       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13890     return E;
13891 
13892   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13893                                             EncodedTypeInfo,
13894                                             E->getRParenLoc());
13895 }
13896 
13897 template<typename Derived>
13898 ExprResult TreeTransform<Derived>::
13899 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13900   // This is a kind of implicit conversion, and it needs to get dropped
13901   // and recomputed for the same general reasons that ImplicitCastExprs
13902   // do, as well a more specific one: this expression is only valid when
13903   // it appears *immediately* as an argument expression.
13904   return getDerived().TransformExpr(E->getSubExpr());
13905 }
13906 
13907 template<typename Derived>
13908 ExprResult TreeTransform<Derived>::
13909 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13910   TypeSourceInfo *TSInfo
13911     = getDerived().TransformType(E->getTypeInfoAsWritten());
13912   if (!TSInfo)
13913     return ExprError();
13914 
13915   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13916   if (Result.isInvalid())
13917     return ExprError();
13918 
13919   if (!getDerived().AlwaysRebuild() &&
13920       TSInfo == E->getTypeInfoAsWritten() &&
13921       Result.get() == E->getSubExpr())
13922     return E;
13923 
13924   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13925                                       E->getBridgeKeywordLoc(), TSInfo,
13926                                       Result.get());
13927 }
13928 
13929 template <typename Derived>
13930 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13931     ObjCAvailabilityCheckExpr *E) {
13932   return E;
13933 }
13934 
13935 template<typename Derived>
13936 ExprResult
13937 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13938   // Transform arguments.
13939   bool ArgChanged = false;
13940   SmallVector<Expr*, 8> Args;
13941   Args.reserve(E->getNumArgs());
13942   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13943                                   &ArgChanged))
13944     return ExprError();
13945 
13946   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13947     // Class message: transform the receiver type.
13948     TypeSourceInfo *ReceiverTypeInfo
13949       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13950     if (!ReceiverTypeInfo)
13951       return ExprError();
13952 
13953     // If nothing changed, just retain the existing message send.
13954     if (!getDerived().AlwaysRebuild() &&
13955         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13956       return SemaRef.MaybeBindToTemporary(E);
13957 
13958     // Build a new class message send.
13959     SmallVector<SourceLocation, 16> SelLocs;
13960     E->getSelectorLocs(SelLocs);
13961     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13962                                                E->getSelector(),
13963                                                SelLocs,
13964                                                E->getMethodDecl(),
13965                                                E->getLeftLoc(),
13966                                                Args,
13967                                                E->getRightLoc());
13968   }
13969   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13970            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13971     if (!E->getMethodDecl())
13972       return ExprError();
13973 
13974     // Build a new class message send to 'super'.
13975     SmallVector<SourceLocation, 16> SelLocs;
13976     E->getSelectorLocs(SelLocs);
13977     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13978                                                E->getSelector(),
13979                                                SelLocs,
13980                                                E->getReceiverType(),
13981                                                E->getMethodDecl(),
13982                                                E->getLeftLoc(),
13983                                                Args,
13984                                                E->getRightLoc());
13985   }
13986 
13987   // Instance message: transform the receiver
13988   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13989          "Only class and instance messages may be instantiated");
13990   ExprResult Receiver
13991     = getDerived().TransformExpr(E->getInstanceReceiver());
13992   if (Receiver.isInvalid())
13993     return ExprError();
13994 
13995   // If nothing changed, just retain the existing message send.
13996   if (!getDerived().AlwaysRebuild() &&
13997       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13998     return SemaRef.MaybeBindToTemporary(E);
13999 
14000   // Build a new instance message send.
14001   SmallVector<SourceLocation, 16> SelLocs;
14002   E->getSelectorLocs(SelLocs);
14003   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
14004                                              E->getSelector(),
14005                                              SelLocs,
14006                                              E->getMethodDecl(),
14007                                              E->getLeftLoc(),
14008                                              Args,
14009                                              E->getRightLoc());
14010 }
14011 
14012 template<typename Derived>
14013 ExprResult
14014 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
14015   return E;
14016 }
14017 
14018 template<typename Derived>
14019 ExprResult
14020 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
14021   return E;
14022 }
14023 
14024 template<typename Derived>
14025 ExprResult
14026 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
14027   // Transform the base expression.
14028   ExprResult Base = getDerived().TransformExpr(E->getBase());
14029   if (Base.isInvalid())
14030     return ExprError();
14031 
14032   // We don't need to transform the ivar; it will never change.
14033 
14034   // If nothing changed, just retain the existing expression.
14035   if (!getDerived().AlwaysRebuild() &&
14036       Base.get() == E->getBase())
14037     return E;
14038 
14039   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
14040                                              E->getLocation(),
14041                                              E->isArrow(), E->isFreeIvar());
14042 }
14043 
14044 template<typename Derived>
14045 ExprResult
14046 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
14047   // 'super' and types never change. Property never changes. Just
14048   // retain the existing expression.
14049   if (!E->isObjectReceiver())
14050     return E;
14051 
14052   // Transform the base expression.
14053   ExprResult Base = getDerived().TransformExpr(E->getBase());
14054   if (Base.isInvalid())
14055     return ExprError();
14056 
14057   // We don't need to transform the property; it will never change.
14058 
14059   // If nothing changed, just retain the existing expression.
14060   if (!getDerived().AlwaysRebuild() &&
14061       Base.get() == E->getBase())
14062     return E;
14063 
14064   if (E->isExplicitProperty())
14065     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14066                                                    E->getExplicitProperty(),
14067                                                    E->getLocation());
14068 
14069   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14070                                                  SemaRef.Context.PseudoObjectTy,
14071                                                  E->getImplicitPropertyGetter(),
14072                                                  E->getImplicitPropertySetter(),
14073                                                  E->getLocation());
14074 }
14075 
14076 template<typename Derived>
14077 ExprResult
14078 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14079   // Transform the base expression.
14080   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14081   if (Base.isInvalid())
14082     return ExprError();
14083 
14084   // Transform the key expression.
14085   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14086   if (Key.isInvalid())
14087     return ExprError();
14088 
14089   // If nothing changed, just retain the existing expression.
14090   if (!getDerived().AlwaysRebuild() &&
14091       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14092     return E;
14093 
14094   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14095                                                   Base.get(), Key.get(),
14096                                                   E->getAtIndexMethodDecl(),
14097                                                   E->setAtIndexMethodDecl());
14098 }
14099 
14100 template<typename Derived>
14101 ExprResult
14102 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14103   // Transform the base expression.
14104   ExprResult Base = getDerived().TransformExpr(E->getBase());
14105   if (Base.isInvalid())
14106     return ExprError();
14107 
14108   // If nothing changed, just retain the existing expression.
14109   if (!getDerived().AlwaysRebuild() &&
14110       Base.get() == E->getBase())
14111     return E;
14112 
14113   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14114                                          E->getOpLoc(),
14115                                          E->isArrow());
14116 }
14117 
14118 template<typename Derived>
14119 ExprResult
14120 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14121   bool ArgumentChanged = false;
14122   SmallVector<Expr*, 8> SubExprs;
14123   SubExprs.reserve(E->getNumSubExprs());
14124   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14125                                   SubExprs, &ArgumentChanged))
14126     return ExprError();
14127 
14128   if (!getDerived().AlwaysRebuild() &&
14129       !ArgumentChanged)
14130     return E;
14131 
14132   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14133                                                SubExprs,
14134                                                E->getRParenLoc());
14135 }
14136 
14137 template<typename Derived>
14138 ExprResult
14139 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14140   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14141   if (SrcExpr.isInvalid())
14142     return ExprError();
14143 
14144   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14145   if (!Type)
14146     return ExprError();
14147 
14148   if (!getDerived().AlwaysRebuild() &&
14149       Type == E->getTypeSourceInfo() &&
14150       SrcExpr.get() == E->getSrcExpr())
14151     return E;
14152 
14153   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14154                                                SrcExpr.get(), Type,
14155                                                E->getRParenLoc());
14156 }
14157 
14158 template<typename Derived>
14159 ExprResult
14160 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14161   BlockDecl *oldBlock = E->getBlockDecl();
14162 
14163   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14164   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14165 
14166   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14167   blockScope->TheDecl->setBlockMissingReturnType(
14168                          oldBlock->blockMissingReturnType());
14169 
14170   SmallVector<ParmVarDecl*, 4> params;
14171   SmallVector<QualType, 4> paramTypes;
14172 
14173   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14174 
14175   // Parameter substitution.
14176   Sema::ExtParameterInfoBuilder extParamInfos;
14177   if (getDerived().TransformFunctionTypeParams(
14178           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14179           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14180           extParamInfos)) {
14181     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14182     return ExprError();
14183   }
14184 
14185   QualType exprResultType =
14186       getDerived().TransformType(exprFunctionType->getReturnType());
14187 
14188   auto epi = exprFunctionType->getExtProtoInfo();
14189   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14190 
14191   QualType functionType =
14192     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14193   blockScope->FunctionType = functionType;
14194 
14195   // Set the parameters on the block decl.
14196   if (!params.empty())
14197     blockScope->TheDecl->setParams(params);
14198 
14199   if (!oldBlock->blockMissingReturnType()) {
14200     blockScope->HasImplicitReturnType = false;
14201     blockScope->ReturnType = exprResultType;
14202   }
14203 
14204   // Transform the body
14205   StmtResult body = getDerived().TransformStmt(E->getBody());
14206   if (body.isInvalid()) {
14207     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14208     return ExprError();
14209   }
14210 
14211 #ifndef NDEBUG
14212   // In builds with assertions, make sure that we captured everything we
14213   // captured before.
14214   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14215     for (const auto &I : oldBlock->captures()) {
14216       VarDecl *oldCapture = I.getVariable();
14217 
14218       // Ignore parameter packs.
14219       if (oldCapture->isParameterPack())
14220         continue;
14221 
14222       VarDecl *newCapture =
14223         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14224                                                  oldCapture));
14225       assert(blockScope->CaptureMap.count(newCapture));
14226     }
14227     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14228   }
14229 #endif
14230 
14231   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14232                                     /*Scope=*/nullptr);
14233 }
14234 
14235 template<typename Derived>
14236 ExprResult
14237 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14238   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14239   if (SrcExpr.isInvalid())
14240     return ExprError();
14241 
14242   QualType Type = getDerived().TransformType(E->getType());
14243 
14244   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14245                                  E->getRParenLoc());
14246 }
14247 
14248 template<typename Derived>
14249 ExprResult
14250 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14251   bool ArgumentChanged = false;
14252   SmallVector<Expr*, 8> SubExprs;
14253   SubExprs.reserve(E->getNumSubExprs());
14254   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14255                                   SubExprs, &ArgumentChanged))
14256     return ExprError();
14257 
14258   if (!getDerived().AlwaysRebuild() &&
14259       !ArgumentChanged)
14260     return E;
14261 
14262   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14263                                         E->getOp(), E->getRParenLoc());
14264 }
14265 
14266 //===----------------------------------------------------------------------===//
14267 // Type reconstruction
14268 //===----------------------------------------------------------------------===//
14269 
14270 template<typename Derived>
14271 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14272                                                     SourceLocation Star) {
14273   return SemaRef.BuildPointerType(PointeeType, Star,
14274                                   getDerived().getBaseEntity());
14275 }
14276 
14277 template<typename Derived>
14278 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14279                                                          SourceLocation Star) {
14280   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14281                                        getDerived().getBaseEntity());
14282 }
14283 
14284 template<typename Derived>
14285 QualType
14286 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14287                                              bool WrittenAsLValue,
14288                                              SourceLocation Sigil) {
14289   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14290                                     Sigil, getDerived().getBaseEntity());
14291 }
14292 
14293 template<typename Derived>
14294 QualType
14295 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14296                                                  QualType ClassType,
14297                                                  SourceLocation Sigil) {
14298   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14299                                         getDerived().getBaseEntity());
14300 }
14301 
14302 template<typename Derived>
14303 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14304            const ObjCTypeParamDecl *Decl,
14305            SourceLocation ProtocolLAngleLoc,
14306            ArrayRef<ObjCProtocolDecl *> Protocols,
14307            ArrayRef<SourceLocation> ProtocolLocs,
14308            SourceLocation ProtocolRAngleLoc) {
14309   return SemaRef.BuildObjCTypeParamType(Decl,
14310                                         ProtocolLAngleLoc, Protocols,
14311                                         ProtocolLocs, ProtocolRAngleLoc,
14312                                         /*FailOnError=*/true);
14313 }
14314 
14315 template<typename Derived>
14316 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14317            QualType BaseType,
14318            SourceLocation Loc,
14319            SourceLocation TypeArgsLAngleLoc,
14320            ArrayRef<TypeSourceInfo *> TypeArgs,
14321            SourceLocation TypeArgsRAngleLoc,
14322            SourceLocation ProtocolLAngleLoc,
14323            ArrayRef<ObjCProtocolDecl *> Protocols,
14324            ArrayRef<SourceLocation> ProtocolLocs,
14325            SourceLocation ProtocolRAngleLoc) {
14326   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14327                                      TypeArgs, TypeArgsRAngleLoc,
14328                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14329                                      ProtocolRAngleLoc,
14330                                      /*FailOnError=*/true);
14331 }
14332 
14333 template<typename Derived>
14334 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14335            QualType PointeeType,
14336            SourceLocation Star) {
14337   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14338 }
14339 
14340 template<typename Derived>
14341 QualType
14342 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14343                                          ArrayType::ArraySizeModifier SizeMod,
14344                                          const llvm::APInt *Size,
14345                                          Expr *SizeExpr,
14346                                          unsigned IndexTypeQuals,
14347                                          SourceRange BracketsRange) {
14348   if (SizeExpr || !Size)
14349     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14350                                   IndexTypeQuals, BracketsRange,
14351                                   getDerived().getBaseEntity());
14352 
14353   QualType Types[] = {
14354     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14355     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14356     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14357   };
14358   const unsigned NumTypes = llvm::array_lengthof(Types);
14359   QualType SizeType;
14360   for (unsigned I = 0; I != NumTypes; ++I)
14361     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14362       SizeType = Types[I];
14363       break;
14364     }
14365 
14366   // Note that we can return a VariableArrayType here in the case where
14367   // the element type was a dependent VariableArrayType.
14368   IntegerLiteral *ArraySize
14369       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14370                                /*FIXME*/BracketsRange.getBegin());
14371   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14372                                 IndexTypeQuals, BracketsRange,
14373                                 getDerived().getBaseEntity());
14374 }
14375 
14376 template<typename Derived>
14377 QualType
14378 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14379                                                  ArrayType::ArraySizeModifier SizeMod,
14380                                                  const llvm::APInt &Size,
14381                                                  Expr *SizeExpr,
14382                                                  unsigned IndexTypeQuals,
14383                                                  SourceRange BracketsRange) {
14384   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14385                                         IndexTypeQuals, BracketsRange);
14386 }
14387 
14388 template<typename Derived>
14389 QualType
14390 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14391                                           ArrayType::ArraySizeModifier SizeMod,
14392                                                  unsigned IndexTypeQuals,
14393                                                    SourceRange BracketsRange) {
14394   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14395                                        IndexTypeQuals, BracketsRange);
14396 }
14397 
14398 template<typename Derived>
14399 QualType
14400 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14401                                           ArrayType::ArraySizeModifier SizeMod,
14402                                                  Expr *SizeExpr,
14403                                                  unsigned IndexTypeQuals,
14404                                                  SourceRange BracketsRange) {
14405   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14406                                        SizeExpr,
14407                                        IndexTypeQuals, BracketsRange);
14408 }
14409 
14410 template<typename Derived>
14411 QualType
14412 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14413                                           ArrayType::ArraySizeModifier SizeMod,
14414                                                        Expr *SizeExpr,
14415                                                        unsigned IndexTypeQuals,
14416                                                    SourceRange BracketsRange) {
14417   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14418                                        SizeExpr,
14419                                        IndexTypeQuals, BracketsRange);
14420 }
14421 
14422 template <typename Derived>
14423 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14424     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14425   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14426                                           AttributeLoc);
14427 }
14428 
14429 template <typename Derived>
14430 QualType
14431 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14432                                           unsigned NumElements,
14433                                           VectorType::VectorKind VecKind) {
14434   // FIXME: semantic checking!
14435   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14436 }
14437 
14438 template <typename Derived>
14439 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14440     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14441     VectorType::VectorKind VecKind) {
14442   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14443 }
14444 
14445 template<typename Derived>
14446 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14447                                                       unsigned NumElements,
14448                                                  SourceLocation AttributeLoc) {
14449   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14450                           NumElements, true);
14451   IntegerLiteral *VectorSize
14452     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14453                              AttributeLoc);
14454   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14455 }
14456 
14457 template<typename Derived>
14458 QualType
14459 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14460                                                            Expr *SizeExpr,
14461                                                   SourceLocation AttributeLoc) {
14462   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14463 }
14464 
14465 template <typename Derived>
14466 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14467     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14468   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14469                                                NumColumns);
14470 }
14471 
14472 template <typename Derived>
14473 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14474     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14475     SourceLocation AttributeLoc) {
14476   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14477                                  AttributeLoc);
14478 }
14479 
14480 template<typename Derived>
14481 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14482     QualType T,
14483     MutableArrayRef<QualType> ParamTypes,
14484     const FunctionProtoType::ExtProtoInfo &EPI) {
14485   return SemaRef.BuildFunctionType(T, ParamTypes,
14486                                    getDerived().getBaseLocation(),
14487                                    getDerived().getBaseEntity(),
14488                                    EPI);
14489 }
14490 
14491 template<typename Derived>
14492 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14493   return SemaRef.Context.getFunctionNoProtoType(T);
14494 }
14495 
14496 template<typename Derived>
14497 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14498                                                             Decl *D) {
14499   assert(D && "no decl found");
14500   if (D->isInvalidDecl()) return QualType();
14501 
14502   // FIXME: Doesn't account for ObjCInterfaceDecl!
14503   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14504     // A valid resolved using typename pack expansion decl can have multiple
14505     // UsingDecls, but they must each have exactly one type, and it must be
14506     // the same type in every case. But we must have at least one expansion!
14507     if (UPD->expansions().empty()) {
14508       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14509           << UPD->isCXXClassMember() << UPD;
14510       return QualType();
14511     }
14512 
14513     // We might still have some unresolved types. Try to pick a resolved type
14514     // if we can. The final instantiation will check that the remaining
14515     // unresolved types instantiate to the type we pick.
14516     QualType FallbackT;
14517     QualType T;
14518     for (auto *E : UPD->expansions()) {
14519       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14520       if (ThisT.isNull())
14521         continue;
14522       else if (ThisT->getAs<UnresolvedUsingType>())
14523         FallbackT = ThisT;
14524       else if (T.isNull())
14525         T = ThisT;
14526       else
14527         assert(getSema().Context.hasSameType(ThisT, T) &&
14528                "mismatched resolved types in using pack expansion");
14529     }
14530     return T.isNull() ? FallbackT : T;
14531   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14532     assert(Using->hasTypename() &&
14533            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14534 
14535     // A valid resolved using typename decl points to exactly one type decl.
14536     assert(++Using->shadow_begin() == Using->shadow_end());
14537 
14538     UsingShadowDecl *Shadow = *Using->shadow_begin();
14539     if (SemaRef.DiagnoseUseOfDecl(Shadow->getTargetDecl(), Loc))
14540       return QualType();
14541     return SemaRef.Context.getUsingType(
14542         Shadow, SemaRef.Context.getTypeDeclType(
14543                     cast<TypeDecl>(Shadow->getTargetDecl())));
14544   } else {
14545     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14546            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14547     return SemaRef.Context.getTypeDeclType(
14548         cast<UnresolvedUsingTypenameDecl>(D));
14549   }
14550 }
14551 
14552 template <typename Derived>
14553 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14554                                                        SourceLocation) {
14555   return SemaRef.BuildTypeofExprType(E);
14556 }
14557 
14558 template<typename Derived>
14559 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14560   return SemaRef.Context.getTypeOfType(Underlying);
14561 }
14562 
14563 template <typename Derived>
14564 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E, SourceLocation) {
14565   return SemaRef.BuildDecltypeType(E);
14566 }
14567 
14568 template<typename Derived>
14569 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14570                                             UnaryTransformType::UTTKind UKind,
14571                                             SourceLocation Loc) {
14572   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14573 }
14574 
14575 template<typename Derived>
14576 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14577                                                       TemplateName Template,
14578                                              SourceLocation TemplateNameLoc,
14579                                      TemplateArgumentListInfo &TemplateArgs) {
14580   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14581 }
14582 
14583 template<typename Derived>
14584 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14585                                                    SourceLocation KWLoc) {
14586   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14587 }
14588 
14589 template<typename Derived>
14590 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14591                                                  SourceLocation KWLoc,
14592                                                  bool isReadPipe) {
14593   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14594                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14595 }
14596 
14597 template <typename Derived>
14598 QualType TreeTransform<Derived>::RebuildBitIntType(bool IsUnsigned,
14599                                                    unsigned NumBits,
14600                                                    SourceLocation Loc) {
14601   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14602                         NumBits, true);
14603   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14604                                                 SemaRef.Context.IntTy, Loc);
14605   return SemaRef.BuildBitIntType(IsUnsigned, Bits, Loc);
14606 }
14607 
14608 template <typename Derived>
14609 QualType TreeTransform<Derived>::RebuildDependentBitIntType(
14610     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14611   return SemaRef.BuildBitIntType(IsUnsigned, NumBitsExpr, Loc);
14612 }
14613 
14614 template<typename Derived>
14615 TemplateName
14616 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14617                                             bool TemplateKW,
14618                                             TemplateDecl *Template) {
14619   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14620                                                   Template);
14621 }
14622 
14623 template<typename Derived>
14624 TemplateName
14625 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14626                                             SourceLocation TemplateKWLoc,
14627                                             const IdentifierInfo &Name,
14628                                             SourceLocation NameLoc,
14629                                             QualType ObjectType,
14630                                             NamedDecl *FirstQualifierInScope,
14631                                             bool AllowInjectedClassName) {
14632   UnqualifiedId TemplateName;
14633   TemplateName.setIdentifier(&Name, NameLoc);
14634   Sema::TemplateTy Template;
14635   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14636                               TemplateName, ParsedType::make(ObjectType),
14637                               /*EnteringContext=*/false, Template,
14638                               AllowInjectedClassName);
14639   return Template.get();
14640 }
14641 
14642 template<typename Derived>
14643 TemplateName
14644 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14645                                             SourceLocation TemplateKWLoc,
14646                                             OverloadedOperatorKind Operator,
14647                                             SourceLocation NameLoc,
14648                                             QualType ObjectType,
14649                                             bool AllowInjectedClassName) {
14650   UnqualifiedId Name;
14651   // FIXME: Bogus location information.
14652   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14653   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14654   Sema::TemplateTy Template;
14655   getSema().ActOnTemplateName(
14656       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14657       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14658   return Template.get();
14659 }
14660 
14661 template<typename Derived>
14662 ExprResult
14663 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14664                                                    SourceLocation OpLoc,
14665                                                    Expr *OrigCallee,
14666                                                    Expr *First,
14667                                                    Expr *Second) {
14668   Expr *Callee = OrigCallee->IgnoreParenCasts();
14669   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14670 
14671   if (First->getObjectKind() == OK_ObjCProperty) {
14672     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14673     if (BinaryOperator::isAssignmentOp(Opc))
14674       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14675                                                  First, Second);
14676     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14677     if (Result.isInvalid())
14678       return ExprError();
14679     First = Result.get();
14680   }
14681 
14682   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14683     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14684     if (Result.isInvalid())
14685       return ExprError();
14686     Second = Result.get();
14687   }
14688 
14689   // Determine whether this should be a builtin operation.
14690   if (Op == OO_Subscript) {
14691     if (!First->getType()->isOverloadableType() &&
14692         !Second->getType()->isOverloadableType())
14693       return getSema().CreateBuiltinArraySubscriptExpr(
14694           First, Callee->getBeginLoc(), Second, OpLoc);
14695   } else if (Op == OO_Arrow) {
14696     // -> is never a builtin operation.
14697     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14698   } else if (Second == nullptr || isPostIncDec) {
14699     if (!First->getType()->isOverloadableType() ||
14700         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14701       // The argument is not of overloadable type, or this is an expression
14702       // of the form &Class::member, so try to create a built-in unary
14703       // operation.
14704       UnaryOperatorKind Opc
14705         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14706 
14707       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14708     }
14709   } else {
14710     if (!First->getType()->isOverloadableType() &&
14711         !Second->getType()->isOverloadableType()) {
14712       // Neither of the arguments is an overloadable type, so try to
14713       // create a built-in binary operation.
14714       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14715       ExprResult Result
14716         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14717       if (Result.isInvalid())
14718         return ExprError();
14719 
14720       return Result;
14721     }
14722   }
14723 
14724   // Compute the transformed set of functions (and function templates) to be
14725   // used during overload resolution.
14726   UnresolvedSet<16> Functions;
14727   bool RequiresADL;
14728 
14729   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14730     Functions.append(ULE->decls_begin(), ULE->decls_end());
14731     // If the overload could not be resolved in the template definition
14732     // (because we had a dependent argument), ADL is performed as part of
14733     // template instantiation.
14734     RequiresADL = ULE->requiresADL();
14735   } else {
14736     // If we've resolved this to a particular non-member function, just call
14737     // that function. If we resolved it to a member function,
14738     // CreateOverloaded* will find that function for us.
14739     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14740     if (!isa<CXXMethodDecl>(ND))
14741       Functions.addDecl(ND);
14742     RequiresADL = false;
14743   }
14744 
14745   // Add any functions found via argument-dependent lookup.
14746   Expr *Args[2] = { First, Second };
14747   unsigned NumArgs = 1 + (Second != nullptr);
14748 
14749   // Create the overloaded operator invocation for unary operators.
14750   if (NumArgs == 1 || isPostIncDec) {
14751     UnaryOperatorKind Opc
14752       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14753     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14754                                            RequiresADL);
14755   }
14756 
14757   if (Op == OO_Subscript) {
14758     SourceLocation LBrace;
14759     SourceLocation RBrace;
14760 
14761     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14762       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14763       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14764       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14765     } else {
14766       LBrace = Callee->getBeginLoc();
14767       RBrace = OpLoc;
14768     }
14769 
14770     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14771                                                       First, Second);
14772   }
14773 
14774   // Create the overloaded operator invocation for binary operators.
14775   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14776   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14777       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14778   if (Result.isInvalid())
14779     return ExprError();
14780 
14781   return Result;
14782 }
14783 
14784 template<typename Derived>
14785 ExprResult
14786 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14787                                                      SourceLocation OperatorLoc,
14788                                                        bool isArrow,
14789                                                        CXXScopeSpec &SS,
14790                                                      TypeSourceInfo *ScopeType,
14791                                                        SourceLocation CCLoc,
14792                                                        SourceLocation TildeLoc,
14793                                         PseudoDestructorTypeStorage Destroyed) {
14794   QualType BaseType = Base->getType();
14795   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14796       (!isArrow && !BaseType->getAs<RecordType>()) ||
14797       (isArrow && BaseType->getAs<PointerType>() &&
14798        !BaseType->castAs<PointerType>()->getPointeeType()
14799                                               ->template getAs<RecordType>())){
14800     // This pseudo-destructor expression is still a pseudo-destructor.
14801     return SemaRef.BuildPseudoDestructorExpr(
14802         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14803         CCLoc, TildeLoc, Destroyed);
14804   }
14805 
14806   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14807   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14808                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14809   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14810   NameInfo.setNamedTypeInfo(DestroyedType);
14811 
14812   // The scope type is now known to be a valid nested name specifier
14813   // component. Tack it on to the end of the nested name specifier.
14814   if (ScopeType) {
14815     if (!ScopeType->getType()->getAs<TagType>()) {
14816       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14817                      diag::err_expected_class_or_namespace)
14818           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14819       return ExprError();
14820     }
14821     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14822               CCLoc);
14823   }
14824 
14825   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14826   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14827                                             OperatorLoc, isArrow,
14828                                             SS, TemplateKWLoc,
14829                                             /*FIXME: FirstQualifier*/ nullptr,
14830                                             NameInfo,
14831                                             /*TemplateArgs*/ nullptr,
14832                                             /*S*/nullptr);
14833 }
14834 
14835 template<typename Derived>
14836 StmtResult
14837 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14838   SourceLocation Loc = S->getBeginLoc();
14839   CapturedDecl *CD = S->getCapturedDecl();
14840   unsigned NumParams = CD->getNumParams();
14841   unsigned ContextParamPos = CD->getContextParamPosition();
14842   SmallVector<Sema::CapturedParamNameType, 4> Params;
14843   for (unsigned I = 0; I < NumParams; ++I) {
14844     if (I != ContextParamPos) {
14845       Params.push_back(
14846              std::make_pair(
14847                   CD->getParam(I)->getName(),
14848                   getDerived().TransformType(CD->getParam(I)->getType())));
14849     } else {
14850       Params.push_back(std::make_pair(StringRef(), QualType()));
14851     }
14852   }
14853   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14854                                      S->getCapturedRegionKind(), Params);
14855   StmtResult Body;
14856   {
14857     Sema::CompoundScopeRAII CompoundScope(getSema());
14858     Body = getDerived().TransformStmt(S->getCapturedStmt());
14859   }
14860 
14861   if (Body.isInvalid()) {
14862     getSema().ActOnCapturedRegionError();
14863     return StmtError();
14864   }
14865 
14866   return getSema().ActOnCapturedRegionEnd(Body.get());
14867 }
14868 
14869 } // end namespace clang
14870 
14871 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14872