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 typedef type.
937   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
938     return SemaRef.Context.getTypeDeclType(Typedef);
939   }
940 
941   /// Build a new MacroDefined type.
942   QualType RebuildMacroQualifiedType(QualType T,
943                                      const IdentifierInfo *MacroII) {
944     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
945   }
946 
947   /// Build a new class/struct/union type.
948   QualType RebuildRecordType(RecordDecl *Record) {
949     return SemaRef.Context.getTypeDeclType(Record);
950   }
951 
952   /// Build a new Enum type.
953   QualType RebuildEnumType(EnumDecl *Enum) {
954     return SemaRef.Context.getTypeDeclType(Enum);
955   }
956 
957   /// Build a new typeof(expr) type.
958   ///
959   /// By default, performs semantic analysis when building the typeof type.
960   /// Subclasses may override this routine to provide different behavior.
961   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
962 
963   /// Build a new typeof(type) type.
964   ///
965   /// By default, builds a new TypeOfType with the given underlying type.
966   QualType RebuildTypeOfType(QualType Underlying);
967 
968   /// Build a new unary transform type.
969   QualType RebuildUnaryTransformType(QualType BaseType,
970                                      UnaryTransformType::UTTKind UKind,
971                                      SourceLocation Loc);
972 
973   /// Build a new C++11 decltype type.
974   ///
975   /// By default, performs semantic analysis when building the decltype type.
976   /// Subclasses may override this routine to provide different behavior.
977   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
978 
979   /// Build a new C++11 auto type.
980   ///
981   /// By default, builds a new AutoType with the given deduced type.
982   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
983                            ConceptDecl *TypeConstraintConcept,
984                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
985     // Note, IsDependent is always false here: we implicitly convert an 'auto'
986     // which has been deduced to a dependent type into an undeduced 'auto', so
987     // that we'll retry deduction after the transformation.
988     return SemaRef.Context.getAutoType(Deduced, Keyword,
989                                        /*IsDependent*/ false, /*IsPack=*/false,
990                                        TypeConstraintConcept,
991                                        TypeConstraintArgs);
992   }
993 
994   /// By default, builds a new DeducedTemplateSpecializationType with the given
995   /// deduced type.
996   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
997       QualType Deduced) {
998     return SemaRef.Context.getDeducedTemplateSpecializationType(
999         Template, Deduced, /*IsDependent*/ false);
1000   }
1001 
1002   /// Build a new template specialization type.
1003   ///
1004   /// By default, performs semantic analysis when building the template
1005   /// specialization type. Subclasses may override this routine to provide
1006   /// different behavior.
1007   QualType RebuildTemplateSpecializationType(TemplateName Template,
1008                                              SourceLocation TemplateLoc,
1009                                              TemplateArgumentListInfo &Args);
1010 
1011   /// Build a new parenthesized type.
1012   ///
1013   /// By default, builds a new ParenType type from the inner type.
1014   /// Subclasses may override this routine to provide different behavior.
1015   QualType RebuildParenType(QualType InnerType) {
1016     return SemaRef.BuildParenType(InnerType);
1017   }
1018 
1019   /// Build a new qualified name type.
1020   ///
1021   /// By default, builds a new ElaboratedType type from the keyword,
1022   /// the nested-name-specifier and the named type.
1023   /// Subclasses may override this routine to provide different behavior.
1024   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1025                                  ElaboratedTypeKeyword Keyword,
1026                                  NestedNameSpecifierLoc QualifierLoc,
1027                                  QualType Named) {
1028     return SemaRef.Context.getElaboratedType(Keyword,
1029                                          QualifierLoc.getNestedNameSpecifier(),
1030                                              Named);
1031   }
1032 
1033   /// Build a new typename type that refers to a template-id.
1034   ///
1035   /// By default, builds a new DependentNameType type from the
1036   /// nested-name-specifier and the given type. Subclasses may override
1037   /// this routine to provide different behavior.
1038   QualType RebuildDependentTemplateSpecializationType(
1039                                           ElaboratedTypeKeyword Keyword,
1040                                           NestedNameSpecifierLoc QualifierLoc,
1041                                           SourceLocation TemplateKWLoc,
1042                                           const IdentifierInfo *Name,
1043                                           SourceLocation NameLoc,
1044                                           TemplateArgumentListInfo &Args,
1045                                           bool AllowInjectedClassName) {
1046     // Rebuild the template name.
1047     // TODO: avoid TemplateName abstraction
1048     CXXScopeSpec SS;
1049     SS.Adopt(QualifierLoc);
1050     TemplateName InstName = getDerived().RebuildTemplateName(
1051         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1052         AllowInjectedClassName);
1053 
1054     if (InstName.isNull())
1055       return QualType();
1056 
1057     // If it's still dependent, make a dependent specialization.
1058     if (InstName.getAsDependentTemplateName())
1059       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1060                                           QualifierLoc.getNestedNameSpecifier(),
1061                                                                     Name,
1062                                                                     Args);
1063 
1064     // Otherwise, make an elaborated type wrapping a non-dependent
1065     // specialization.
1066     QualType T =
1067     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1068     if (T.isNull()) return QualType();
1069 
1070     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1071       return T;
1072 
1073     return SemaRef.Context.getElaboratedType(Keyword,
1074                                        QualifierLoc.getNestedNameSpecifier(),
1075                                              T);
1076   }
1077 
1078   /// Build a new typename type that refers to an identifier.
1079   ///
1080   /// By default, performs semantic analysis when building the typename type
1081   /// (or elaborated type). Subclasses may override this routine to provide
1082   /// different behavior.
1083   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1084                                     SourceLocation KeywordLoc,
1085                                     NestedNameSpecifierLoc QualifierLoc,
1086                                     const IdentifierInfo *Id,
1087                                     SourceLocation IdLoc,
1088                                     bool DeducedTSTContext) {
1089     CXXScopeSpec SS;
1090     SS.Adopt(QualifierLoc);
1091 
1092     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1093       // If the name is still dependent, just build a new dependent name type.
1094       if (!SemaRef.computeDeclContext(SS))
1095         return SemaRef.Context.getDependentNameType(Keyword,
1096                                           QualifierLoc.getNestedNameSpecifier(),
1097                                                     Id);
1098     }
1099 
1100     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1101       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1102                                        *Id, IdLoc, DeducedTSTContext);
1103     }
1104 
1105     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1106 
1107     // We had a dependent elaborated-type-specifier that has been transformed
1108     // into a non-dependent elaborated-type-specifier. Find the tag we're
1109     // referring to.
1110     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1111     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1112     if (!DC)
1113       return QualType();
1114 
1115     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1116       return QualType();
1117 
1118     TagDecl *Tag = nullptr;
1119     SemaRef.LookupQualifiedName(Result, DC);
1120     switch (Result.getResultKind()) {
1121       case LookupResult::NotFound:
1122       case LookupResult::NotFoundInCurrentInstantiation:
1123         break;
1124 
1125       case LookupResult::Found:
1126         Tag = Result.getAsSingle<TagDecl>();
1127         break;
1128 
1129       case LookupResult::FoundOverloaded:
1130       case LookupResult::FoundUnresolvedValue:
1131         llvm_unreachable("Tag lookup cannot find non-tags");
1132 
1133       case LookupResult::Ambiguous:
1134         // Let the LookupResult structure handle ambiguities.
1135         return QualType();
1136     }
1137 
1138     if (!Tag) {
1139       // Check where the name exists but isn't a tag type and use that to emit
1140       // better diagnostics.
1141       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1142       SemaRef.LookupQualifiedName(Result, DC);
1143       switch (Result.getResultKind()) {
1144         case LookupResult::Found:
1145         case LookupResult::FoundOverloaded:
1146         case LookupResult::FoundUnresolvedValue: {
1147           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1148           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1149           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1150                                                                << NTK << Kind;
1151           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1152           break;
1153         }
1154         default:
1155           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1156               << Kind << Id << DC << QualifierLoc.getSourceRange();
1157           break;
1158       }
1159       return QualType();
1160     }
1161 
1162     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1163                                               IdLoc, Id)) {
1164       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1165       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1166       return QualType();
1167     }
1168 
1169     // Build the elaborated-type-specifier type.
1170     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1171     return SemaRef.Context.getElaboratedType(Keyword,
1172                                          QualifierLoc.getNestedNameSpecifier(),
1173                                              T);
1174   }
1175 
1176   /// Build a new pack expansion type.
1177   ///
1178   /// By default, builds a new PackExpansionType type from the given pattern.
1179   /// Subclasses may override this routine to provide different behavior.
1180   QualType RebuildPackExpansionType(QualType Pattern,
1181                                     SourceRange PatternRange,
1182                                     SourceLocation EllipsisLoc,
1183                                     Optional<unsigned> NumExpansions) {
1184     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1185                                         NumExpansions);
1186   }
1187 
1188   /// Build a new atomic type given its value type.
1189   ///
1190   /// By default, performs semantic analysis when building the atomic type.
1191   /// Subclasses may override this routine to provide different behavior.
1192   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1193 
1194   /// Build a new pipe type given its value type.
1195   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1196                            bool isReadPipe);
1197 
1198    /// Build an extended int given its value type.
1199   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1200                              SourceLocation Loc);
1201 
1202   /// Build a dependent extended int given its value type.
1203   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1204                                       SourceLocation Loc);
1205 
1206   /// Build a new template name given a nested name specifier, a flag
1207   /// indicating whether the "template" keyword was provided, and the template
1208   /// that the template name refers to.
1209   ///
1210   /// By default, builds the new template name directly. Subclasses may override
1211   /// this routine to provide different behavior.
1212   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1213                                    bool TemplateKW,
1214                                    TemplateDecl *Template);
1215 
1216   /// Build a new template name given a nested name specifier and the
1217   /// name that is referred to as a template.
1218   ///
1219   /// By default, performs semantic analysis to determine whether the name can
1220   /// be resolved to a specific template, then builds the appropriate kind of
1221   /// template name. Subclasses may override this routine to provide different
1222   /// behavior.
1223   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1224                                    SourceLocation TemplateKWLoc,
1225                                    const IdentifierInfo &Name,
1226                                    SourceLocation NameLoc, QualType ObjectType,
1227                                    NamedDecl *FirstQualifierInScope,
1228                                    bool AllowInjectedClassName);
1229 
1230   /// Build a new template name given a nested name specifier and the
1231   /// overloaded operator name that is referred to as a template.
1232   ///
1233   /// By default, performs semantic analysis to determine whether the name can
1234   /// be resolved to a specific template, then builds the appropriate kind of
1235   /// template name. Subclasses may override this routine to provide different
1236   /// behavior.
1237   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1238                                    SourceLocation TemplateKWLoc,
1239                                    OverloadedOperatorKind Operator,
1240                                    SourceLocation NameLoc, QualType ObjectType,
1241                                    bool AllowInjectedClassName);
1242 
1243   /// Build a new template name given a template template parameter pack
1244   /// and the
1245   ///
1246   /// By default, performs semantic analysis to determine whether the name can
1247   /// be resolved to a specific template, then builds the appropriate kind of
1248   /// template name. Subclasses may override this routine to provide different
1249   /// behavior.
1250   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1251                                    const TemplateArgument &ArgPack) {
1252     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1253   }
1254 
1255   /// Build a new compound statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
1259   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1260                                        MultiStmtArg Statements,
1261                                        SourceLocation RBraceLoc,
1262                                        bool IsStmtExpr) {
1263     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1264                                        IsStmtExpr);
1265   }
1266 
1267   /// Build a new case statement.
1268   ///
1269   /// By default, performs semantic analysis to build the new statement.
1270   /// Subclasses may override this routine to provide different behavior.
1271   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1272                                    Expr *LHS,
1273                                    SourceLocation EllipsisLoc,
1274                                    Expr *RHS,
1275                                    SourceLocation ColonLoc) {
1276     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1277                                    ColonLoc);
1278   }
1279 
1280   /// Attach the body to a new case statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
1284   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1285     getSema().ActOnCaseStmtBody(S, Body);
1286     return S;
1287   }
1288 
1289   /// Build a new default statement.
1290   ///
1291   /// By default, performs semantic analysis to build the new statement.
1292   /// Subclasses may override this routine to provide different behavior.
1293   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1294                                       SourceLocation ColonLoc,
1295                                       Stmt *SubStmt) {
1296     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1297                                       /*CurScope=*/nullptr);
1298   }
1299 
1300   /// Build a new label statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
1304   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1305                               SourceLocation ColonLoc, Stmt *SubStmt) {
1306     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1307   }
1308 
1309   /// Build a new attributed statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
1313   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1314                                    ArrayRef<const Attr *> Attrs,
1315                                    Stmt *SubStmt) {
1316     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1317   }
1318 
1319   /// Build a new "if" statement.
1320   ///
1321   /// By default, performs semantic analysis to build the new statement.
1322   /// Subclasses may override this routine to provide different behavior.
1323   StmtResult RebuildIfStmt(SourceLocation IfLoc, IfStatementKind Kind,
1324                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1325                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1326                            SourceLocation ElseLoc, Stmt *Else) {
1327     return getSema().ActOnIfStmt(IfLoc, Kind, LParenLoc, Init, Cond, RParenLoc,
1328                                  Then, ElseLoc, Else);
1329   }
1330 
1331   /// Start building a new switch statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1336                                     SourceLocation LParenLoc, Stmt *Init,
1337                                     Sema::ConditionResult Cond,
1338                                     SourceLocation RParenLoc) {
1339     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1340                                             RParenLoc);
1341   }
1342 
1343   /// Attach the body to the switch statement.
1344   ///
1345   /// By default, performs semantic analysis to build the new statement.
1346   /// Subclasses may override this routine to provide different behavior.
1347   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1348                                    Stmt *Switch, Stmt *Body) {
1349     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1350   }
1351 
1352   /// Build a new while statement.
1353   ///
1354   /// By default, performs semantic analysis to build the new statement.
1355   /// Subclasses may override this routine to provide different behavior.
1356   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1357                               Sema::ConditionResult Cond,
1358                               SourceLocation RParenLoc, Stmt *Body) {
1359     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1360   }
1361 
1362   /// Build a new do-while statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
1366   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1367                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1368                            Expr *Cond, SourceLocation RParenLoc) {
1369     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1370                                  Cond, RParenLoc);
1371   }
1372 
1373   /// Build a new for statement.
1374   ///
1375   /// By default, performs semantic analysis to build the new statement.
1376   /// Subclasses may override this routine to provide different behavior.
1377   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1378                             Stmt *Init, Sema::ConditionResult Cond,
1379                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1380                             Stmt *Body) {
1381     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1382                                   Inc, RParenLoc, Body);
1383   }
1384 
1385   /// Build a new goto statement.
1386   ///
1387   /// By default, performs semantic analysis to build the new statement.
1388   /// Subclasses may override this routine to provide different behavior.
1389   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1390                              LabelDecl *Label) {
1391     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1392   }
1393 
1394   /// Build a new indirect goto statement.
1395   ///
1396   /// By default, performs semantic analysis to build the new statement.
1397   /// Subclasses may override this routine to provide different behavior.
1398   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1399                                      SourceLocation StarLoc,
1400                                      Expr *Target) {
1401     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1402   }
1403 
1404   /// Build a new return statement.
1405   ///
1406   /// By default, performs semantic analysis to build the new statement.
1407   /// Subclasses may override this routine to provide different behavior.
1408   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1409     return getSema().BuildReturnStmt(ReturnLoc, Result);
1410   }
1411 
1412   /// Build a new declaration statement.
1413   ///
1414   /// By default, performs semantic analysis to build the new statement.
1415   /// Subclasses may override this routine to provide different behavior.
1416   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1417                              SourceLocation StartLoc, SourceLocation EndLoc) {
1418     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1419     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1420   }
1421 
1422   /// Build a new inline asm statement.
1423   ///
1424   /// By default, performs semantic analysis to build the new statement.
1425   /// Subclasses may override this routine to provide different behavior.
1426   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1427                                bool IsVolatile, unsigned NumOutputs,
1428                                unsigned NumInputs, IdentifierInfo **Names,
1429                                MultiExprArg Constraints, MultiExprArg Exprs,
1430                                Expr *AsmString, MultiExprArg Clobbers,
1431                                unsigned NumLabels,
1432                                SourceLocation RParenLoc) {
1433     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1434                                      NumInputs, Names, Constraints, Exprs,
1435                                      AsmString, Clobbers, NumLabels, RParenLoc);
1436   }
1437 
1438   /// Build a new MS style inline asm statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1443                               ArrayRef<Token> AsmToks,
1444                               StringRef AsmString,
1445                               unsigned NumOutputs, unsigned NumInputs,
1446                               ArrayRef<StringRef> Constraints,
1447                               ArrayRef<StringRef> Clobbers,
1448                               ArrayRef<Expr*> Exprs,
1449                               SourceLocation EndLoc) {
1450     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1451                                     NumOutputs, NumInputs,
1452                                     Constraints, Clobbers, Exprs, EndLoc);
1453   }
1454 
1455   /// Build a new co_return statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
1459   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1460                                  bool IsImplicit) {
1461     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1462   }
1463 
1464   /// Build a new co_await expression.
1465   ///
1466   /// By default, performs semantic analysis to build the new expression.
1467   /// Subclasses may override this routine to provide different behavior.
1468   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1469                                 bool IsImplicit) {
1470     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1471   }
1472 
1473   /// Build a new co_await expression.
1474   ///
1475   /// By default, performs semantic analysis to build the new expression.
1476   /// Subclasses may override this routine to provide different behavior.
1477   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1478                                          Expr *Result,
1479                                          UnresolvedLookupExpr *Lookup) {
1480     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1481   }
1482 
1483   /// Build a new co_yield expression.
1484   ///
1485   /// By default, performs semantic analysis to build the new expression.
1486   /// Subclasses may override this routine to provide different behavior.
1487   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1488     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1489   }
1490 
1491   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1492     return getSema().BuildCoroutineBodyStmt(Args);
1493   }
1494 
1495   /// Build a new Objective-C \@try statement.
1496   ///
1497   /// By default, performs semantic analysis to build the new statement.
1498   /// Subclasses may override this routine to provide different behavior.
1499   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1500                                         Stmt *TryBody,
1501                                         MultiStmtArg CatchStmts,
1502                                         Stmt *Finally) {
1503     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1504                                         Finally);
1505   }
1506 
1507   /// Rebuild an Objective-C exception declaration.
1508   ///
1509   /// By default, performs semantic analysis to build the new declaration.
1510   /// Subclasses may override this routine to provide different behavior.
1511   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1512                                     TypeSourceInfo *TInfo, QualType T) {
1513     return getSema().BuildObjCExceptionDecl(TInfo, T,
1514                                             ExceptionDecl->getInnerLocStart(),
1515                                             ExceptionDecl->getLocation(),
1516                                             ExceptionDecl->getIdentifier());
1517   }
1518 
1519   /// Build a new Objective-C \@catch statement.
1520   ///
1521   /// By default, performs semantic analysis to build the new statement.
1522   /// Subclasses may override this routine to provide different behavior.
1523   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1524                                           SourceLocation RParenLoc,
1525                                           VarDecl *Var,
1526                                           Stmt *Body) {
1527     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1528                                           Var, Body);
1529   }
1530 
1531   /// Build a new Objective-C \@finally statement.
1532   ///
1533   /// By default, performs semantic analysis to build the new statement.
1534   /// Subclasses may override this routine to provide different behavior.
1535   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1536                                             Stmt *Body) {
1537     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1538   }
1539 
1540   /// Build a new Objective-C \@throw statement.
1541   ///
1542   /// By default, performs semantic analysis to build the new statement.
1543   /// Subclasses may override this routine to provide different behavior.
1544   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1545                                           Expr *Operand) {
1546     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1547   }
1548 
1549   /// Build a new OpenMP Canonical loop.
1550   ///
1551   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1552   /// OMPCanonicalLoop.
1553   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1554     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1555   }
1556 
1557   /// Build a new OpenMP executable directive.
1558   ///
1559   /// By default, performs semantic analysis to build the new statement.
1560   /// Subclasses may override this routine to provide different behavior.
1561   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1562                                            DeclarationNameInfo DirName,
1563                                            OpenMPDirectiveKind CancelRegion,
1564                                            ArrayRef<OMPClause *> Clauses,
1565                                            Stmt *AStmt, SourceLocation StartLoc,
1566                                            SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPExecutableDirective(
1568         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1569   }
1570 
1571   /// Build a new OpenMP 'if' clause.
1572   ///
1573   /// By default, performs semantic analysis to build the new OpenMP clause.
1574   /// Subclasses may override this routine to provide different behavior.
1575   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1576                                 Expr *Condition, SourceLocation StartLoc,
1577                                 SourceLocation LParenLoc,
1578                                 SourceLocation NameModifierLoc,
1579                                 SourceLocation ColonLoc,
1580                                 SourceLocation EndLoc) {
1581     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1582                                          LParenLoc, NameModifierLoc, ColonLoc,
1583                                          EndLoc);
1584   }
1585 
1586   /// Build a new OpenMP 'final' clause.
1587   ///
1588   /// By default, performs semantic analysis to build the new OpenMP clause.
1589   /// Subclasses may override this routine to provide different behavior.
1590   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1591                                    SourceLocation LParenLoc,
1592                                    SourceLocation EndLoc) {
1593     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1594                                             EndLoc);
1595   }
1596 
1597   /// Build a new OpenMP 'num_threads' clause.
1598   ///
1599   /// By default, performs semantic analysis to build the new OpenMP clause.
1600   /// Subclasses may override this routine to provide different behavior.
1601   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1602                                         SourceLocation StartLoc,
1603                                         SourceLocation LParenLoc,
1604                                         SourceLocation EndLoc) {
1605     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1606                                                  LParenLoc, EndLoc);
1607   }
1608 
1609   /// Build a new OpenMP 'safelen' clause.
1610   ///
1611   /// By default, performs semantic analysis to build the new OpenMP clause.
1612   /// Subclasses may override this routine to provide different behavior.
1613   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1614                                      SourceLocation LParenLoc,
1615                                      SourceLocation EndLoc) {
1616     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1617   }
1618 
1619   /// Build a new OpenMP 'simdlen' clause.
1620   ///
1621   /// By default, performs semantic analysis to build the new OpenMP clause.
1622   /// Subclasses may override this routine to provide different behavior.
1623   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1624                                      SourceLocation LParenLoc,
1625                                      SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1627   }
1628 
1629   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1630                                    SourceLocation StartLoc,
1631                                    SourceLocation LParenLoc,
1632                                    SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'full' clause.
1637   OMPClause *RebuildOMPFullClause(SourceLocation StartLoc,
1638                                   SourceLocation EndLoc) {
1639     return getSema().ActOnOpenMPFullClause(StartLoc, EndLoc);
1640   }
1641 
1642   /// Build a new OpenMP 'partial' clause.
1643   OMPClause *RebuildOMPPartialClause(Expr *Factor, SourceLocation StartLoc,
1644                                      SourceLocation LParenLoc,
1645                                      SourceLocation EndLoc) {
1646     return getSema().ActOnOpenMPPartialClause(Factor, StartLoc, LParenLoc,
1647                                               EndLoc);
1648   }
1649 
1650   /// Build a new OpenMP 'allocator' clause.
1651   ///
1652   /// By default, performs semantic analysis to build the new OpenMP clause.
1653   /// Subclasses may override this routine to provide different behavior.
1654   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1655                                        SourceLocation LParenLoc,
1656                                        SourceLocation EndLoc) {
1657     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1658   }
1659 
1660   /// Build a new OpenMP 'collapse' clause.
1661   ///
1662   /// By default, performs semantic analysis to build the new OpenMP clause.
1663   /// Subclasses may override this routine to provide different behavior.
1664   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1665                                       SourceLocation LParenLoc,
1666                                       SourceLocation EndLoc) {
1667     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1668                                                EndLoc);
1669   }
1670 
1671   /// Build a new OpenMP 'default' clause.
1672   ///
1673   /// By default, performs semantic analysis to build the new OpenMP clause.
1674   /// Subclasses may override this routine to provide different behavior.
1675   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1676                                      SourceLocation StartLoc,
1677                                      SourceLocation LParenLoc,
1678                                      SourceLocation EndLoc) {
1679     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1680                                               StartLoc, LParenLoc, EndLoc);
1681   }
1682 
1683   /// Build a new OpenMP 'proc_bind' clause.
1684   ///
1685   /// By default, performs semantic analysis to build the new OpenMP clause.
1686   /// Subclasses may override this routine to provide different behavior.
1687   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1688                                       SourceLocation KindKwLoc,
1689                                       SourceLocation StartLoc,
1690                                       SourceLocation LParenLoc,
1691                                       SourceLocation EndLoc) {
1692     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1693                                                StartLoc, LParenLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'schedule' clause.
1697   ///
1698   /// By default, performs semantic analysis to build the new OpenMP clause.
1699   /// Subclasses may override this routine to provide different behavior.
1700   OMPClause *RebuildOMPScheduleClause(
1701       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1702       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1703       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1704       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1705     return getSema().ActOnOpenMPScheduleClause(
1706         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1707         CommaLoc, EndLoc);
1708   }
1709 
1710   /// Build a new OpenMP 'ordered' clause.
1711   ///
1712   /// By default, performs semantic analysis to build the new OpenMP clause.
1713   /// Subclasses may override this routine to provide different behavior.
1714   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1715                                      SourceLocation EndLoc,
1716                                      SourceLocation LParenLoc, Expr *Num) {
1717     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1718   }
1719 
1720   /// Build a new OpenMP 'private' clause.
1721   ///
1722   /// By default, performs semantic analysis to build the new OpenMP clause.
1723   /// Subclasses may override this routine to provide different behavior.
1724   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1725                                      SourceLocation StartLoc,
1726                                      SourceLocation LParenLoc,
1727                                      SourceLocation EndLoc) {
1728     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1729                                               EndLoc);
1730   }
1731 
1732   /// Build a new OpenMP 'firstprivate' clause.
1733   ///
1734   /// By default, performs semantic analysis to build the new OpenMP clause.
1735   /// Subclasses may override this routine to provide different behavior.
1736   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1737                                           SourceLocation StartLoc,
1738                                           SourceLocation LParenLoc,
1739                                           SourceLocation EndLoc) {
1740     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1741                                                    EndLoc);
1742   }
1743 
1744   /// Build a new OpenMP 'lastprivate' clause.
1745   ///
1746   /// By default, performs semantic analysis to build the new OpenMP clause.
1747   /// Subclasses may override this routine to provide different behavior.
1748   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1749                                          OpenMPLastprivateModifier LPKind,
1750                                          SourceLocation LPKindLoc,
1751                                          SourceLocation ColonLoc,
1752                                          SourceLocation StartLoc,
1753                                          SourceLocation LParenLoc,
1754                                          SourceLocation EndLoc) {
1755     return getSema().ActOnOpenMPLastprivateClause(
1756         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1757   }
1758 
1759   /// Build a new OpenMP 'shared' clause.
1760   ///
1761   /// By default, performs semantic analysis to build the new OpenMP clause.
1762   /// Subclasses may override this routine to provide different behavior.
1763   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1764                                     SourceLocation StartLoc,
1765                                     SourceLocation LParenLoc,
1766                                     SourceLocation EndLoc) {
1767     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1768                                              EndLoc);
1769   }
1770 
1771   /// Build a new OpenMP 'reduction' clause.
1772   ///
1773   /// By default, performs semantic analysis to build the new statement.
1774   /// Subclasses may override this routine to provide different behavior.
1775   OMPClause *RebuildOMPReductionClause(
1776       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1777       SourceLocation StartLoc, SourceLocation LParenLoc,
1778       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1779       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1780       const DeclarationNameInfo &ReductionId,
1781       ArrayRef<Expr *> UnresolvedReductions) {
1782     return getSema().ActOnOpenMPReductionClause(
1783         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1784         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1785   }
1786 
1787   /// Build a new OpenMP 'task_reduction' clause.
1788   ///
1789   /// By default, performs semantic analysis to build the new statement.
1790   /// Subclasses may override this routine to provide different behavior.
1791   OMPClause *RebuildOMPTaskReductionClause(
1792       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1793       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1794       CXXScopeSpec &ReductionIdScopeSpec,
1795       const DeclarationNameInfo &ReductionId,
1796       ArrayRef<Expr *> UnresolvedReductions) {
1797     return getSema().ActOnOpenMPTaskReductionClause(
1798         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1799         ReductionId, UnresolvedReductions);
1800   }
1801 
1802   /// Build a new OpenMP 'in_reduction' clause.
1803   ///
1804   /// By default, performs semantic analysis to build the new statement.
1805   /// Subclasses may override this routine to provide different behavior.
1806   OMPClause *
1807   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1808                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1809                               SourceLocation EndLoc,
1810                               CXXScopeSpec &ReductionIdScopeSpec,
1811                               const DeclarationNameInfo &ReductionId,
1812                               ArrayRef<Expr *> UnresolvedReductions) {
1813     return getSema().ActOnOpenMPInReductionClause(
1814         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1815         ReductionId, UnresolvedReductions);
1816   }
1817 
1818   /// Build a new OpenMP 'linear' clause.
1819   ///
1820   /// By default, performs semantic analysis to build the new OpenMP clause.
1821   /// Subclasses may override this routine to provide different behavior.
1822   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1823                                     SourceLocation StartLoc,
1824                                     SourceLocation LParenLoc,
1825                                     OpenMPLinearClauseKind Modifier,
1826                                     SourceLocation ModifierLoc,
1827                                     SourceLocation ColonLoc,
1828                                     SourceLocation EndLoc) {
1829     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1830                                              Modifier, ModifierLoc, ColonLoc,
1831                                              EndLoc);
1832   }
1833 
1834   /// Build a new OpenMP 'aligned' clause.
1835   ///
1836   /// By default, performs semantic analysis to build the new OpenMP clause.
1837   /// Subclasses may override this routine to provide different behavior.
1838   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1839                                      SourceLocation StartLoc,
1840                                      SourceLocation LParenLoc,
1841                                      SourceLocation ColonLoc,
1842                                      SourceLocation EndLoc) {
1843     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1844                                               LParenLoc, ColonLoc, EndLoc);
1845   }
1846 
1847   /// Build a new OpenMP 'copyin' clause.
1848   ///
1849   /// By default, performs semantic analysis to build the new OpenMP clause.
1850   /// Subclasses may override this routine to provide different behavior.
1851   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1852                                     SourceLocation StartLoc,
1853                                     SourceLocation LParenLoc,
1854                                     SourceLocation EndLoc) {
1855     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1856                                              EndLoc);
1857   }
1858 
1859   /// Build a new OpenMP 'copyprivate' clause.
1860   ///
1861   /// By default, performs semantic analysis to build the new OpenMP clause.
1862   /// Subclasses may override this routine to provide different behavior.
1863   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1864                                          SourceLocation StartLoc,
1865                                          SourceLocation LParenLoc,
1866                                          SourceLocation EndLoc) {
1867     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1868                                                   EndLoc);
1869   }
1870 
1871   /// Build a new OpenMP 'flush' pseudo clause.
1872   ///
1873   /// By default, performs semantic analysis to build the new OpenMP clause.
1874   /// Subclasses may override this routine to provide different behavior.
1875   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1876                                    SourceLocation StartLoc,
1877                                    SourceLocation LParenLoc,
1878                                    SourceLocation EndLoc) {
1879     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1880                                             EndLoc);
1881   }
1882 
1883   /// Build a new OpenMP 'depobj' pseudo clause.
1884   ///
1885   /// By default, performs semantic analysis to build the new OpenMP clause.
1886   /// Subclasses may override this routine to provide different behavior.
1887   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1888                                     SourceLocation LParenLoc,
1889                                     SourceLocation EndLoc) {
1890     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1891                                              EndLoc);
1892   }
1893 
1894   /// Build a new OpenMP 'depend' pseudo clause.
1895   ///
1896   /// By default, performs semantic analysis to build the new OpenMP clause.
1897   /// Subclasses may override this routine to provide different behavior.
1898   OMPClause *
1899   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1900                          SourceLocation DepLoc, SourceLocation ColonLoc,
1901                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1902                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1903     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1904                                              ColonLoc, VarList, StartLoc,
1905                                              LParenLoc, EndLoc);
1906   }
1907 
1908   /// Build a new OpenMP 'device' clause.
1909   ///
1910   /// By default, performs semantic analysis to build the new statement.
1911   /// Subclasses may override this routine to provide different behavior.
1912   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1913                                     Expr *Device, SourceLocation StartLoc,
1914                                     SourceLocation LParenLoc,
1915                                     SourceLocation ModifierLoc,
1916                                     SourceLocation EndLoc) {
1917     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1918                                              LParenLoc, ModifierLoc, EndLoc);
1919   }
1920 
1921   /// Build a new OpenMP 'map' clause.
1922   ///
1923   /// By default, performs semantic analysis to build the new OpenMP clause.
1924   /// Subclasses may override this routine to provide different behavior.
1925   OMPClause *RebuildOMPMapClause(
1926       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1927       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1928       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1929       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1930       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1931       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1932     return getSema().ActOnOpenMPMapClause(
1933         MapTypeModifiers, MapTypeModifiersLoc, MapperIdScopeSpec, MapperId,
1934         MapType, IsMapTypeImplicit, MapLoc, ColonLoc, VarList, Locs,
1935         /*NoDiagnose=*/false, UnresolvedMappers);
1936   }
1937 
1938   /// Build a new OpenMP 'allocate' clause.
1939   ///
1940   /// By default, performs semantic analysis to build the new OpenMP clause.
1941   /// Subclasses may override this routine to provide different behavior.
1942   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1943                                       SourceLocation StartLoc,
1944                                       SourceLocation LParenLoc,
1945                                       SourceLocation ColonLoc,
1946                                       SourceLocation EndLoc) {
1947     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1948                                                LParenLoc, ColonLoc, EndLoc);
1949   }
1950 
1951   /// Build a new OpenMP 'num_teams' clause.
1952   ///
1953   /// By default, performs semantic analysis to build the new statement.
1954   /// Subclasses may override this routine to provide different behavior.
1955   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1956                                       SourceLocation LParenLoc,
1957                                       SourceLocation EndLoc) {
1958     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1959                                                EndLoc);
1960   }
1961 
1962   /// Build a new OpenMP 'thread_limit' clause.
1963   ///
1964   /// By default, performs semantic analysis to build the new statement.
1965   /// Subclasses may override this routine to provide different behavior.
1966   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1967                                          SourceLocation StartLoc,
1968                                          SourceLocation LParenLoc,
1969                                          SourceLocation EndLoc) {
1970     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1971                                                   LParenLoc, EndLoc);
1972   }
1973 
1974   /// Build a new OpenMP 'priority' clause.
1975   ///
1976   /// By default, performs semantic analysis to build the new statement.
1977   /// Subclasses may override this routine to provide different behavior.
1978   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1979                                       SourceLocation LParenLoc,
1980                                       SourceLocation EndLoc) {
1981     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1982                                                EndLoc);
1983   }
1984 
1985   /// Build a new OpenMP 'grainsize' clause.
1986   ///
1987   /// By default, performs semantic analysis to build the new statement.
1988   /// Subclasses may override this routine to provide different behavior.
1989   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1990                                        SourceLocation LParenLoc,
1991                                        SourceLocation EndLoc) {
1992     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1993                                                 EndLoc);
1994   }
1995 
1996   /// Build a new OpenMP 'num_tasks' clause.
1997   ///
1998   /// By default, performs semantic analysis to build the new statement.
1999   /// Subclasses may override this routine to provide different behavior.
2000   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
2001                                       SourceLocation LParenLoc,
2002                                       SourceLocation EndLoc) {
2003     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
2004                                                EndLoc);
2005   }
2006 
2007   /// Build a new OpenMP 'hint' clause.
2008   ///
2009   /// By default, performs semantic analysis to build the new statement.
2010   /// Subclasses may override this routine to provide different behavior.
2011   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
2012                                   SourceLocation LParenLoc,
2013                                   SourceLocation EndLoc) {
2014     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2015   }
2016 
2017   /// Build a new OpenMP 'detach' clause.
2018   ///
2019   /// By default, performs semantic analysis to build the new statement.
2020   /// Subclasses may override this routine to provide different behavior.
2021   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2022                                     SourceLocation LParenLoc,
2023                                     SourceLocation EndLoc) {
2024     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2025   }
2026 
2027   /// Build a new OpenMP 'dist_schedule' clause.
2028   ///
2029   /// By default, performs semantic analysis to build the new OpenMP clause.
2030   /// Subclasses may override this routine to provide different behavior.
2031   OMPClause *
2032   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2033                                Expr *ChunkSize, SourceLocation StartLoc,
2034                                SourceLocation LParenLoc, SourceLocation KindLoc,
2035                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2036     return getSema().ActOnOpenMPDistScheduleClause(
2037         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2038   }
2039 
2040   /// Build a new OpenMP 'to' clause.
2041   ///
2042   /// By default, performs semantic analysis to build the new statement.
2043   /// Subclasses may override this routine to provide different behavior.
2044   OMPClause *
2045   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2046                      ArrayRef<SourceLocation> MotionModifiersLoc,
2047                      CXXScopeSpec &MapperIdScopeSpec,
2048                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2049                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2050                      ArrayRef<Expr *> UnresolvedMappers) {
2051     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2052                                          MapperIdScopeSpec, MapperId, ColonLoc,
2053                                          VarList, Locs, UnresolvedMappers);
2054   }
2055 
2056   /// Build a new OpenMP 'from' clause.
2057   ///
2058   /// By default, performs semantic analysis to build the new statement.
2059   /// Subclasses may override this routine to provide different behavior.
2060   OMPClause *
2061   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2062                        ArrayRef<SourceLocation> MotionModifiersLoc,
2063                        CXXScopeSpec &MapperIdScopeSpec,
2064                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2065                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2066                        ArrayRef<Expr *> UnresolvedMappers) {
2067     return getSema().ActOnOpenMPFromClause(
2068         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2069         ColonLoc, VarList, Locs, UnresolvedMappers);
2070   }
2071 
2072   /// Build a new OpenMP 'use_device_ptr' clause.
2073   ///
2074   /// By default, performs semantic analysis to build the new OpenMP clause.
2075   /// Subclasses may override this routine to provide different behavior.
2076   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2077                                           const OMPVarListLocTy &Locs) {
2078     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2079   }
2080 
2081   /// Build a new OpenMP 'use_device_addr' clause.
2082   ///
2083   /// By default, performs semantic analysis to build the new OpenMP clause.
2084   /// Subclasses may override this routine to provide different behavior.
2085   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2086                                            const OMPVarListLocTy &Locs) {
2087     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2088   }
2089 
2090   /// Build a new OpenMP 'is_device_ptr' clause.
2091   ///
2092   /// By default, performs semantic analysis to build the new OpenMP clause.
2093   /// Subclasses may override this routine to provide different behavior.
2094   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2095                                          const OMPVarListLocTy &Locs) {
2096     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2097   }
2098 
2099   /// Build a new OpenMP 'defaultmap' clause.
2100   ///
2101   /// By default, performs semantic analysis to build the new OpenMP clause.
2102   /// Subclasses may override this routine to provide different behavior.
2103   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2104                                         OpenMPDefaultmapClauseKind Kind,
2105                                         SourceLocation StartLoc,
2106                                         SourceLocation LParenLoc,
2107                                         SourceLocation MLoc,
2108                                         SourceLocation KindLoc,
2109                                         SourceLocation EndLoc) {
2110     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2111                                                  MLoc, KindLoc, EndLoc);
2112   }
2113 
2114   /// Build a new OpenMP 'nontemporal' clause.
2115   ///
2116   /// By default, performs semantic analysis to build the new OpenMP clause.
2117   /// Subclasses may override this routine to provide different behavior.
2118   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2119                                          SourceLocation StartLoc,
2120                                          SourceLocation LParenLoc,
2121                                          SourceLocation EndLoc) {
2122     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2123                                                   EndLoc);
2124   }
2125 
2126   /// Build a new OpenMP 'inclusive' clause.
2127   ///
2128   /// By default, performs semantic analysis to build the new OpenMP clause.
2129   /// Subclasses may override this routine to provide different behavior.
2130   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2131                                        SourceLocation StartLoc,
2132                                        SourceLocation LParenLoc,
2133                                        SourceLocation EndLoc) {
2134     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2135                                                 EndLoc);
2136   }
2137 
2138   /// Build a new OpenMP 'exclusive' clause.
2139   ///
2140   /// By default, performs semantic analysis to build the new OpenMP clause.
2141   /// Subclasses may override this routine to provide different behavior.
2142   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2143                                        SourceLocation StartLoc,
2144                                        SourceLocation LParenLoc,
2145                                        SourceLocation EndLoc) {
2146     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2147                                                 EndLoc);
2148   }
2149 
2150   /// Build a new OpenMP 'uses_allocators' clause.
2151   ///
2152   /// By default, performs semantic analysis to build the new OpenMP clause.
2153   /// Subclasses may override this routine to provide different behavior.
2154   OMPClause *RebuildOMPUsesAllocatorsClause(
2155       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2156       SourceLocation LParenLoc, SourceLocation EndLoc) {
2157     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2158                                                     Data);
2159   }
2160 
2161   /// Build a new OpenMP 'affinity' clause.
2162   ///
2163   /// By default, performs semantic analysis to build the new OpenMP clause.
2164   /// Subclasses may override this routine to provide different behavior.
2165   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2166                                       SourceLocation LParenLoc,
2167                                       SourceLocation ColonLoc,
2168                                       SourceLocation EndLoc, Expr *Modifier,
2169                                       ArrayRef<Expr *> Locators) {
2170     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2171                                                EndLoc, Modifier, Locators);
2172   }
2173 
2174   /// Build a new OpenMP 'order' clause.
2175   ///
2176   /// By default, performs semantic analysis to build the new OpenMP clause.
2177   /// Subclasses may override this routine to provide different behavior.
2178   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2179                                    SourceLocation KindKwLoc,
2180                                    SourceLocation StartLoc,
2181                                    SourceLocation LParenLoc,
2182                                    SourceLocation EndLoc) {
2183     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2184                                             LParenLoc, EndLoc);
2185   }
2186 
2187   /// Build a new OpenMP 'init' clause.
2188   ///
2189   /// By default, performs semantic analysis to build the new OpenMP clause.
2190   /// Subclasses may override this routine to provide different behavior.
2191   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2192                                   bool IsTarget, bool IsTargetSync,
2193                                   SourceLocation StartLoc,
2194                                   SourceLocation LParenLoc,
2195                                   SourceLocation VarLoc,
2196                                   SourceLocation EndLoc) {
2197     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2198                                            IsTargetSync, StartLoc, LParenLoc,
2199                                            VarLoc, EndLoc);
2200   }
2201 
2202   /// Build a new OpenMP 'use' clause.
2203   ///
2204   /// By default, performs semantic analysis to build the new OpenMP clause.
2205   /// Subclasses may override this routine to provide different behavior.
2206   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2207                                  SourceLocation LParenLoc,
2208                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2209     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2210                                           VarLoc, EndLoc);
2211   }
2212 
2213   /// Build a new OpenMP 'destroy' clause.
2214   ///
2215   /// By default, performs semantic analysis to build the new OpenMP clause.
2216   /// Subclasses may override this routine to provide different behavior.
2217   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2218                                      SourceLocation LParenLoc,
2219                                      SourceLocation VarLoc,
2220                                      SourceLocation EndLoc) {
2221     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2222                                               VarLoc, EndLoc);
2223   }
2224 
2225   /// Build a new OpenMP 'novariants' clause.
2226   ///
2227   /// By default, performs semantic analysis to build the new OpenMP clause.
2228   /// Subclasses may override this routine to provide different behavior.
2229   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2230                                         SourceLocation StartLoc,
2231                                         SourceLocation LParenLoc,
2232                                         SourceLocation EndLoc) {
2233     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2234                                                  EndLoc);
2235   }
2236 
2237   /// Build a new OpenMP 'nocontext' clause.
2238   ///
2239   /// By default, performs semantic analysis to build the new OpenMP clause.
2240   /// Subclasses may override this routine to provide different behavior.
2241   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2242                                        SourceLocation LParenLoc,
2243                                        SourceLocation EndLoc) {
2244     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2245                                                 EndLoc);
2246   }
2247 
2248   /// Build a new OpenMP 'filter' clause.
2249   ///
2250   /// By default, performs semantic analysis to build the new OpenMP clause.
2251   /// Subclasses may override this routine to provide different behavior.
2252   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2253                                     SourceLocation LParenLoc,
2254                                     SourceLocation EndLoc) {
2255     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2256                                              EndLoc);
2257   }
2258 
2259   /// Build a new OpenMP 'bind' clause.
2260   ///
2261   /// By default, performs semantic analysis to build the new OpenMP clause.
2262   /// Subclasses may override this routine to provide different behavior.
2263   OMPClause *RebuildOMPBindClause(OpenMPBindClauseKind Kind,
2264                                   SourceLocation KindLoc,
2265                                   SourceLocation StartLoc,
2266                                   SourceLocation LParenLoc,
2267                                   SourceLocation EndLoc) {
2268     return getSema().ActOnOpenMPBindClause(Kind, KindLoc, StartLoc, LParenLoc,
2269                                            EndLoc);
2270   }
2271 
2272   /// Rebuild the operand to an Objective-C \@synchronized statement.
2273   ///
2274   /// By default, performs semantic analysis to build the new statement.
2275   /// Subclasses may override this routine to provide different behavior.
2276   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2277                                               Expr *object) {
2278     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2279   }
2280 
2281   /// Build a new Objective-C \@synchronized statement.
2282   ///
2283   /// By default, performs semantic analysis to build the new statement.
2284   /// Subclasses may override this routine to provide different behavior.
2285   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2286                                            Expr *Object, Stmt *Body) {
2287     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2288   }
2289 
2290   /// Build a new Objective-C \@autoreleasepool statement.
2291   ///
2292   /// By default, performs semantic analysis to build the new statement.
2293   /// Subclasses may override this routine to provide different behavior.
2294   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2295                                             Stmt *Body) {
2296     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2297   }
2298 
2299   /// Build a new Objective-C fast enumeration statement.
2300   ///
2301   /// By default, performs semantic analysis to build the new statement.
2302   /// Subclasses may override this routine to provide different behavior.
2303   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2304                                           Stmt *Element,
2305                                           Expr *Collection,
2306                                           SourceLocation RParenLoc,
2307                                           Stmt *Body) {
2308     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2309                                                 Element,
2310                                                 Collection,
2311                                                 RParenLoc);
2312     if (ForEachStmt.isInvalid())
2313       return StmtError();
2314 
2315     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2316   }
2317 
2318   /// Build a new C++ exception declaration.
2319   ///
2320   /// By default, performs semantic analysis to build the new decaration.
2321   /// Subclasses may override this routine to provide different behavior.
2322   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2323                                 TypeSourceInfo *Declarator,
2324                                 SourceLocation StartLoc,
2325                                 SourceLocation IdLoc,
2326                                 IdentifierInfo *Id) {
2327     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2328                                                        StartLoc, IdLoc, Id);
2329     if (Var)
2330       getSema().CurContext->addDecl(Var);
2331     return Var;
2332   }
2333 
2334   /// Build a new C++ catch statement.
2335   ///
2336   /// By default, performs semantic analysis to build the new statement.
2337   /// Subclasses may override this routine to provide different behavior.
2338   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2339                                  VarDecl *ExceptionDecl,
2340                                  Stmt *Handler) {
2341     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2342                                                       Handler));
2343   }
2344 
2345   /// Build a new C++ try statement.
2346   ///
2347   /// By default, performs semantic analysis to build the new statement.
2348   /// Subclasses may override this routine to provide different behavior.
2349   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2350                                ArrayRef<Stmt *> Handlers) {
2351     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2352   }
2353 
2354   /// Build a new C++0x range-based for statement.
2355   ///
2356   /// By default, performs semantic analysis to build the new statement.
2357   /// Subclasses may override this routine to provide different behavior.
2358   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2359                                     SourceLocation CoawaitLoc, Stmt *Init,
2360                                     SourceLocation ColonLoc, Stmt *Range,
2361                                     Stmt *Begin, Stmt *End, Expr *Cond,
2362                                     Expr *Inc, Stmt *LoopVar,
2363                                     SourceLocation RParenLoc) {
2364     // If we've just learned that the range is actually an Objective-C
2365     // collection, treat this as an Objective-C fast enumeration loop.
2366     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2367       if (RangeStmt->isSingleDecl()) {
2368         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2369           if (RangeVar->isInvalidDecl())
2370             return StmtError();
2371 
2372           Expr *RangeExpr = RangeVar->getInit();
2373           if (!RangeExpr->isTypeDependent() &&
2374               RangeExpr->getType()->isObjCObjectPointerType()) {
2375             // FIXME: Support init-statements in Objective-C++20 ranged for
2376             // statement.
2377             if (Init) {
2378               return SemaRef.Diag(Init->getBeginLoc(),
2379                                   diag::err_objc_for_range_init_stmt)
2380                          << Init->getSourceRange();
2381             }
2382             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2383                                                         RangeExpr, RParenLoc);
2384           }
2385         }
2386       }
2387     }
2388 
2389     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2390                                           Range, Begin, End, Cond, Inc, LoopVar,
2391                                           RParenLoc, Sema::BFRK_Rebuild);
2392   }
2393 
2394   /// Build a new C++0x range-based for statement.
2395   ///
2396   /// By default, performs semantic analysis to build the new statement.
2397   /// Subclasses may override this routine to provide different behavior.
2398   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2399                                           bool IsIfExists,
2400                                           NestedNameSpecifierLoc QualifierLoc,
2401                                           DeclarationNameInfo NameInfo,
2402                                           Stmt *Nested) {
2403     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2404                                                 QualifierLoc, NameInfo, Nested);
2405   }
2406 
2407   /// Attach body to a C++0x range-based for statement.
2408   ///
2409   /// By default, performs semantic analysis to finish the new statement.
2410   /// Subclasses may override this routine to provide different behavior.
2411   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2412     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2413   }
2414 
2415   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2416                                Stmt *TryBlock, Stmt *Handler) {
2417     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2418   }
2419 
2420   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2421                                   Stmt *Block) {
2422     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2423   }
2424 
2425   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2426     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2427   }
2428 
2429   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2430                                              SourceLocation LParen,
2431                                              SourceLocation RParen,
2432                                              TypeSourceInfo *TSI) {
2433     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2434   }
2435 
2436   /// Build a new predefined expression.
2437   ///
2438   /// By default, performs semantic analysis to build the new expression.
2439   /// Subclasses may override this routine to provide different behavior.
2440   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2441                                    PredefinedExpr::IdentKind IK) {
2442     return getSema().BuildPredefinedExpr(Loc, IK);
2443   }
2444 
2445   /// Build a new expression that references a declaration.
2446   ///
2447   /// By default, performs semantic analysis to build the new expression.
2448   /// Subclasses may override this routine to provide different behavior.
2449   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2450                                         LookupResult &R,
2451                                         bool RequiresADL) {
2452     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2453   }
2454 
2455 
2456   /// Build a new expression that references a declaration.
2457   ///
2458   /// By default, performs semantic analysis to build the new expression.
2459   /// Subclasses may override this routine to provide different behavior.
2460   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2461                                 ValueDecl *VD,
2462                                 const DeclarationNameInfo &NameInfo,
2463                                 NamedDecl *Found,
2464                                 TemplateArgumentListInfo *TemplateArgs) {
2465     CXXScopeSpec SS;
2466     SS.Adopt(QualifierLoc);
2467     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2468                                               TemplateArgs);
2469   }
2470 
2471   /// Build a new expression in parentheses.
2472   ///
2473   /// By default, performs semantic analysis to build the new expression.
2474   /// Subclasses may override this routine to provide different behavior.
2475   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2476                                     SourceLocation RParen) {
2477     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2478   }
2479 
2480   /// Build a new pseudo-destructor expression.
2481   ///
2482   /// By default, performs semantic analysis to build the new expression.
2483   /// Subclasses may override this routine to provide different behavior.
2484   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2485                                             SourceLocation OperatorLoc,
2486                                             bool isArrow,
2487                                             CXXScopeSpec &SS,
2488                                             TypeSourceInfo *ScopeType,
2489                                             SourceLocation CCLoc,
2490                                             SourceLocation TildeLoc,
2491                                         PseudoDestructorTypeStorage Destroyed);
2492 
2493   /// Build a new unary operator expression.
2494   ///
2495   /// By default, performs semantic analysis to build the new expression.
2496   /// Subclasses may override this routine to provide different behavior.
2497   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2498                                         UnaryOperatorKind Opc,
2499                                         Expr *SubExpr) {
2500     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2501   }
2502 
2503   /// Build a new builtin offsetof expression.
2504   ///
2505   /// By default, performs semantic analysis to build the new expression.
2506   /// Subclasses may override this routine to provide different behavior.
2507   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2508                                  TypeSourceInfo *Type,
2509                                  ArrayRef<Sema::OffsetOfComponent> Components,
2510                                  SourceLocation RParenLoc) {
2511     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2512                                           RParenLoc);
2513   }
2514 
2515   /// Build a new sizeof, alignof or vec_step expression with a
2516   /// type argument.
2517   ///
2518   /// By default, performs semantic analysis to build the new expression.
2519   /// Subclasses may override this routine to provide different behavior.
2520   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2521                                          SourceLocation OpLoc,
2522                                          UnaryExprOrTypeTrait ExprKind,
2523                                          SourceRange R) {
2524     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2525   }
2526 
2527   /// Build a new sizeof, alignof or vec step expression with an
2528   /// expression argument.
2529   ///
2530   /// By default, performs semantic analysis to build the new expression.
2531   /// Subclasses may override this routine to provide different behavior.
2532   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2533                                          UnaryExprOrTypeTrait ExprKind,
2534                                          SourceRange R) {
2535     ExprResult Result
2536       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2537     if (Result.isInvalid())
2538       return ExprError();
2539 
2540     return Result;
2541   }
2542 
2543   /// Build a new array subscript expression.
2544   ///
2545   /// By default, performs semantic analysis to build the new expression.
2546   /// Subclasses may override this routine to provide different behavior.
2547   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2548                                              SourceLocation LBracketLoc,
2549                                              Expr *RHS,
2550                                              SourceLocation RBracketLoc) {
2551     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2552                                              LBracketLoc, RHS,
2553                                              RBracketLoc);
2554   }
2555 
2556   /// Build a new matrix subscript expression.
2557   ///
2558   /// By default, performs semantic analysis to build the new expression.
2559   /// Subclasses may override this routine to provide different behavior.
2560   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2561                                         Expr *ColumnIdx,
2562                                         SourceLocation RBracketLoc) {
2563     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2564                                                       RBracketLoc);
2565   }
2566 
2567   /// Build a new array section expression.
2568   ///
2569   /// By default, performs semantic analysis to build the new expression.
2570   /// Subclasses may override this routine to provide different behavior.
2571   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2572                                         Expr *LowerBound,
2573                                         SourceLocation ColonLocFirst,
2574                                         SourceLocation ColonLocSecond,
2575                                         Expr *Length, Expr *Stride,
2576                                         SourceLocation RBracketLoc) {
2577     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2578                                               ColonLocFirst, ColonLocSecond,
2579                                               Length, Stride, RBracketLoc);
2580   }
2581 
2582   /// Build a new array shaping 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 RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2587                                         SourceLocation RParenLoc,
2588                                         ArrayRef<Expr *> Dims,
2589                                         ArrayRef<SourceRange> BracketsRanges) {
2590     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2591                                               BracketsRanges);
2592   }
2593 
2594   /// Build a new iterator expression.
2595   ///
2596   /// By default, performs semantic analysis to build the new expression.
2597   /// Subclasses may override this routine to provide different behavior.
2598   ExprResult RebuildOMPIteratorExpr(
2599       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2600       ArrayRef<Sema::OMPIteratorData> Data) {
2601     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2602                                           LLoc, RLoc, Data);
2603   }
2604 
2605   /// Build a new call expression.
2606   ///
2607   /// By default, performs semantic analysis to build the new expression.
2608   /// Subclasses may override this routine to provide different behavior.
2609   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2610                                    MultiExprArg Args,
2611                                    SourceLocation RParenLoc,
2612                                    Expr *ExecConfig = nullptr) {
2613     return getSema().ActOnCallExpr(
2614         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2615   }
2616 
2617   /// Build a new member access expression.
2618   ///
2619   /// By default, performs semantic analysis to build the new expression.
2620   /// Subclasses may override this routine to provide different behavior.
2621   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2622                                bool isArrow,
2623                                NestedNameSpecifierLoc QualifierLoc,
2624                                SourceLocation TemplateKWLoc,
2625                                const DeclarationNameInfo &MemberNameInfo,
2626                                ValueDecl *Member,
2627                                NamedDecl *FoundDecl,
2628                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2629                                NamedDecl *FirstQualifierInScope) {
2630     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2631                                                                       isArrow);
2632     if (!Member->getDeclName()) {
2633       // We have a reference to an unnamed field.  This is always the
2634       // base of an anonymous struct/union member access, i.e. the
2635       // field is always of record type.
2636       assert(Member->getType()->isRecordType() &&
2637              "unnamed member not of record type?");
2638 
2639       BaseResult =
2640         getSema().PerformObjectMemberConversion(BaseResult.get(),
2641                                                 QualifierLoc.getNestedNameSpecifier(),
2642                                                 FoundDecl, Member);
2643       if (BaseResult.isInvalid())
2644         return ExprError();
2645       Base = BaseResult.get();
2646 
2647       CXXScopeSpec EmptySS;
2648       return getSema().BuildFieldReferenceExpr(
2649           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2650           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2651     }
2652 
2653     CXXScopeSpec SS;
2654     SS.Adopt(QualifierLoc);
2655 
2656     Base = BaseResult.get();
2657     QualType BaseType = Base->getType();
2658 
2659     if (isArrow && !BaseType->isPointerType())
2660       return ExprError();
2661 
2662     // FIXME: this involves duplicating earlier analysis in a lot of
2663     // cases; we should avoid this when possible.
2664     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2665     R.addDecl(FoundDecl);
2666     R.resolveKind();
2667 
2668     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2669                                               SS, TemplateKWLoc,
2670                                               FirstQualifierInScope,
2671                                               R, ExplicitTemplateArgs,
2672                                               /*S*/nullptr);
2673   }
2674 
2675   /// Build a new binary operator expression.
2676   ///
2677   /// By default, performs semantic analysis to build the new expression.
2678   /// Subclasses may override this routine to provide different behavior.
2679   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2680                                          BinaryOperatorKind Opc,
2681                                          Expr *LHS, Expr *RHS) {
2682     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2683   }
2684 
2685   /// Build a new rewritten operator expression.
2686   ///
2687   /// By default, performs semantic analysis to build the new expression.
2688   /// Subclasses may override this routine to provide different behavior.
2689   ExprResult RebuildCXXRewrittenBinaryOperator(
2690       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2691       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2692     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2693                                            RHS, /*RequiresADL*/false);
2694   }
2695 
2696   /// Build a new conditional operator expression.
2697   ///
2698   /// By default, performs semantic analysis to build the new expression.
2699   /// Subclasses may override this routine to provide different behavior.
2700   ExprResult RebuildConditionalOperator(Expr *Cond,
2701                                         SourceLocation QuestionLoc,
2702                                         Expr *LHS,
2703                                         SourceLocation ColonLoc,
2704                                         Expr *RHS) {
2705     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2706                                         LHS, RHS);
2707   }
2708 
2709   /// Build a new C-style cast expression.
2710   ///
2711   /// By default, performs semantic analysis to build the new expression.
2712   /// Subclasses may override this routine to provide different behavior.
2713   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2714                                          TypeSourceInfo *TInfo,
2715                                          SourceLocation RParenLoc,
2716                                          Expr *SubExpr) {
2717     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2718                                          SubExpr);
2719   }
2720 
2721   /// Build a new compound literal expression.
2722   ///
2723   /// By default, performs semantic analysis to build the new expression.
2724   /// Subclasses may override this routine to provide different behavior.
2725   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2726                                               TypeSourceInfo *TInfo,
2727                                               SourceLocation RParenLoc,
2728                                               Expr *Init) {
2729     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2730                                               Init);
2731   }
2732 
2733   /// Build a new extended vector element access expression.
2734   ///
2735   /// By default, performs semantic analysis to build the new expression.
2736   /// Subclasses may override this routine to provide different behavior.
2737   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2738                                                SourceLocation OpLoc,
2739                                                SourceLocation AccessorLoc,
2740                                                IdentifierInfo &Accessor) {
2741 
2742     CXXScopeSpec SS;
2743     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2744     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2745                                               OpLoc, /*IsArrow*/ false,
2746                                               SS, SourceLocation(),
2747                                               /*FirstQualifierInScope*/ nullptr,
2748                                               NameInfo,
2749                                               /* TemplateArgs */ nullptr,
2750                                               /*S*/ nullptr);
2751   }
2752 
2753   /// Build a new initializer list expression.
2754   ///
2755   /// By default, performs semantic analysis to build the new expression.
2756   /// Subclasses may override this routine to provide different behavior.
2757   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2758                              MultiExprArg Inits,
2759                              SourceLocation RBraceLoc) {
2760     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2761   }
2762 
2763   /// Build a new designated initializer expression.
2764   ///
2765   /// By default, performs semantic analysis to build the new expression.
2766   /// Subclasses may override this routine to provide different behavior.
2767   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2768                                              MultiExprArg ArrayExprs,
2769                                              SourceLocation EqualOrColonLoc,
2770                                              bool GNUSyntax,
2771                                              Expr *Init) {
2772     ExprResult Result
2773       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2774                                            Init);
2775     if (Result.isInvalid())
2776       return ExprError();
2777 
2778     return Result;
2779   }
2780 
2781   /// Build a new value-initialized expression.
2782   ///
2783   /// By default, builds the implicit value initialization without performing
2784   /// any semantic analysis. Subclasses may override this routine to provide
2785   /// different behavior.
2786   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2787     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2788   }
2789 
2790   /// Build a new \c va_arg expression.
2791   ///
2792   /// By default, performs semantic analysis to build the new expression.
2793   /// Subclasses may override this routine to provide different behavior.
2794   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2795                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2796                                     SourceLocation RParenLoc) {
2797     return getSema().BuildVAArgExpr(BuiltinLoc,
2798                                     SubExpr, TInfo,
2799                                     RParenLoc);
2800   }
2801 
2802   /// Build a new expression list in parentheses.
2803   ///
2804   /// By default, performs semantic analysis to build the new expression.
2805   /// Subclasses may override this routine to provide different behavior.
2806   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2807                                   MultiExprArg SubExprs,
2808                                   SourceLocation RParenLoc) {
2809     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2810   }
2811 
2812   /// Build a new address-of-label expression.
2813   ///
2814   /// By default, performs semantic analysis, using the name of the label
2815   /// rather than attempting to map the label statement itself.
2816   /// Subclasses may override this routine to provide different behavior.
2817   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2818                                   SourceLocation LabelLoc, LabelDecl *Label) {
2819     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2820   }
2821 
2822   /// Build a new GNU statement expression.
2823   ///
2824   /// By default, performs semantic analysis to build the new expression.
2825   /// Subclasses may override this routine to provide different behavior.
2826   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2827                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2828     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2829                                    TemplateDepth);
2830   }
2831 
2832   /// Build a new __builtin_choose_expr expression.
2833   ///
2834   /// By default, performs semantic analysis to build the new expression.
2835   /// Subclasses may override this routine to provide different behavior.
2836   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2837                                      Expr *Cond, Expr *LHS, Expr *RHS,
2838                                      SourceLocation RParenLoc) {
2839     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2840                                    Cond, LHS, RHS,
2841                                    RParenLoc);
2842   }
2843 
2844   /// Build a new generic selection expression.
2845   ///
2846   /// By default, performs semantic analysis to build the new expression.
2847   /// Subclasses may override this routine to provide different behavior.
2848   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2849                                          SourceLocation DefaultLoc,
2850                                          SourceLocation RParenLoc,
2851                                          Expr *ControllingExpr,
2852                                          ArrayRef<TypeSourceInfo *> Types,
2853                                          ArrayRef<Expr *> Exprs) {
2854     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2855                                                 ControllingExpr, Types, Exprs);
2856   }
2857 
2858   /// Build a new overloaded operator call expression.
2859   ///
2860   /// By default, performs semantic analysis to build the new expression.
2861   /// The semantic analysis provides the behavior of template instantiation,
2862   /// copying with transformations that turn what looks like an overloaded
2863   /// operator call into a use of a builtin operator, performing
2864   /// argument-dependent lookup, etc. Subclasses may override this routine to
2865   /// provide different behavior.
2866   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2867                                               SourceLocation OpLoc,
2868                                               Expr *Callee,
2869                                               Expr *First,
2870                                               Expr *Second);
2871 
2872   /// Build a new C++ "named" cast expression, such as static_cast or
2873   /// reinterpret_cast.
2874   ///
2875   /// By default, this routine dispatches to one of the more-specific routines
2876   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2877   /// Subclasses may override this routine to provide different behavior.
2878   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2879                                            Stmt::StmtClass Class,
2880                                            SourceLocation LAngleLoc,
2881                                            TypeSourceInfo *TInfo,
2882                                            SourceLocation RAngleLoc,
2883                                            SourceLocation LParenLoc,
2884                                            Expr *SubExpr,
2885                                            SourceLocation RParenLoc) {
2886     switch (Class) {
2887     case Stmt::CXXStaticCastExprClass:
2888       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2889                                                    RAngleLoc, LParenLoc,
2890                                                    SubExpr, RParenLoc);
2891 
2892     case Stmt::CXXDynamicCastExprClass:
2893       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2894                                                     RAngleLoc, LParenLoc,
2895                                                     SubExpr, RParenLoc);
2896 
2897     case Stmt::CXXReinterpretCastExprClass:
2898       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2899                                                         RAngleLoc, LParenLoc,
2900                                                         SubExpr,
2901                                                         RParenLoc);
2902 
2903     case Stmt::CXXConstCastExprClass:
2904       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2905                                                    RAngleLoc, LParenLoc,
2906                                                    SubExpr, RParenLoc);
2907 
2908     case Stmt::CXXAddrspaceCastExprClass:
2909       return getDerived().RebuildCXXAddrspaceCastExpr(
2910           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2911 
2912     default:
2913       llvm_unreachable("Invalid C++ named cast");
2914     }
2915   }
2916 
2917   /// Build a new C++ static_cast expression.
2918   ///
2919   /// By default, performs semantic analysis to build the new expression.
2920   /// Subclasses may override this routine to provide different behavior.
2921   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2922                                             SourceLocation LAngleLoc,
2923                                             TypeSourceInfo *TInfo,
2924                                             SourceLocation RAngleLoc,
2925                                             SourceLocation LParenLoc,
2926                                             Expr *SubExpr,
2927                                             SourceLocation RParenLoc) {
2928     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2929                                        TInfo, SubExpr,
2930                                        SourceRange(LAngleLoc, RAngleLoc),
2931                                        SourceRange(LParenLoc, RParenLoc));
2932   }
2933 
2934   /// Build a new C++ dynamic_cast expression.
2935   ///
2936   /// By default, performs semantic analysis to build the new expression.
2937   /// Subclasses may override this routine to provide different behavior.
2938   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2939                                              SourceLocation LAngleLoc,
2940                                              TypeSourceInfo *TInfo,
2941                                              SourceLocation RAngleLoc,
2942                                              SourceLocation LParenLoc,
2943                                              Expr *SubExpr,
2944                                              SourceLocation RParenLoc) {
2945     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2946                                        TInfo, SubExpr,
2947                                        SourceRange(LAngleLoc, RAngleLoc),
2948                                        SourceRange(LParenLoc, RParenLoc));
2949   }
2950 
2951   /// Build a new C++ reinterpret_cast expression.
2952   ///
2953   /// By default, performs semantic analysis to build the new expression.
2954   /// Subclasses may override this routine to provide different behavior.
2955   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2956                                                  SourceLocation LAngleLoc,
2957                                                  TypeSourceInfo *TInfo,
2958                                                  SourceLocation RAngleLoc,
2959                                                  SourceLocation LParenLoc,
2960                                                  Expr *SubExpr,
2961                                                  SourceLocation RParenLoc) {
2962     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2963                                        TInfo, SubExpr,
2964                                        SourceRange(LAngleLoc, RAngleLoc),
2965                                        SourceRange(LParenLoc, RParenLoc));
2966   }
2967 
2968   /// Build a new C++ const_cast expression.
2969   ///
2970   /// By default, performs semantic analysis to build the new expression.
2971   /// Subclasses may override this routine to provide different behavior.
2972   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2973                                            SourceLocation LAngleLoc,
2974                                            TypeSourceInfo *TInfo,
2975                                            SourceLocation RAngleLoc,
2976                                            SourceLocation LParenLoc,
2977                                            Expr *SubExpr,
2978                                            SourceLocation RParenLoc) {
2979     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2980                                        TInfo, SubExpr,
2981                                        SourceRange(LAngleLoc, RAngleLoc),
2982                                        SourceRange(LParenLoc, RParenLoc));
2983   }
2984 
2985   ExprResult
2986   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2987                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2988                               SourceLocation LParenLoc, Expr *SubExpr,
2989                               SourceLocation RParenLoc) {
2990     return getSema().BuildCXXNamedCast(
2991         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2992         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2993   }
2994 
2995   /// Build a new C++ functional-style cast expression.
2996   ///
2997   /// By default, performs semantic analysis to build the new expression.
2998   /// Subclasses may override this routine to provide different behavior.
2999   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
3000                                           SourceLocation LParenLoc,
3001                                           Expr *Sub,
3002                                           SourceLocation RParenLoc,
3003                                           bool ListInitialization) {
3004     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
3005                                                MultiExprArg(&Sub, 1), RParenLoc,
3006                                                ListInitialization);
3007   }
3008 
3009   /// Build a new C++ __builtin_bit_cast expression.
3010   ///
3011   /// By default, performs semantic analysis to build the new expression.
3012   /// Subclasses may override this routine to provide different behavior.
3013   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
3014                                        TypeSourceInfo *TSI, Expr *Sub,
3015                                        SourceLocation RParenLoc) {
3016     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
3017   }
3018 
3019   /// Build a new C++ typeid(type) expression.
3020   ///
3021   /// By default, performs semantic analysis to build the new expression.
3022   /// Subclasses may override this routine to provide different behavior.
3023   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3024                                         SourceLocation TypeidLoc,
3025                                         TypeSourceInfo *Operand,
3026                                         SourceLocation RParenLoc) {
3027     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3028                                     RParenLoc);
3029   }
3030 
3031 
3032   /// Build a new C++ typeid(expr) expression.
3033   ///
3034   /// By default, performs semantic analysis to build the new expression.
3035   /// Subclasses may override this routine to provide different behavior.
3036   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3037                                         SourceLocation TypeidLoc,
3038                                         Expr *Operand,
3039                                         SourceLocation RParenLoc) {
3040     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3041                                     RParenLoc);
3042   }
3043 
3044   /// Build a new C++ __uuidof(type) expression.
3045   ///
3046   /// By default, performs semantic analysis to build the new expression.
3047   /// Subclasses may override this routine to provide different behavior.
3048   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3049                                   TypeSourceInfo *Operand,
3050                                   SourceLocation RParenLoc) {
3051     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3052   }
3053 
3054   /// Build a new C++ __uuidof(expr) expression.
3055   ///
3056   /// By default, performs semantic analysis to build the new expression.
3057   /// Subclasses may override this routine to provide different behavior.
3058   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3059                                   Expr *Operand, SourceLocation RParenLoc) {
3060     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3061   }
3062 
3063   /// Build a new C++ "this" expression.
3064   ///
3065   /// By default, builds a new "this" expression without performing any
3066   /// semantic analysis. Subclasses may override this routine to provide
3067   /// different behavior.
3068   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3069                                 QualType ThisType,
3070                                 bool isImplicit) {
3071     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3072   }
3073 
3074   /// Build a new C++ throw expression.
3075   ///
3076   /// By default, performs semantic analysis to build the new expression.
3077   /// Subclasses may override this routine to provide different behavior.
3078   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3079                                  bool IsThrownVariableInScope) {
3080     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3081   }
3082 
3083   /// Build a new C++ default-argument expression.
3084   ///
3085   /// By default, builds a new default-argument expression, which does not
3086   /// require any semantic analysis. Subclasses may override this routine to
3087   /// provide different behavior.
3088   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3089     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3090                                      getSema().CurContext);
3091   }
3092 
3093   /// Build a new C++11 default-initialization expression.
3094   ///
3095   /// By default, builds a new default field initialization expression, which
3096   /// does not require any semantic analysis. Subclasses may override this
3097   /// routine to provide different behavior.
3098   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3099                                        FieldDecl *Field) {
3100     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3101                                       getSema().CurContext);
3102   }
3103 
3104   /// Build a new C++ zero-initialization expression.
3105   ///
3106   /// By default, performs semantic analysis to build the new expression.
3107   /// Subclasses may override this routine to provide different behavior.
3108   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3109                                            SourceLocation LParenLoc,
3110                                            SourceLocation RParenLoc) {
3111     return getSema().BuildCXXTypeConstructExpr(
3112         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3113   }
3114 
3115   /// Build a new C++ "new" expression.
3116   ///
3117   /// By default, performs semantic analysis to build the new expression.
3118   /// Subclasses may override this routine to provide different behavior.
3119   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3120                                bool UseGlobal,
3121                                SourceLocation PlacementLParen,
3122                                MultiExprArg PlacementArgs,
3123                                SourceLocation PlacementRParen,
3124                                SourceRange TypeIdParens,
3125                                QualType AllocatedType,
3126                                TypeSourceInfo *AllocatedTypeInfo,
3127                                Optional<Expr *> ArraySize,
3128                                SourceRange DirectInitRange,
3129                                Expr *Initializer) {
3130     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3131                                  PlacementLParen,
3132                                  PlacementArgs,
3133                                  PlacementRParen,
3134                                  TypeIdParens,
3135                                  AllocatedType,
3136                                  AllocatedTypeInfo,
3137                                  ArraySize,
3138                                  DirectInitRange,
3139                                  Initializer);
3140   }
3141 
3142   /// Build a new C++ "delete" expression.
3143   ///
3144   /// By default, performs semantic analysis to build the new expression.
3145   /// Subclasses may override this routine to provide different behavior.
3146   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3147                                         bool IsGlobalDelete,
3148                                         bool IsArrayForm,
3149                                         Expr *Operand) {
3150     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3151                                     Operand);
3152   }
3153 
3154   /// Build a new type trait expression.
3155   ///
3156   /// By default, performs semantic analysis to build the new expression.
3157   /// Subclasses may override this routine to provide different behavior.
3158   ExprResult RebuildTypeTrait(TypeTrait Trait,
3159                               SourceLocation StartLoc,
3160                               ArrayRef<TypeSourceInfo *> Args,
3161                               SourceLocation RParenLoc) {
3162     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3163   }
3164 
3165   /// Build a new array type trait expression.
3166   ///
3167   /// By default, performs semantic analysis to build the new expression.
3168   /// Subclasses may override this routine to provide different behavior.
3169   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3170                                    SourceLocation StartLoc,
3171                                    TypeSourceInfo *TSInfo,
3172                                    Expr *DimExpr,
3173                                    SourceLocation RParenLoc) {
3174     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3175   }
3176 
3177   /// Build a new expression trait expression.
3178   ///
3179   /// By default, performs semantic analysis to build the new expression.
3180   /// Subclasses may override this routine to provide different behavior.
3181   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3182                                    SourceLocation StartLoc,
3183                                    Expr *Queried,
3184                                    SourceLocation RParenLoc) {
3185     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3186   }
3187 
3188   /// Build a new (previously unresolved) declaration reference
3189   /// expression.
3190   ///
3191   /// By default, performs semantic analysis to build the new expression.
3192   /// Subclasses may override this routine to provide different behavior.
3193   ExprResult RebuildDependentScopeDeclRefExpr(
3194                                           NestedNameSpecifierLoc QualifierLoc,
3195                                           SourceLocation TemplateKWLoc,
3196                                        const DeclarationNameInfo &NameInfo,
3197                               const TemplateArgumentListInfo *TemplateArgs,
3198                                           bool IsAddressOfOperand,
3199                                           TypeSourceInfo **RecoveryTSI) {
3200     CXXScopeSpec SS;
3201     SS.Adopt(QualifierLoc);
3202 
3203     if (TemplateArgs || TemplateKWLoc.isValid())
3204       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3205                                                     TemplateArgs);
3206 
3207     return getSema().BuildQualifiedDeclarationNameExpr(
3208         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3209   }
3210 
3211   /// Build a new template-id expression.
3212   ///
3213   /// By default, performs semantic analysis to build the new expression.
3214   /// Subclasses may override this routine to provide different behavior.
3215   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3216                                    SourceLocation TemplateKWLoc,
3217                                    LookupResult &R,
3218                                    bool RequiresADL,
3219                               const TemplateArgumentListInfo *TemplateArgs) {
3220     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3221                                          TemplateArgs);
3222   }
3223 
3224   /// Build a new object-construction expression.
3225   ///
3226   /// By default, performs semantic analysis to build the new expression.
3227   /// Subclasses may override this routine to provide different behavior.
3228   ExprResult RebuildCXXConstructExpr(QualType T,
3229                                      SourceLocation Loc,
3230                                      CXXConstructorDecl *Constructor,
3231                                      bool IsElidable,
3232                                      MultiExprArg Args,
3233                                      bool HadMultipleCandidates,
3234                                      bool ListInitialization,
3235                                      bool StdInitListInitialization,
3236                                      bool RequiresZeroInit,
3237                              CXXConstructExpr::ConstructionKind ConstructKind,
3238                                      SourceRange ParenRange) {
3239     // Reconstruct the constructor we originally found, which might be
3240     // different if this is a call to an inherited constructor.
3241     CXXConstructorDecl *FoundCtor = Constructor;
3242     if (Constructor->isInheritingConstructor())
3243       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3244 
3245     SmallVector<Expr *, 8> ConvertedArgs;
3246     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3247                                           ConvertedArgs))
3248       return ExprError();
3249 
3250     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3251                                            IsElidable,
3252                                            ConvertedArgs,
3253                                            HadMultipleCandidates,
3254                                            ListInitialization,
3255                                            StdInitListInitialization,
3256                                            RequiresZeroInit, ConstructKind,
3257                                            ParenRange);
3258   }
3259 
3260   /// Build a new implicit construction via inherited constructor
3261   /// expression.
3262   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3263                                              CXXConstructorDecl *Constructor,
3264                                              bool ConstructsVBase,
3265                                              bool InheritedFromVBase) {
3266     return new (getSema().Context) CXXInheritedCtorInitExpr(
3267         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3268   }
3269 
3270   /// Build a new object-construction expression.
3271   ///
3272   /// By default, performs semantic analysis to build the new expression.
3273   /// Subclasses may override this routine to provide different behavior.
3274   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3275                                            SourceLocation LParenOrBraceLoc,
3276                                            MultiExprArg Args,
3277                                            SourceLocation RParenOrBraceLoc,
3278                                            bool ListInitialization) {
3279     return getSema().BuildCXXTypeConstructExpr(
3280         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3281   }
3282 
3283   /// Build a new object-construction expression.
3284   ///
3285   /// By default, performs semantic analysis to build the new expression.
3286   /// Subclasses may override this routine to provide different behavior.
3287   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3288                                                SourceLocation LParenLoc,
3289                                                MultiExprArg Args,
3290                                                SourceLocation RParenLoc,
3291                                                bool ListInitialization) {
3292     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3293                                                RParenLoc, ListInitialization);
3294   }
3295 
3296   /// Build a new member reference expression.
3297   ///
3298   /// By default, performs semantic analysis to build the new expression.
3299   /// Subclasses may override this routine to provide different behavior.
3300   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3301                                                 QualType BaseType,
3302                                                 bool IsArrow,
3303                                                 SourceLocation OperatorLoc,
3304                                           NestedNameSpecifierLoc QualifierLoc,
3305                                                 SourceLocation TemplateKWLoc,
3306                                             NamedDecl *FirstQualifierInScope,
3307                                    const DeclarationNameInfo &MemberNameInfo,
3308                               const TemplateArgumentListInfo *TemplateArgs) {
3309     CXXScopeSpec SS;
3310     SS.Adopt(QualifierLoc);
3311 
3312     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3313                                             OperatorLoc, IsArrow,
3314                                             SS, TemplateKWLoc,
3315                                             FirstQualifierInScope,
3316                                             MemberNameInfo,
3317                                             TemplateArgs, /*S*/nullptr);
3318   }
3319 
3320   /// Build a new member reference expression.
3321   ///
3322   /// By default, performs semantic analysis to build the new expression.
3323   /// Subclasses may override this routine to provide different behavior.
3324   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3325                                          SourceLocation OperatorLoc,
3326                                          bool IsArrow,
3327                                          NestedNameSpecifierLoc QualifierLoc,
3328                                          SourceLocation TemplateKWLoc,
3329                                          NamedDecl *FirstQualifierInScope,
3330                                          LookupResult &R,
3331                                 const TemplateArgumentListInfo *TemplateArgs) {
3332     CXXScopeSpec SS;
3333     SS.Adopt(QualifierLoc);
3334 
3335     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3336                                             OperatorLoc, IsArrow,
3337                                             SS, TemplateKWLoc,
3338                                             FirstQualifierInScope,
3339                                             R, TemplateArgs, /*S*/nullptr);
3340   }
3341 
3342   /// Build a new noexcept expression.
3343   ///
3344   /// By default, performs semantic analysis to build the new expression.
3345   /// Subclasses may override this routine to provide different behavior.
3346   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3347     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3348   }
3349 
3350   /// Build a new expression to compute the length of a parameter pack.
3351   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3352                                    NamedDecl *Pack,
3353                                    SourceLocation PackLoc,
3354                                    SourceLocation RParenLoc,
3355                                    Optional<unsigned> Length,
3356                                    ArrayRef<TemplateArgument> PartialArgs) {
3357     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3358                                   RParenLoc, Length, PartialArgs);
3359   }
3360 
3361   /// Build a new expression representing a call to a source location
3362   ///  builtin.
3363   ///
3364   /// By default, performs semantic analysis to build the new expression.
3365   /// Subclasses may override this routine to provide different behavior.
3366   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3367                                   SourceLocation BuiltinLoc,
3368                                   SourceLocation RPLoc,
3369                                   DeclContext *ParentContext) {
3370     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3371   }
3372 
3373   /// Build a new Objective-C boxed expression.
3374   ///
3375   /// By default, performs semantic analysis to build the new expression.
3376   /// Subclasses may override this routine to provide different behavior.
3377   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3378       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3379       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3380       TemplateArgumentListInfo *TALI) {
3381     CXXScopeSpec SS;
3382     SS.Adopt(NNS);
3383     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3384                                                          ConceptNameInfo,
3385                                                          FoundDecl,
3386                                                          NamedConcept, TALI);
3387     if (Result.isInvalid())
3388       return ExprError();
3389     return Result;
3390   }
3391 
3392   /// \brief Build a new requires expression.
3393   ///
3394   /// By default, performs semantic analysis to build the new expression.
3395   /// Subclasses may override this routine to provide different behavior.
3396   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3397                                  RequiresExprBodyDecl *Body,
3398                                  ArrayRef<ParmVarDecl *> LocalParameters,
3399                                  ArrayRef<concepts::Requirement *> Requirements,
3400                                  SourceLocation ClosingBraceLoc) {
3401     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3402                                 LocalParameters, Requirements, ClosingBraceLoc);
3403   }
3404 
3405   concepts::TypeRequirement *
3406   RebuildTypeRequirement(
3407       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3408     return SemaRef.BuildTypeRequirement(SubstDiag);
3409   }
3410 
3411   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3412     return SemaRef.BuildTypeRequirement(T);
3413   }
3414 
3415   concepts::ExprRequirement *
3416   RebuildExprRequirement(
3417       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3418       SourceLocation NoexceptLoc,
3419       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3420     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3421                                         std::move(Ret));
3422   }
3423 
3424   concepts::ExprRequirement *
3425   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3426                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3427     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3428                                         std::move(Ret));
3429   }
3430 
3431   concepts::NestedRequirement *
3432   RebuildNestedRequirement(
3433       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3434     return SemaRef.BuildNestedRequirement(SubstDiag);
3435   }
3436 
3437   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3438     return SemaRef.BuildNestedRequirement(Constraint);
3439   }
3440 
3441   /// \brief Build a new Objective-C boxed expression.
3442   ///
3443   /// By default, performs semantic analysis to build the new expression.
3444   /// Subclasses may override this routine to provide different behavior.
3445   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3446     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3447   }
3448 
3449   /// Build a new Objective-C array literal.
3450   ///
3451   /// By default, performs semantic analysis to build the new expression.
3452   /// Subclasses may override this routine to provide different behavior.
3453   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3454                                      Expr **Elements, unsigned NumElements) {
3455     return getSema().BuildObjCArrayLiteral(Range,
3456                                            MultiExprArg(Elements, NumElements));
3457   }
3458 
3459   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3460                                          Expr *Base, Expr *Key,
3461                                          ObjCMethodDecl *getterMethod,
3462                                          ObjCMethodDecl *setterMethod) {
3463     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3464                                                    getterMethod, setterMethod);
3465   }
3466 
3467   /// Build a new Objective-C dictionary literal.
3468   ///
3469   /// By default, performs semantic analysis to build the new expression.
3470   /// Subclasses may override this routine to provide different behavior.
3471   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3472                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3473     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3474   }
3475 
3476   /// Build a new Objective-C \@encode expression.
3477   ///
3478   /// By default, performs semantic analysis to build the new expression.
3479   /// Subclasses may override this routine to provide different behavior.
3480   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3481                                          TypeSourceInfo *EncodeTypeInfo,
3482                                          SourceLocation RParenLoc) {
3483     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3484   }
3485 
3486   /// Build a new Objective-C class message.
3487   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3488                                           Selector Sel,
3489                                           ArrayRef<SourceLocation> SelectorLocs,
3490                                           ObjCMethodDecl *Method,
3491                                           SourceLocation LBracLoc,
3492                                           MultiExprArg Args,
3493                                           SourceLocation RBracLoc) {
3494     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3495                                      ReceiverTypeInfo->getType(),
3496                                      /*SuperLoc=*/SourceLocation(),
3497                                      Sel, Method, LBracLoc, SelectorLocs,
3498                                      RBracLoc, Args);
3499   }
3500 
3501   /// Build a new Objective-C instance message.
3502   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3503                                           Selector Sel,
3504                                           ArrayRef<SourceLocation> SelectorLocs,
3505                                           ObjCMethodDecl *Method,
3506                                           SourceLocation LBracLoc,
3507                                           MultiExprArg Args,
3508                                           SourceLocation RBracLoc) {
3509     return SemaRef.BuildInstanceMessage(Receiver,
3510                                         Receiver->getType(),
3511                                         /*SuperLoc=*/SourceLocation(),
3512                                         Sel, Method, LBracLoc, SelectorLocs,
3513                                         RBracLoc, Args);
3514   }
3515 
3516   /// Build a new Objective-C instance/class message to 'super'.
3517   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3518                                     Selector Sel,
3519                                     ArrayRef<SourceLocation> SelectorLocs,
3520                                     QualType SuperType,
3521                                     ObjCMethodDecl *Method,
3522                                     SourceLocation LBracLoc,
3523                                     MultiExprArg Args,
3524                                     SourceLocation RBracLoc) {
3525     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3526                                           SuperType,
3527                                           SuperLoc,
3528                                           Sel, Method, LBracLoc, SelectorLocs,
3529                                           RBracLoc, Args)
3530                                       : SemaRef.BuildClassMessage(nullptr,
3531                                           SuperType,
3532                                           SuperLoc,
3533                                           Sel, Method, LBracLoc, SelectorLocs,
3534                                           RBracLoc, Args);
3535 
3536 
3537   }
3538 
3539   /// Build a new Objective-C ivar reference expression.
3540   ///
3541   /// By default, performs semantic analysis to build the new expression.
3542   /// Subclasses may override this routine to provide different behavior.
3543   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3544                                           SourceLocation IvarLoc,
3545                                           bool IsArrow, bool IsFreeIvar) {
3546     CXXScopeSpec SS;
3547     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3548     ExprResult Result = getSema().BuildMemberReferenceExpr(
3549         BaseArg, BaseArg->getType(),
3550         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3551         /*FirstQualifierInScope=*/nullptr, NameInfo,
3552         /*TemplateArgs=*/nullptr,
3553         /*S=*/nullptr);
3554     if (IsFreeIvar && Result.isUsable())
3555       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3556     return Result;
3557   }
3558 
3559   /// Build a new Objective-C property reference expression.
3560   ///
3561   /// By default, performs semantic analysis to build the new expression.
3562   /// Subclasses may override this routine to provide different behavior.
3563   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3564                                         ObjCPropertyDecl *Property,
3565                                         SourceLocation PropertyLoc) {
3566     CXXScopeSpec SS;
3567     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3568     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3569                                               /*FIXME:*/PropertyLoc,
3570                                               /*IsArrow=*/false,
3571                                               SS, SourceLocation(),
3572                                               /*FirstQualifierInScope=*/nullptr,
3573                                               NameInfo,
3574                                               /*TemplateArgs=*/nullptr,
3575                                               /*S=*/nullptr);
3576   }
3577 
3578   /// Build a new Objective-C property reference expression.
3579   ///
3580   /// By default, performs semantic analysis to build the new expression.
3581   /// Subclasses may override this routine to provide different behavior.
3582   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3583                                         ObjCMethodDecl *Getter,
3584                                         ObjCMethodDecl *Setter,
3585                                         SourceLocation PropertyLoc) {
3586     // Since these expressions can only be value-dependent, we do not
3587     // need to perform semantic analysis again.
3588     return Owned(
3589       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3590                                                   VK_LValue, OK_ObjCProperty,
3591                                                   PropertyLoc, Base));
3592   }
3593 
3594   /// Build a new Objective-C "isa" expression.
3595   ///
3596   /// By default, performs semantic analysis to build the new expression.
3597   /// Subclasses may override this routine to provide different behavior.
3598   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3599                                 SourceLocation OpLoc, bool IsArrow) {
3600     CXXScopeSpec SS;
3601     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3602     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3603                                               OpLoc, IsArrow,
3604                                               SS, SourceLocation(),
3605                                               /*FirstQualifierInScope=*/nullptr,
3606                                               NameInfo,
3607                                               /*TemplateArgs=*/nullptr,
3608                                               /*S=*/nullptr);
3609   }
3610 
3611   /// Build a new shuffle vector expression.
3612   ///
3613   /// By default, performs semantic analysis to build the new expression.
3614   /// Subclasses may override this routine to provide different behavior.
3615   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3616                                       MultiExprArg SubExprs,
3617                                       SourceLocation RParenLoc) {
3618     // Find the declaration for __builtin_shufflevector
3619     const IdentifierInfo &Name
3620       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3621     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3622     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3623     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3624 
3625     // Build a reference to the __builtin_shufflevector builtin
3626     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3627     Expr *Callee = new (SemaRef.Context)
3628         DeclRefExpr(SemaRef.Context, Builtin, false,
3629                     SemaRef.Context.BuiltinFnTy, VK_PRValue, BuiltinLoc);
3630     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3631     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3632                                        CK_BuiltinFnToFnPtr).get();
3633 
3634     // Build the CallExpr
3635     ExprResult TheCall = CallExpr::Create(
3636         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3637         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3638         FPOptionsOverride());
3639 
3640     // Type-check the __builtin_shufflevector expression.
3641     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3642   }
3643 
3644   /// Build a new convert vector expression.
3645   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3646                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3647                                       SourceLocation RParenLoc) {
3648     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3649                                          BuiltinLoc, RParenLoc);
3650   }
3651 
3652   /// Build a new template argument pack expansion.
3653   ///
3654   /// By default, performs semantic analysis to build a new pack expansion
3655   /// for a template argument. Subclasses may override this routine to provide
3656   /// different behavior.
3657   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3658                                            SourceLocation EllipsisLoc,
3659                                            Optional<unsigned> NumExpansions) {
3660     switch (Pattern.getArgument().getKind()) {
3661     case TemplateArgument::Expression: {
3662       ExprResult Result
3663         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3664                                        EllipsisLoc, NumExpansions);
3665       if (Result.isInvalid())
3666         return TemplateArgumentLoc();
3667 
3668       return TemplateArgumentLoc(Result.get(), Result.get());
3669     }
3670 
3671     case TemplateArgument::Template:
3672       return TemplateArgumentLoc(
3673           SemaRef.Context,
3674           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3675                            NumExpansions),
3676           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3677           EllipsisLoc);
3678 
3679     case TemplateArgument::Null:
3680     case TemplateArgument::Integral:
3681     case TemplateArgument::Declaration:
3682     case TemplateArgument::Pack:
3683     case TemplateArgument::TemplateExpansion:
3684     case TemplateArgument::NullPtr:
3685       llvm_unreachable("Pack expansion pattern has no parameter packs");
3686 
3687     case TemplateArgument::Type:
3688       if (TypeSourceInfo *Expansion
3689             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3690                                            EllipsisLoc,
3691                                            NumExpansions))
3692         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3693                                    Expansion);
3694       break;
3695     }
3696 
3697     return TemplateArgumentLoc();
3698   }
3699 
3700   /// Build a new expression pack expansion.
3701   ///
3702   /// By default, performs semantic analysis to build a new pack expansion
3703   /// for an expression. Subclasses may override this routine to provide
3704   /// different behavior.
3705   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3706                                   Optional<unsigned> NumExpansions) {
3707     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3708   }
3709 
3710   /// Build a new C++1z fold-expression.
3711   ///
3712   /// By default, performs semantic analysis in order to build a new fold
3713   /// expression.
3714   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3715                                 SourceLocation LParenLoc, Expr *LHS,
3716                                 BinaryOperatorKind Operator,
3717                                 SourceLocation EllipsisLoc, Expr *RHS,
3718                                 SourceLocation RParenLoc,
3719                                 Optional<unsigned> NumExpansions) {
3720     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3721                                       EllipsisLoc, RHS, RParenLoc,
3722                                       NumExpansions);
3723   }
3724 
3725   /// Build an empty C++1z fold-expression with the given operator.
3726   ///
3727   /// By default, produces the fallback value for the fold-expression, or
3728   /// produce an error if there is no fallback value.
3729   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3730                                      BinaryOperatorKind Operator) {
3731     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3732   }
3733 
3734   /// Build a new atomic operation expression.
3735   ///
3736   /// By default, performs semantic analysis to build the new expression.
3737   /// Subclasses may override this routine to provide different behavior.
3738   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3739                                AtomicExpr::AtomicOp Op,
3740                                SourceLocation RParenLoc) {
3741     // Use this for all of the locations, since we don't know the difference
3742     // between the call and the expr at this point.
3743     SourceRange Range{BuiltinLoc, RParenLoc};
3744     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3745                                      Sema::AtomicArgumentOrder::AST);
3746   }
3747 
3748   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3749                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3750     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3751   }
3752 
3753 private:
3754   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3755                                      QualType ObjectType,
3756                                      NamedDecl *FirstQualifierInScope,
3757                                      CXXScopeSpec &SS);
3758 
3759   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3760                                              QualType ObjectType,
3761                                              NamedDecl *FirstQualifierInScope,
3762                                              CXXScopeSpec &SS);
3763 
3764   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3765                                             NamedDecl *FirstQualifierInScope,
3766                                             CXXScopeSpec &SS);
3767 
3768   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3769                                       DependentNameTypeLoc TL,
3770                                       bool DeducibleTSTContext);
3771 };
3772 
3773 template <typename Derived>
3774 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3775   if (!S)
3776     return S;
3777 
3778   switch (S->getStmtClass()) {
3779   case Stmt::NoStmtClass: break;
3780 
3781   // Transform individual statement nodes
3782   // Pass SDK into statements that can produce a value
3783 #define STMT(Node, Parent)                                              \
3784   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3785 #define VALUESTMT(Node, Parent)                                         \
3786   case Stmt::Node##Class:                                               \
3787     return getDerived().Transform##Node(cast<Node>(S), SDK);
3788 #define ABSTRACT_STMT(Node)
3789 #define EXPR(Node, Parent)
3790 #include "clang/AST/StmtNodes.inc"
3791 
3792   // Transform expressions by calling TransformExpr.
3793 #define STMT(Node, Parent)
3794 #define ABSTRACT_STMT(Stmt)
3795 #define EXPR(Node, Parent) case Stmt::Node##Class:
3796 #include "clang/AST/StmtNodes.inc"
3797     {
3798       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3799 
3800       if (SDK == SDK_StmtExprResult)
3801         E = getSema().ActOnStmtExprResult(E);
3802       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3803     }
3804   }
3805 
3806   return S;
3807 }
3808 
3809 template<typename Derived>
3810 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3811   if (!S)
3812     return S;
3813 
3814   switch (S->getClauseKind()) {
3815   default: break;
3816   // Transform individual clause nodes
3817 #define GEN_CLANG_CLAUSE_CLASS
3818 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3819   case Enum:                                                                   \
3820     return getDerived().Transform##Class(cast<Class>(S));
3821 #include "llvm/Frontend/OpenMP/OMP.inc"
3822   }
3823 
3824   return S;
3825 }
3826 
3827 
3828 template<typename Derived>
3829 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3830   if (!E)
3831     return E;
3832 
3833   switch (E->getStmtClass()) {
3834     case Stmt::NoStmtClass: break;
3835 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3836 #define ABSTRACT_STMT(Stmt)
3837 #define EXPR(Node, Parent)                                              \
3838     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3839 #include "clang/AST/StmtNodes.inc"
3840   }
3841 
3842   return E;
3843 }
3844 
3845 template<typename Derived>
3846 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3847                                                         bool NotCopyInit) {
3848   // Initializers are instantiated like expressions, except that various outer
3849   // layers are stripped.
3850   if (!Init)
3851     return Init;
3852 
3853   if (auto *FE = dyn_cast<FullExpr>(Init))
3854     Init = FE->getSubExpr();
3855 
3856   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3857     Init = AIL->getCommonExpr();
3858 
3859   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3860     Init = MTE->getSubExpr();
3861 
3862   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3863     Init = Binder->getSubExpr();
3864 
3865   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3866     Init = ICE->getSubExprAsWritten();
3867 
3868   if (CXXStdInitializerListExpr *ILE =
3869           dyn_cast<CXXStdInitializerListExpr>(Init))
3870     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3871 
3872   // If this is copy-initialization, we only need to reconstruct
3873   // InitListExprs. Other forms of copy-initialization will be a no-op if
3874   // the initializer is already the right type.
3875   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3876   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3877     return getDerived().TransformExpr(Init);
3878 
3879   // Revert value-initialization back to empty parens.
3880   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3881     SourceRange Parens = VIE->getSourceRange();
3882     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3883                                              Parens.getEnd());
3884   }
3885 
3886   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3887   if (isa<ImplicitValueInitExpr>(Init))
3888     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3889                                              SourceLocation());
3890 
3891   // Revert initialization by constructor back to a parenthesized or braced list
3892   // of expressions. Any other form of initializer can just be reused directly.
3893   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3894     return getDerived().TransformExpr(Init);
3895 
3896   // If the initialization implicitly converted an initializer list to a
3897   // std::initializer_list object, unwrap the std::initializer_list too.
3898   if (Construct && Construct->isStdInitListInitialization())
3899     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3900 
3901   // Enter a list-init context if this was list initialization.
3902   EnterExpressionEvaluationContext Context(
3903       getSema(), EnterExpressionEvaluationContext::InitList,
3904       Construct->isListInitialization());
3905 
3906   SmallVector<Expr*, 8> NewArgs;
3907   bool ArgChanged = false;
3908   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3909                                   /*IsCall*/true, NewArgs, &ArgChanged))
3910     return ExprError();
3911 
3912   // If this was list initialization, revert to syntactic list form.
3913   if (Construct->isListInitialization())
3914     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3915                                         Construct->getEndLoc());
3916 
3917   // Build a ParenListExpr to represent anything else.
3918   SourceRange Parens = Construct->getParenOrBraceRange();
3919   if (Parens.isInvalid()) {
3920     // This was a variable declaration's initialization for which no initializer
3921     // was specified.
3922     assert(NewArgs.empty() &&
3923            "no parens or braces but have direct init with arguments?");
3924     return ExprEmpty();
3925   }
3926   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3927                                            Parens.getEnd());
3928 }
3929 
3930 template<typename Derived>
3931 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3932                                             unsigned NumInputs,
3933                                             bool IsCall,
3934                                       SmallVectorImpl<Expr *> &Outputs,
3935                                             bool *ArgChanged) {
3936   for (unsigned I = 0; I != NumInputs; ++I) {
3937     // If requested, drop call arguments that need to be dropped.
3938     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3939       if (ArgChanged)
3940         *ArgChanged = true;
3941 
3942       break;
3943     }
3944 
3945     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3946       Expr *Pattern = Expansion->getPattern();
3947 
3948       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3949       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3950       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3951 
3952       // Determine whether the set of unexpanded parameter packs can and should
3953       // be expanded.
3954       bool Expand = true;
3955       bool RetainExpansion = false;
3956       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3957       Optional<unsigned> NumExpansions = OrigNumExpansions;
3958       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3959                                                Pattern->getSourceRange(),
3960                                                Unexpanded,
3961                                                Expand, RetainExpansion,
3962                                                NumExpansions))
3963         return true;
3964 
3965       if (!Expand) {
3966         // The transform has determined that we should perform a simple
3967         // transformation on the pack expansion, producing another pack
3968         // expansion.
3969         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3970         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3971         if (OutPattern.isInvalid())
3972           return true;
3973 
3974         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3975                                                 Expansion->getEllipsisLoc(),
3976                                                            NumExpansions);
3977         if (Out.isInvalid())
3978           return true;
3979 
3980         if (ArgChanged)
3981           *ArgChanged = true;
3982         Outputs.push_back(Out.get());
3983         continue;
3984       }
3985 
3986       // Record right away that the argument was changed.  This needs
3987       // to happen even if the array expands to nothing.
3988       if (ArgChanged) *ArgChanged = true;
3989 
3990       // The transform has determined that we should perform an elementwise
3991       // expansion of the pattern. Do so.
3992       for (unsigned I = 0; I != *NumExpansions; ++I) {
3993         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3994         ExprResult Out = getDerived().TransformExpr(Pattern);
3995         if (Out.isInvalid())
3996           return true;
3997 
3998         if (Out.get()->containsUnexpandedParameterPack()) {
3999           Out = getDerived().RebuildPackExpansion(
4000               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4001           if (Out.isInvalid())
4002             return true;
4003         }
4004 
4005         Outputs.push_back(Out.get());
4006       }
4007 
4008       // If we're supposed to retain a pack expansion, do so by temporarily
4009       // forgetting the partially-substituted parameter pack.
4010       if (RetainExpansion) {
4011         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4012 
4013         ExprResult Out = getDerived().TransformExpr(Pattern);
4014         if (Out.isInvalid())
4015           return true;
4016 
4017         Out = getDerived().RebuildPackExpansion(
4018             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
4019         if (Out.isInvalid())
4020           return true;
4021 
4022         Outputs.push_back(Out.get());
4023       }
4024 
4025       continue;
4026     }
4027 
4028     ExprResult Result =
4029       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4030              : getDerived().TransformExpr(Inputs[I]);
4031     if (Result.isInvalid())
4032       return true;
4033 
4034     if (Result.get() != Inputs[I] && ArgChanged)
4035       *ArgChanged = true;
4036 
4037     Outputs.push_back(Result.get());
4038   }
4039 
4040   return false;
4041 }
4042 
4043 template <typename Derived>
4044 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4045     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4046   if (Var) {
4047     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4048         getDerived().TransformDefinition(Var->getLocation(), Var));
4049 
4050     if (!ConditionVar)
4051       return Sema::ConditionError();
4052 
4053     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4054   }
4055 
4056   if (Expr) {
4057     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4058 
4059     if (CondExpr.isInvalid())
4060       return Sema::ConditionError();
4061 
4062     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
4063   }
4064 
4065   return Sema::ConditionResult();
4066 }
4067 
4068 template <typename Derived>
4069 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4070     NestedNameSpecifierLoc NNS, QualType ObjectType,
4071     NamedDecl *FirstQualifierInScope) {
4072   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4073   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4074        Qualifier = Qualifier.getPrefix())
4075     Qualifiers.push_back(Qualifier);
4076 
4077   CXXScopeSpec SS;
4078   while (!Qualifiers.empty()) {
4079     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4080     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4081 
4082     switch (QNNS->getKind()) {
4083     case NestedNameSpecifier::Identifier: {
4084       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4085                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4086                                       ObjectType);
4087       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4088                                               SS, FirstQualifierInScope, false))
4089         return NestedNameSpecifierLoc();
4090       break;
4091     }
4092 
4093     case NestedNameSpecifier::Namespace: {
4094       NamespaceDecl *NS =
4095           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4096               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4097       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4098       break;
4099     }
4100 
4101     case NestedNameSpecifier::NamespaceAlias: {
4102       NamespaceAliasDecl *Alias =
4103           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4104               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4105       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4106                 Q.getLocalEndLoc());
4107       break;
4108     }
4109 
4110     case NestedNameSpecifier::Global:
4111       // There is no meaningful transformation that one could perform on the
4112       // global scope.
4113       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4114       break;
4115 
4116     case NestedNameSpecifier::Super: {
4117       CXXRecordDecl *RD =
4118           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4119               SourceLocation(), QNNS->getAsRecordDecl()));
4120       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4121       break;
4122     }
4123 
4124     case NestedNameSpecifier::TypeSpecWithTemplate:
4125     case NestedNameSpecifier::TypeSpec: {
4126       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4127                                               FirstQualifierInScope, SS);
4128 
4129       if (!TL)
4130         return NestedNameSpecifierLoc();
4131 
4132       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4133           (SemaRef.getLangOpts().CPlusPlus11 &&
4134            TL.getType()->isEnumeralType())) {
4135         assert(!TL.getType().hasLocalQualifiers() &&
4136                "Can't get cv-qualifiers here");
4137         if (TL.getType()->isEnumeralType())
4138           SemaRef.Diag(TL.getBeginLoc(),
4139                        diag::warn_cxx98_compat_enum_nested_name_spec);
4140         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4141                   Q.getLocalEndLoc());
4142         break;
4143       }
4144       // If the nested-name-specifier is an invalid type def, don't emit an
4145       // error because a previous error should have already been emitted.
4146       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4147       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4148         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4149             << TL.getType() << SS.getRange();
4150       }
4151       return NestedNameSpecifierLoc();
4152     }
4153     }
4154 
4155     // The qualifier-in-scope and object type only apply to the leftmost entity.
4156     FirstQualifierInScope = nullptr;
4157     ObjectType = QualType();
4158   }
4159 
4160   // Don't rebuild the nested-name-specifier if we don't have to.
4161   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4162       !getDerived().AlwaysRebuild())
4163     return NNS;
4164 
4165   // If we can re-use the source-location data from the original
4166   // nested-name-specifier, do so.
4167   if (SS.location_size() == NNS.getDataLength() &&
4168       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4169     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4170 
4171   // Allocate new nested-name-specifier location information.
4172   return SS.getWithLocInContext(SemaRef.Context);
4173 }
4174 
4175 template<typename Derived>
4176 DeclarationNameInfo
4177 TreeTransform<Derived>
4178 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4179   DeclarationName Name = NameInfo.getName();
4180   if (!Name)
4181     return DeclarationNameInfo();
4182 
4183   switch (Name.getNameKind()) {
4184   case DeclarationName::Identifier:
4185   case DeclarationName::ObjCZeroArgSelector:
4186   case DeclarationName::ObjCOneArgSelector:
4187   case DeclarationName::ObjCMultiArgSelector:
4188   case DeclarationName::CXXOperatorName:
4189   case DeclarationName::CXXLiteralOperatorName:
4190   case DeclarationName::CXXUsingDirective:
4191     return NameInfo;
4192 
4193   case DeclarationName::CXXDeductionGuideName: {
4194     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4195     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4196         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4197     if (!NewTemplate)
4198       return DeclarationNameInfo();
4199 
4200     DeclarationNameInfo NewNameInfo(NameInfo);
4201     NewNameInfo.setName(
4202         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4203     return NewNameInfo;
4204   }
4205 
4206   case DeclarationName::CXXConstructorName:
4207   case DeclarationName::CXXDestructorName:
4208   case DeclarationName::CXXConversionFunctionName: {
4209     TypeSourceInfo *NewTInfo;
4210     CanQualType NewCanTy;
4211     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4212       NewTInfo = getDerived().TransformType(OldTInfo);
4213       if (!NewTInfo)
4214         return DeclarationNameInfo();
4215       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4216     }
4217     else {
4218       NewTInfo = nullptr;
4219       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4220       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4221       if (NewT.isNull())
4222         return DeclarationNameInfo();
4223       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4224     }
4225 
4226     DeclarationName NewName
4227       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4228                                                            NewCanTy);
4229     DeclarationNameInfo NewNameInfo(NameInfo);
4230     NewNameInfo.setName(NewName);
4231     NewNameInfo.setNamedTypeInfo(NewTInfo);
4232     return NewNameInfo;
4233   }
4234   }
4235 
4236   llvm_unreachable("Unknown name kind.");
4237 }
4238 
4239 template<typename Derived>
4240 TemplateName
4241 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4242                                               TemplateName Name,
4243                                               SourceLocation NameLoc,
4244                                               QualType ObjectType,
4245                                               NamedDecl *FirstQualifierInScope,
4246                                               bool AllowInjectedClassName) {
4247   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4248     TemplateDecl *Template = QTN->getTemplateDecl();
4249     assert(Template && "qualified template name must refer to a template");
4250 
4251     TemplateDecl *TransTemplate
4252       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4253                                                               Template));
4254     if (!TransTemplate)
4255       return TemplateName();
4256 
4257     if (!getDerived().AlwaysRebuild() &&
4258         SS.getScopeRep() == QTN->getQualifier() &&
4259         TransTemplate == Template)
4260       return Name;
4261 
4262     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4263                                             TransTemplate);
4264   }
4265 
4266   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4267     if (SS.getScopeRep()) {
4268       // These apply to the scope specifier, not the template.
4269       ObjectType = QualType();
4270       FirstQualifierInScope = nullptr;
4271     }
4272 
4273     if (!getDerived().AlwaysRebuild() &&
4274         SS.getScopeRep() == DTN->getQualifier() &&
4275         ObjectType.isNull())
4276       return Name;
4277 
4278     // FIXME: Preserve the location of the "template" keyword.
4279     SourceLocation TemplateKWLoc = NameLoc;
4280 
4281     if (DTN->isIdentifier()) {
4282       return getDerived().RebuildTemplateName(SS,
4283                                               TemplateKWLoc,
4284                                               *DTN->getIdentifier(),
4285                                               NameLoc,
4286                                               ObjectType,
4287                                               FirstQualifierInScope,
4288                                               AllowInjectedClassName);
4289     }
4290 
4291     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4292                                             DTN->getOperator(), NameLoc,
4293                                             ObjectType, AllowInjectedClassName);
4294   }
4295 
4296   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4297     TemplateDecl *TransTemplate
4298       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4299                                                               Template));
4300     if (!TransTemplate)
4301       return TemplateName();
4302 
4303     if (!getDerived().AlwaysRebuild() &&
4304         TransTemplate == Template)
4305       return Name;
4306 
4307     return TemplateName(TransTemplate);
4308   }
4309 
4310   if (SubstTemplateTemplateParmPackStorage *SubstPack
4311       = Name.getAsSubstTemplateTemplateParmPack()) {
4312     TemplateTemplateParmDecl *TransParam
4313     = cast_or_null<TemplateTemplateParmDecl>(
4314             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4315     if (!TransParam)
4316       return TemplateName();
4317 
4318     if (!getDerived().AlwaysRebuild() &&
4319         TransParam == SubstPack->getParameterPack())
4320       return Name;
4321 
4322     return getDerived().RebuildTemplateName(TransParam,
4323                                             SubstPack->getArgumentPack());
4324   }
4325 
4326   // These should be getting filtered out before they reach the AST.
4327   llvm_unreachable("overloaded function decl survived to here");
4328 }
4329 
4330 template<typename Derived>
4331 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4332                                          const TemplateArgument &Arg,
4333                                          TemplateArgumentLoc &Output) {
4334   Output = getSema().getTrivialTemplateArgumentLoc(
4335       Arg, QualType(), getDerived().getBaseLocation());
4336 }
4337 
4338 template <typename Derived>
4339 bool TreeTransform<Derived>::TransformTemplateArgument(
4340     const TemplateArgumentLoc &Input, TemplateArgumentLoc &Output,
4341     bool Uneval) {
4342   const TemplateArgument &Arg = Input.getArgument();
4343   switch (Arg.getKind()) {
4344   case TemplateArgument::Null:
4345   case TemplateArgument::Pack:
4346     llvm_unreachable("Unexpected TemplateArgument");
4347 
4348   case TemplateArgument::Integral:
4349   case TemplateArgument::NullPtr:
4350   case TemplateArgument::Declaration: {
4351     // Transform a resolved template argument straight to a resolved template
4352     // argument. We get here when substituting into an already-substituted
4353     // template type argument during concept satisfaction checking.
4354     QualType T = Arg.getNonTypeTemplateArgumentType();
4355     QualType NewT = getDerived().TransformType(T);
4356     if (NewT.isNull())
4357       return true;
4358 
4359     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4360                        ? Arg.getAsDecl()
4361                        : nullptr;
4362     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4363                               getDerived().getBaseLocation(), D))
4364                         : nullptr;
4365     if (D && !NewD)
4366       return true;
4367 
4368     if (NewT == T && D == NewD)
4369       Output = Input;
4370     else if (Arg.getKind() == TemplateArgument::Integral)
4371       Output = TemplateArgumentLoc(
4372           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4373           TemplateArgumentLocInfo());
4374     else if (Arg.getKind() == TemplateArgument::NullPtr)
4375       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4376                                    TemplateArgumentLocInfo());
4377     else
4378       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4379                                    TemplateArgumentLocInfo());
4380 
4381     return false;
4382   }
4383 
4384   case TemplateArgument::Type: {
4385     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4386     if (!DI)
4387       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4388 
4389     DI = getDerived().TransformType(DI);
4390     if (!DI)
4391       return true;
4392 
4393     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4394     return false;
4395   }
4396 
4397   case TemplateArgument::Template: {
4398     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4399     if (QualifierLoc) {
4400       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4401       if (!QualifierLoc)
4402         return true;
4403     }
4404 
4405     CXXScopeSpec SS;
4406     SS.Adopt(QualifierLoc);
4407     TemplateName Template = getDerived().TransformTemplateName(
4408         SS, Arg.getAsTemplate(), Input.getTemplateNameLoc());
4409     if (Template.isNull())
4410       return true;
4411 
4412     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4413                                  QualifierLoc, Input.getTemplateNameLoc());
4414     return false;
4415   }
4416 
4417   case TemplateArgument::TemplateExpansion:
4418     llvm_unreachable("Caller should expand pack expansions");
4419 
4420   case TemplateArgument::Expression: {
4421     // Template argument expressions are constant expressions.
4422     EnterExpressionEvaluationContext Unevaluated(
4423         getSema(),
4424         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4425                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4426         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4427         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4428 
4429     Expr *InputExpr = Input.getSourceExpression();
4430     if (!InputExpr)
4431       InputExpr = Input.getArgument().getAsExpr();
4432 
4433     ExprResult E = getDerived().TransformExpr(InputExpr);
4434     E = SemaRef.ActOnConstantExpression(E);
4435     if (E.isInvalid())
4436       return true;
4437     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4438     return false;
4439   }
4440   }
4441 
4442   // Work around bogus GCC warning
4443   return true;
4444 }
4445 
4446 /// Iterator adaptor that invents template argument location information
4447 /// for each of the template arguments in its underlying iterator.
4448 template<typename Derived, typename InputIterator>
4449 class TemplateArgumentLocInventIterator {
4450   TreeTransform<Derived> &Self;
4451   InputIterator Iter;
4452 
4453 public:
4454   typedef TemplateArgumentLoc value_type;
4455   typedef TemplateArgumentLoc reference;
4456   typedef typename std::iterator_traits<InputIterator>::difference_type
4457     difference_type;
4458   typedef std::input_iterator_tag iterator_category;
4459 
4460   class pointer {
4461     TemplateArgumentLoc Arg;
4462 
4463   public:
4464     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4465 
4466     const TemplateArgumentLoc *operator->() const { return &Arg; }
4467   };
4468 
4469   TemplateArgumentLocInventIterator() { }
4470 
4471   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4472                                              InputIterator Iter)
4473     : Self(Self), Iter(Iter) { }
4474 
4475   TemplateArgumentLocInventIterator &operator++() {
4476     ++Iter;
4477     return *this;
4478   }
4479 
4480   TemplateArgumentLocInventIterator operator++(int) {
4481     TemplateArgumentLocInventIterator Old(*this);
4482     ++(*this);
4483     return Old;
4484   }
4485 
4486   reference operator*() const {
4487     TemplateArgumentLoc Result;
4488     Self.InventTemplateArgumentLoc(*Iter, Result);
4489     return Result;
4490   }
4491 
4492   pointer operator->() const { return pointer(**this); }
4493 
4494   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4495                          const TemplateArgumentLocInventIterator &Y) {
4496     return X.Iter == Y.Iter;
4497   }
4498 
4499   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4500                          const TemplateArgumentLocInventIterator &Y) {
4501     return X.Iter != Y.Iter;
4502   }
4503 };
4504 
4505 template<typename Derived>
4506 template<typename InputIterator>
4507 bool TreeTransform<Derived>::TransformTemplateArguments(
4508     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4509     bool Uneval) {
4510   for (; First != Last; ++First) {
4511     TemplateArgumentLoc Out;
4512     TemplateArgumentLoc In = *First;
4513 
4514     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4515       // Unpack argument packs, which we translate them into separate
4516       // arguments.
4517       // FIXME: We could do much better if we could guarantee that the
4518       // TemplateArgumentLocInfo for the pack expansion would be usable for
4519       // all of the template arguments in the argument pack.
4520       typedef TemplateArgumentLocInventIterator<Derived,
4521                                                 TemplateArgument::pack_iterator>
4522         PackLocIterator;
4523       if (TransformTemplateArguments(PackLocIterator(*this,
4524                                                  In.getArgument().pack_begin()),
4525                                      PackLocIterator(*this,
4526                                                    In.getArgument().pack_end()),
4527                                      Outputs, Uneval))
4528         return true;
4529 
4530       continue;
4531     }
4532 
4533     if (In.getArgument().isPackExpansion()) {
4534       // We have a pack expansion, for which we will be substituting into
4535       // the pattern.
4536       SourceLocation Ellipsis;
4537       Optional<unsigned> OrigNumExpansions;
4538       TemplateArgumentLoc Pattern
4539         = getSema().getTemplateArgumentPackExpansionPattern(
4540               In, Ellipsis, OrigNumExpansions);
4541 
4542       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4543       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4544       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4545 
4546       // Determine whether the set of unexpanded parameter packs can and should
4547       // be expanded.
4548       bool Expand = true;
4549       bool RetainExpansion = false;
4550       Optional<unsigned> NumExpansions = OrigNumExpansions;
4551       if (getDerived().TryExpandParameterPacks(Ellipsis,
4552                                                Pattern.getSourceRange(),
4553                                                Unexpanded,
4554                                                Expand,
4555                                                RetainExpansion,
4556                                                NumExpansions))
4557         return true;
4558 
4559       if (!Expand) {
4560         // The transform has determined that we should perform a simple
4561         // transformation on the pack expansion, producing another pack
4562         // expansion.
4563         TemplateArgumentLoc OutPattern;
4564         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4565         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4566           return true;
4567 
4568         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4569                                                 NumExpansions);
4570         if (Out.getArgument().isNull())
4571           return true;
4572 
4573         Outputs.addArgument(Out);
4574         continue;
4575       }
4576 
4577       // The transform has determined that we should perform an elementwise
4578       // expansion of the pattern. Do so.
4579       for (unsigned I = 0; I != *NumExpansions; ++I) {
4580         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4581 
4582         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4583           return true;
4584 
4585         if (Out.getArgument().containsUnexpandedParameterPack()) {
4586           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4587                                                   OrigNumExpansions);
4588           if (Out.getArgument().isNull())
4589             return true;
4590         }
4591 
4592         Outputs.addArgument(Out);
4593       }
4594 
4595       // If we're supposed to retain a pack expansion, do so by temporarily
4596       // forgetting the partially-substituted parameter pack.
4597       if (RetainExpansion) {
4598         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4599 
4600         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4601           return true;
4602 
4603         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4604                                                 OrigNumExpansions);
4605         if (Out.getArgument().isNull())
4606           return true;
4607 
4608         Outputs.addArgument(Out);
4609       }
4610 
4611       continue;
4612     }
4613 
4614     // The simple case:
4615     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4616       return true;
4617 
4618     Outputs.addArgument(Out);
4619   }
4620 
4621   return false;
4622 
4623 }
4624 
4625 //===----------------------------------------------------------------------===//
4626 // Type transformation
4627 //===----------------------------------------------------------------------===//
4628 
4629 template<typename Derived>
4630 QualType TreeTransform<Derived>::TransformType(QualType T) {
4631   if (getDerived().AlreadyTransformed(T))
4632     return T;
4633 
4634   // Temporary workaround.  All of these transformations should
4635   // eventually turn into transformations on TypeLocs.
4636   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4637                                                 getDerived().getBaseLocation());
4638 
4639   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4640 
4641   if (!NewDI)
4642     return QualType();
4643 
4644   return NewDI->getType();
4645 }
4646 
4647 template<typename Derived>
4648 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4649   // Refine the base location to the type's location.
4650   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4651                        getDerived().getBaseEntity());
4652   if (getDerived().AlreadyTransformed(DI->getType()))
4653     return DI;
4654 
4655   TypeLocBuilder TLB;
4656 
4657   TypeLoc TL = DI->getTypeLoc();
4658   TLB.reserve(TL.getFullDataSize());
4659 
4660   QualType Result = getDerived().TransformType(TLB, TL);
4661   if (Result.isNull())
4662     return nullptr;
4663 
4664   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4665 }
4666 
4667 template<typename Derived>
4668 QualType
4669 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4670   switch (T.getTypeLocClass()) {
4671 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4672 #define TYPELOC(CLASS, PARENT)                                                 \
4673   case TypeLoc::CLASS:                                                         \
4674     return getDerived().Transform##CLASS##Type(TLB,                            \
4675                                                T.castAs<CLASS##TypeLoc>());
4676 #include "clang/AST/TypeLocNodes.def"
4677   }
4678 
4679   llvm_unreachable("unhandled type loc!");
4680 }
4681 
4682 template<typename Derived>
4683 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4684   if (!isa<DependentNameType>(T))
4685     return TransformType(T);
4686 
4687   if (getDerived().AlreadyTransformed(T))
4688     return T;
4689   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4690                                                 getDerived().getBaseLocation());
4691   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4692   return NewDI ? NewDI->getType() : QualType();
4693 }
4694 
4695 template<typename Derived>
4696 TypeSourceInfo *
4697 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4698   if (!isa<DependentNameType>(DI->getType()))
4699     return TransformType(DI);
4700 
4701   // Refine the base location to the type's location.
4702   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4703                        getDerived().getBaseEntity());
4704   if (getDerived().AlreadyTransformed(DI->getType()))
4705     return DI;
4706 
4707   TypeLocBuilder TLB;
4708 
4709   TypeLoc TL = DI->getTypeLoc();
4710   TLB.reserve(TL.getFullDataSize());
4711 
4712   auto QTL = TL.getAs<QualifiedTypeLoc>();
4713   if (QTL)
4714     TL = QTL.getUnqualifiedLoc();
4715 
4716   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4717 
4718   QualType Result = getDerived().TransformDependentNameType(
4719       TLB, DNTL, /*DeducedTSTContext*/true);
4720   if (Result.isNull())
4721     return nullptr;
4722 
4723   if (QTL) {
4724     Result = getDerived().RebuildQualifiedType(Result, QTL);
4725     if (Result.isNull())
4726       return nullptr;
4727     TLB.TypeWasModifiedSafely(Result);
4728   }
4729 
4730   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4731 }
4732 
4733 template<typename Derived>
4734 QualType
4735 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4736                                                QualifiedTypeLoc T) {
4737   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4738   if (Result.isNull())
4739     return QualType();
4740 
4741   Result = getDerived().RebuildQualifiedType(Result, T);
4742 
4743   if (Result.isNull())
4744     return QualType();
4745 
4746   // RebuildQualifiedType might have updated the type, but not in a way
4747   // that invalidates the TypeLoc. (There's no location information for
4748   // qualifiers.)
4749   TLB.TypeWasModifiedSafely(Result);
4750 
4751   return Result;
4752 }
4753 
4754 template <typename Derived>
4755 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4756                                                       QualifiedTypeLoc TL) {
4757 
4758   SourceLocation Loc = TL.getBeginLoc();
4759   Qualifiers Quals = TL.getType().getLocalQualifiers();
4760 
4761   if ((T.getAddressSpace() != LangAS::Default &&
4762        Quals.getAddressSpace() != LangAS::Default) &&
4763       T.getAddressSpace() != Quals.getAddressSpace()) {
4764     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4765         << TL.getType() << T;
4766     return QualType();
4767   }
4768 
4769   // C++ [dcl.fct]p7:
4770   //   [When] adding cv-qualifications on top of the function type [...] the
4771   //   cv-qualifiers are ignored.
4772   if (T->isFunctionType()) {
4773     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4774                                                      Quals.getAddressSpace());
4775     return T;
4776   }
4777 
4778   // C++ [dcl.ref]p1:
4779   //   when the cv-qualifiers are introduced through the use of a typedef-name
4780   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4781   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4782   // applied to a reference type.
4783   if (T->isReferenceType()) {
4784     // The only qualifier that applies to a reference type is restrict.
4785     if (!Quals.hasRestrict())
4786       return T;
4787     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4788   }
4789 
4790   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4791   // resulting type.
4792   if (Quals.hasObjCLifetime()) {
4793     if (!T->isObjCLifetimeType() && !T->isDependentType())
4794       Quals.removeObjCLifetime();
4795     else if (T.getObjCLifetime()) {
4796       // Objective-C ARC:
4797       //   A lifetime qualifier applied to a substituted template parameter
4798       //   overrides the lifetime qualifier from the template argument.
4799       const AutoType *AutoTy;
4800       if (const SubstTemplateTypeParmType *SubstTypeParam
4801                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4802         QualType Replacement = SubstTypeParam->getReplacementType();
4803         Qualifiers Qs = Replacement.getQualifiers();
4804         Qs.removeObjCLifetime();
4805         Replacement = SemaRef.Context.getQualifiedType(
4806             Replacement.getUnqualifiedType(), Qs);
4807         T = SemaRef.Context.getSubstTemplateTypeParmType(
4808             SubstTypeParam->getReplacedParameter(), Replacement);
4809       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4810         // 'auto' types behave the same way as template parameters.
4811         QualType Deduced = AutoTy->getDeducedType();
4812         Qualifiers Qs = Deduced.getQualifiers();
4813         Qs.removeObjCLifetime();
4814         Deduced =
4815             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4816         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4817                                         AutoTy->isDependentType(),
4818                                         /*isPack=*/false,
4819                                         AutoTy->getTypeConstraintConcept(),
4820                                         AutoTy->getTypeConstraintArguments());
4821       } else {
4822         // Otherwise, complain about the addition of a qualifier to an
4823         // already-qualified type.
4824         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4825         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4826         Quals.removeObjCLifetime();
4827       }
4828     }
4829   }
4830 
4831   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4832 }
4833 
4834 template<typename Derived>
4835 TypeLoc
4836 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4837                                                    QualType ObjectType,
4838                                                    NamedDecl *UnqualLookup,
4839                                                    CXXScopeSpec &SS) {
4840   if (getDerived().AlreadyTransformed(TL.getType()))
4841     return TL;
4842 
4843   TypeSourceInfo *TSI =
4844       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4845   if (TSI)
4846     return TSI->getTypeLoc();
4847   return TypeLoc();
4848 }
4849 
4850 template<typename Derived>
4851 TypeSourceInfo *
4852 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4853                                                    QualType ObjectType,
4854                                                    NamedDecl *UnqualLookup,
4855                                                    CXXScopeSpec &SS) {
4856   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4857     return TSInfo;
4858 
4859   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4860                                    UnqualLookup, SS);
4861 }
4862 
4863 template <typename Derived>
4864 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4865     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4866     CXXScopeSpec &SS) {
4867   QualType T = TL.getType();
4868   assert(!getDerived().AlreadyTransformed(T));
4869 
4870   TypeLocBuilder TLB;
4871   QualType Result;
4872 
4873   if (isa<TemplateSpecializationType>(T)) {
4874     TemplateSpecializationTypeLoc SpecTL =
4875         TL.castAs<TemplateSpecializationTypeLoc>();
4876 
4877     TemplateName Template = getDerived().TransformTemplateName(
4878         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4879         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4880     if (Template.isNull())
4881       return nullptr;
4882 
4883     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4884                                                               Template);
4885   } else if (isa<DependentTemplateSpecializationType>(T)) {
4886     DependentTemplateSpecializationTypeLoc SpecTL =
4887         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4888 
4889     TemplateName Template
4890       = getDerived().RebuildTemplateName(SS,
4891                                          SpecTL.getTemplateKeywordLoc(),
4892                                          *SpecTL.getTypePtr()->getIdentifier(),
4893                                          SpecTL.getTemplateNameLoc(),
4894                                          ObjectType, UnqualLookup,
4895                                          /*AllowInjectedClassName*/true);
4896     if (Template.isNull())
4897       return nullptr;
4898 
4899     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4900                                                                        SpecTL,
4901                                                                        Template,
4902                                                                        SS);
4903   } else {
4904     // Nothing special needs to be done for these.
4905     Result = getDerived().TransformType(TLB, TL);
4906   }
4907 
4908   if (Result.isNull())
4909     return nullptr;
4910 
4911   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4912 }
4913 
4914 template <class TyLoc> static inline
4915 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4916   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4917   NewT.setNameLoc(T.getNameLoc());
4918   return T.getType();
4919 }
4920 
4921 template<typename Derived>
4922 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4923                                                       BuiltinTypeLoc T) {
4924   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4925   NewT.setBuiltinLoc(T.getBuiltinLoc());
4926   if (T.needsExtraLocalData())
4927     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4928   return T.getType();
4929 }
4930 
4931 template<typename Derived>
4932 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4933                                                       ComplexTypeLoc T) {
4934   // FIXME: recurse?
4935   return TransformTypeSpecType(TLB, T);
4936 }
4937 
4938 template <typename Derived>
4939 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4940                                                        AdjustedTypeLoc TL) {
4941   // Adjustments applied during transformation are handled elsewhere.
4942   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4943 }
4944 
4945 template<typename Derived>
4946 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4947                                                       DecayedTypeLoc TL) {
4948   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4949   if (OriginalType.isNull())
4950     return QualType();
4951 
4952   QualType Result = TL.getType();
4953   if (getDerived().AlwaysRebuild() ||
4954       OriginalType != TL.getOriginalLoc().getType())
4955     Result = SemaRef.Context.getDecayedType(OriginalType);
4956   TLB.push<DecayedTypeLoc>(Result);
4957   // Nothing to set for DecayedTypeLoc.
4958   return Result;
4959 }
4960 
4961 template<typename Derived>
4962 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4963                                                       PointerTypeLoc TL) {
4964   QualType PointeeType
4965     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4966   if (PointeeType.isNull())
4967     return QualType();
4968 
4969   QualType Result = TL.getType();
4970   if (PointeeType->getAs<ObjCObjectType>()) {
4971     // A dependent pointer type 'T *' has is being transformed such
4972     // that an Objective-C class type is being replaced for 'T'. The
4973     // resulting pointer type is an ObjCObjectPointerType, not a
4974     // PointerType.
4975     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4976 
4977     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4978     NewT.setStarLoc(TL.getStarLoc());
4979     return Result;
4980   }
4981 
4982   if (getDerived().AlwaysRebuild() ||
4983       PointeeType != TL.getPointeeLoc().getType()) {
4984     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4985     if (Result.isNull())
4986       return QualType();
4987   }
4988 
4989   // Objective-C ARC can add lifetime qualifiers to the type that we're
4990   // pointing to.
4991   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4992 
4993   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4994   NewT.setSigilLoc(TL.getSigilLoc());
4995   return Result;
4996 }
4997 
4998 template<typename Derived>
4999 QualType
5000 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
5001                                                   BlockPointerTypeLoc TL) {
5002   QualType PointeeType
5003     = getDerived().TransformType(TLB, TL.getPointeeLoc());
5004   if (PointeeType.isNull())
5005     return QualType();
5006 
5007   QualType Result = TL.getType();
5008   if (getDerived().AlwaysRebuild() ||
5009       PointeeType != TL.getPointeeLoc().getType()) {
5010     Result = getDerived().RebuildBlockPointerType(PointeeType,
5011                                                   TL.getSigilLoc());
5012     if (Result.isNull())
5013       return QualType();
5014   }
5015 
5016   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
5017   NewT.setSigilLoc(TL.getSigilLoc());
5018   return Result;
5019 }
5020 
5021 /// Transforms a reference type.  Note that somewhat paradoxically we
5022 /// don't care whether the type itself is an l-value type or an r-value
5023 /// type;  we only care if the type was *written* as an l-value type
5024 /// or an r-value type.
5025 template<typename Derived>
5026 QualType
5027 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5028                                                ReferenceTypeLoc TL) {
5029   const ReferenceType *T = TL.getTypePtr();
5030 
5031   // Note that this works with the pointee-as-written.
5032   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5033   if (PointeeType.isNull())
5034     return QualType();
5035 
5036   QualType Result = TL.getType();
5037   if (getDerived().AlwaysRebuild() ||
5038       PointeeType != T->getPointeeTypeAsWritten()) {
5039     Result = getDerived().RebuildReferenceType(PointeeType,
5040                                                T->isSpelledAsLValue(),
5041                                                TL.getSigilLoc());
5042     if (Result.isNull())
5043       return QualType();
5044   }
5045 
5046   // Objective-C ARC can add lifetime qualifiers to the type that we're
5047   // referring to.
5048   TLB.TypeWasModifiedSafely(
5049       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5050 
5051   // r-value references can be rebuilt as l-value references.
5052   ReferenceTypeLoc NewTL;
5053   if (isa<LValueReferenceType>(Result))
5054     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5055   else
5056     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5057   NewTL.setSigilLoc(TL.getSigilLoc());
5058 
5059   return Result;
5060 }
5061 
5062 template<typename Derived>
5063 QualType
5064 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5065                                                  LValueReferenceTypeLoc TL) {
5066   return TransformReferenceType(TLB, TL);
5067 }
5068 
5069 template<typename Derived>
5070 QualType
5071 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5072                                                  RValueReferenceTypeLoc TL) {
5073   return TransformReferenceType(TLB, TL);
5074 }
5075 
5076 template<typename Derived>
5077 QualType
5078 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5079                                                    MemberPointerTypeLoc TL) {
5080   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5081   if (PointeeType.isNull())
5082     return QualType();
5083 
5084   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5085   TypeSourceInfo *NewClsTInfo = nullptr;
5086   if (OldClsTInfo) {
5087     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5088     if (!NewClsTInfo)
5089       return QualType();
5090   }
5091 
5092   const MemberPointerType *T = TL.getTypePtr();
5093   QualType OldClsType = QualType(T->getClass(), 0);
5094   QualType NewClsType;
5095   if (NewClsTInfo)
5096     NewClsType = NewClsTInfo->getType();
5097   else {
5098     NewClsType = getDerived().TransformType(OldClsType);
5099     if (NewClsType.isNull())
5100       return QualType();
5101   }
5102 
5103   QualType Result = TL.getType();
5104   if (getDerived().AlwaysRebuild() ||
5105       PointeeType != T->getPointeeType() ||
5106       NewClsType != OldClsType) {
5107     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5108                                                    TL.getStarLoc());
5109     if (Result.isNull())
5110       return QualType();
5111   }
5112 
5113   // If we had to adjust the pointee type when building a member pointer, make
5114   // sure to push TypeLoc info for it.
5115   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5116   if (MPT && PointeeType != MPT->getPointeeType()) {
5117     assert(isa<AdjustedType>(MPT->getPointeeType()));
5118     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5119   }
5120 
5121   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5122   NewTL.setSigilLoc(TL.getSigilLoc());
5123   NewTL.setClassTInfo(NewClsTInfo);
5124 
5125   return Result;
5126 }
5127 
5128 template<typename Derived>
5129 QualType
5130 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5131                                                    ConstantArrayTypeLoc TL) {
5132   const ConstantArrayType *T = TL.getTypePtr();
5133   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5134   if (ElementType.isNull())
5135     return QualType();
5136 
5137   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5138   Expr *OldSize = TL.getSizeExpr();
5139   if (!OldSize)
5140     OldSize = const_cast<Expr*>(T->getSizeExpr());
5141   Expr *NewSize = nullptr;
5142   if (OldSize) {
5143     EnterExpressionEvaluationContext Unevaluated(
5144         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5145     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5146     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5147   }
5148 
5149   QualType Result = TL.getType();
5150   if (getDerived().AlwaysRebuild() ||
5151       ElementType != T->getElementType() ||
5152       (T->getSizeExpr() && NewSize != OldSize)) {
5153     Result = getDerived().RebuildConstantArrayType(ElementType,
5154                                                    T->getSizeModifier(),
5155                                                    T->getSize(), NewSize,
5156                                              T->getIndexTypeCVRQualifiers(),
5157                                                    TL.getBracketsRange());
5158     if (Result.isNull())
5159       return QualType();
5160   }
5161 
5162   // We might have either a ConstantArrayType or a VariableArrayType now:
5163   // a ConstantArrayType is allowed to have an element type which is a
5164   // VariableArrayType if the type is dependent.  Fortunately, all array
5165   // types have the same location layout.
5166   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5167   NewTL.setLBracketLoc(TL.getLBracketLoc());
5168   NewTL.setRBracketLoc(TL.getRBracketLoc());
5169   NewTL.setSizeExpr(NewSize);
5170 
5171   return Result;
5172 }
5173 
5174 template<typename Derived>
5175 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5176                                               TypeLocBuilder &TLB,
5177                                               IncompleteArrayTypeLoc TL) {
5178   const IncompleteArrayType *T = TL.getTypePtr();
5179   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5180   if (ElementType.isNull())
5181     return QualType();
5182 
5183   QualType Result = TL.getType();
5184   if (getDerived().AlwaysRebuild() ||
5185       ElementType != T->getElementType()) {
5186     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5187                                                      T->getSizeModifier(),
5188                                            T->getIndexTypeCVRQualifiers(),
5189                                                      TL.getBracketsRange());
5190     if (Result.isNull())
5191       return QualType();
5192   }
5193 
5194   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5195   NewTL.setLBracketLoc(TL.getLBracketLoc());
5196   NewTL.setRBracketLoc(TL.getRBracketLoc());
5197   NewTL.setSizeExpr(nullptr);
5198 
5199   return Result;
5200 }
5201 
5202 template<typename Derived>
5203 QualType
5204 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5205                                                    VariableArrayTypeLoc TL) {
5206   const VariableArrayType *T = TL.getTypePtr();
5207   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5208   if (ElementType.isNull())
5209     return QualType();
5210 
5211   ExprResult SizeResult;
5212   {
5213     EnterExpressionEvaluationContext Context(
5214         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5215     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5216   }
5217   if (SizeResult.isInvalid())
5218     return QualType();
5219   SizeResult =
5220       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5221   if (SizeResult.isInvalid())
5222     return QualType();
5223 
5224   Expr *Size = SizeResult.get();
5225 
5226   QualType Result = TL.getType();
5227   if (getDerived().AlwaysRebuild() ||
5228       ElementType != T->getElementType() ||
5229       Size != T->getSizeExpr()) {
5230     Result = getDerived().RebuildVariableArrayType(ElementType,
5231                                                    T->getSizeModifier(),
5232                                                    Size,
5233                                              T->getIndexTypeCVRQualifiers(),
5234                                                    TL.getBracketsRange());
5235     if (Result.isNull())
5236       return QualType();
5237   }
5238 
5239   // We might have constant size array now, but fortunately it has the same
5240   // location layout.
5241   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5242   NewTL.setLBracketLoc(TL.getLBracketLoc());
5243   NewTL.setRBracketLoc(TL.getRBracketLoc());
5244   NewTL.setSizeExpr(Size);
5245 
5246   return Result;
5247 }
5248 
5249 template<typename Derived>
5250 QualType
5251 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5252                                              DependentSizedArrayTypeLoc TL) {
5253   const DependentSizedArrayType *T = TL.getTypePtr();
5254   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5255   if (ElementType.isNull())
5256     return QualType();
5257 
5258   // Array bounds are constant expressions.
5259   EnterExpressionEvaluationContext Unevaluated(
5260       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5261 
5262   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5263   Expr *origSize = TL.getSizeExpr();
5264   if (!origSize) origSize = T->getSizeExpr();
5265 
5266   ExprResult sizeResult
5267     = getDerived().TransformExpr(origSize);
5268   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5269   if (sizeResult.isInvalid())
5270     return QualType();
5271 
5272   Expr *size = sizeResult.get();
5273 
5274   QualType Result = TL.getType();
5275   if (getDerived().AlwaysRebuild() ||
5276       ElementType != T->getElementType() ||
5277       size != origSize) {
5278     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5279                                                          T->getSizeModifier(),
5280                                                          size,
5281                                                 T->getIndexTypeCVRQualifiers(),
5282                                                         TL.getBracketsRange());
5283     if (Result.isNull())
5284       return QualType();
5285   }
5286 
5287   // We might have any sort of array type now, but fortunately they
5288   // all have the same location layout.
5289   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5290   NewTL.setLBracketLoc(TL.getLBracketLoc());
5291   NewTL.setRBracketLoc(TL.getRBracketLoc());
5292   NewTL.setSizeExpr(size);
5293 
5294   return Result;
5295 }
5296 
5297 template <typename Derived>
5298 QualType TreeTransform<Derived>::TransformDependentVectorType(
5299     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5300   const DependentVectorType *T = TL.getTypePtr();
5301   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5302   if (ElementType.isNull())
5303     return QualType();
5304 
5305   EnterExpressionEvaluationContext Unevaluated(
5306       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5307 
5308   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5309   Size = SemaRef.ActOnConstantExpression(Size);
5310   if (Size.isInvalid())
5311     return QualType();
5312 
5313   QualType Result = TL.getType();
5314   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5315       Size.get() != T->getSizeExpr()) {
5316     Result = getDerived().RebuildDependentVectorType(
5317         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5318     if (Result.isNull())
5319       return QualType();
5320   }
5321 
5322   // Result might be dependent or not.
5323   if (isa<DependentVectorType>(Result)) {
5324     DependentVectorTypeLoc NewTL =
5325         TLB.push<DependentVectorTypeLoc>(Result);
5326     NewTL.setNameLoc(TL.getNameLoc());
5327   } else {
5328     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5329     NewTL.setNameLoc(TL.getNameLoc());
5330   }
5331 
5332   return Result;
5333 }
5334 
5335 template<typename Derived>
5336 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5337                                       TypeLocBuilder &TLB,
5338                                       DependentSizedExtVectorTypeLoc TL) {
5339   const DependentSizedExtVectorType *T = TL.getTypePtr();
5340 
5341   // FIXME: ext vector locs should be nested
5342   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5343   if (ElementType.isNull())
5344     return QualType();
5345 
5346   // Vector sizes are constant expressions.
5347   EnterExpressionEvaluationContext Unevaluated(
5348       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5349 
5350   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5351   Size = SemaRef.ActOnConstantExpression(Size);
5352   if (Size.isInvalid())
5353     return QualType();
5354 
5355   QualType Result = TL.getType();
5356   if (getDerived().AlwaysRebuild() ||
5357       ElementType != T->getElementType() ||
5358       Size.get() != T->getSizeExpr()) {
5359     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5360                                                              Size.get(),
5361                                                          T->getAttributeLoc());
5362     if (Result.isNull())
5363       return QualType();
5364   }
5365 
5366   // Result might be dependent or not.
5367   if (isa<DependentSizedExtVectorType>(Result)) {
5368     DependentSizedExtVectorTypeLoc NewTL
5369       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5370     NewTL.setNameLoc(TL.getNameLoc());
5371   } else {
5372     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5373     NewTL.setNameLoc(TL.getNameLoc());
5374   }
5375 
5376   return Result;
5377 }
5378 
5379 template <typename Derived>
5380 QualType
5381 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5382                                                     ConstantMatrixTypeLoc TL) {
5383   const ConstantMatrixType *T = TL.getTypePtr();
5384   QualType ElementType = getDerived().TransformType(T->getElementType());
5385   if (ElementType.isNull())
5386     return QualType();
5387 
5388   QualType Result = TL.getType();
5389   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5390     Result = getDerived().RebuildConstantMatrixType(
5391         ElementType, T->getNumRows(), T->getNumColumns());
5392     if (Result.isNull())
5393       return QualType();
5394   }
5395 
5396   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5397   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5398   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5399   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5400   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5401 
5402   return Result;
5403 }
5404 
5405 template <typename Derived>
5406 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5407     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5408   const DependentSizedMatrixType *T = TL.getTypePtr();
5409 
5410   QualType ElementType = getDerived().TransformType(T->getElementType());
5411   if (ElementType.isNull()) {
5412     return QualType();
5413   }
5414 
5415   // Matrix dimensions are constant expressions.
5416   EnterExpressionEvaluationContext Unevaluated(
5417       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5418 
5419   Expr *origRows = TL.getAttrRowOperand();
5420   if (!origRows)
5421     origRows = T->getRowExpr();
5422   Expr *origColumns = TL.getAttrColumnOperand();
5423   if (!origColumns)
5424     origColumns = T->getColumnExpr();
5425 
5426   ExprResult rowResult = getDerived().TransformExpr(origRows);
5427   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5428   if (rowResult.isInvalid())
5429     return QualType();
5430 
5431   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5432   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5433   if (columnResult.isInvalid())
5434     return QualType();
5435 
5436   Expr *rows = rowResult.get();
5437   Expr *columns = columnResult.get();
5438 
5439   QualType Result = TL.getType();
5440   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5441       rows != origRows || columns != origColumns) {
5442     Result = getDerived().RebuildDependentSizedMatrixType(
5443         ElementType, rows, columns, T->getAttributeLoc());
5444 
5445     if (Result.isNull())
5446       return QualType();
5447   }
5448 
5449   // We might have any sort of matrix type now, but fortunately they
5450   // all have the same location layout.
5451   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5452   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5453   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5454   NewTL.setAttrRowOperand(rows);
5455   NewTL.setAttrColumnOperand(columns);
5456   return Result;
5457 }
5458 
5459 template <typename Derived>
5460 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5461     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5462   const DependentAddressSpaceType *T = TL.getTypePtr();
5463 
5464   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5465 
5466   if (pointeeType.isNull())
5467     return QualType();
5468 
5469   // Address spaces are constant expressions.
5470   EnterExpressionEvaluationContext Unevaluated(
5471       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5472 
5473   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5474   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5475   if (AddrSpace.isInvalid())
5476     return QualType();
5477 
5478   QualType Result = TL.getType();
5479   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5480       AddrSpace.get() != T->getAddrSpaceExpr()) {
5481     Result = getDerived().RebuildDependentAddressSpaceType(
5482         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5483     if (Result.isNull())
5484       return QualType();
5485   }
5486 
5487   // Result might be dependent or not.
5488   if (isa<DependentAddressSpaceType>(Result)) {
5489     DependentAddressSpaceTypeLoc NewTL =
5490         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5491 
5492     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5493     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5494     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5495 
5496   } else {
5497     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5498         Result, getDerived().getBaseLocation());
5499     TransformType(TLB, DI->getTypeLoc());
5500   }
5501 
5502   return Result;
5503 }
5504 
5505 template <typename Derived>
5506 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5507                                                      VectorTypeLoc TL) {
5508   const VectorType *T = TL.getTypePtr();
5509   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5510   if (ElementType.isNull())
5511     return QualType();
5512 
5513   QualType Result = TL.getType();
5514   if (getDerived().AlwaysRebuild() ||
5515       ElementType != T->getElementType()) {
5516     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5517                                             T->getVectorKind());
5518     if (Result.isNull())
5519       return QualType();
5520   }
5521 
5522   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5523   NewTL.setNameLoc(TL.getNameLoc());
5524 
5525   return Result;
5526 }
5527 
5528 template<typename Derived>
5529 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5530                                                         ExtVectorTypeLoc TL) {
5531   const VectorType *T = TL.getTypePtr();
5532   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5533   if (ElementType.isNull())
5534     return QualType();
5535 
5536   QualType Result = TL.getType();
5537   if (getDerived().AlwaysRebuild() ||
5538       ElementType != T->getElementType()) {
5539     Result = getDerived().RebuildExtVectorType(ElementType,
5540                                                T->getNumElements(),
5541                                                /*FIXME*/ SourceLocation());
5542     if (Result.isNull())
5543       return QualType();
5544   }
5545 
5546   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5547   NewTL.setNameLoc(TL.getNameLoc());
5548 
5549   return Result;
5550 }
5551 
5552 template <typename Derived>
5553 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5554     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5555     bool ExpectParameterPack) {
5556   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5557   TypeSourceInfo *NewDI = nullptr;
5558 
5559   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5560     // If we're substituting into a pack expansion type and we know the
5561     // length we want to expand to, just substitute for the pattern.
5562     TypeLoc OldTL = OldDI->getTypeLoc();
5563     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5564 
5565     TypeLocBuilder TLB;
5566     TypeLoc NewTL = OldDI->getTypeLoc();
5567     TLB.reserve(NewTL.getFullDataSize());
5568 
5569     QualType Result = getDerived().TransformType(TLB,
5570                                                OldExpansionTL.getPatternLoc());
5571     if (Result.isNull())
5572       return nullptr;
5573 
5574     Result = RebuildPackExpansionType(Result,
5575                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5576                                       OldExpansionTL.getEllipsisLoc(),
5577                                       NumExpansions);
5578     if (Result.isNull())
5579       return nullptr;
5580 
5581     PackExpansionTypeLoc NewExpansionTL
5582       = TLB.push<PackExpansionTypeLoc>(Result);
5583     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5584     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5585   } else
5586     NewDI = getDerived().TransformType(OldDI);
5587   if (!NewDI)
5588     return nullptr;
5589 
5590   if (NewDI == OldDI && indexAdjustment == 0)
5591     return OldParm;
5592 
5593   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5594                                              OldParm->getDeclContext(),
5595                                              OldParm->getInnerLocStart(),
5596                                              OldParm->getLocation(),
5597                                              OldParm->getIdentifier(),
5598                                              NewDI->getType(),
5599                                              NewDI,
5600                                              OldParm->getStorageClass(),
5601                                              /* DefArg */ nullptr);
5602   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5603                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5604   transformedLocalDecl(OldParm, {newParm});
5605   return newParm;
5606 }
5607 
5608 template <typename Derived>
5609 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5610     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5611     const QualType *ParamTypes,
5612     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5613     SmallVectorImpl<QualType> &OutParamTypes,
5614     SmallVectorImpl<ParmVarDecl *> *PVars,
5615     Sema::ExtParameterInfoBuilder &PInfos) {
5616   int indexAdjustment = 0;
5617 
5618   unsigned NumParams = Params.size();
5619   for (unsigned i = 0; i != NumParams; ++i) {
5620     if (ParmVarDecl *OldParm = Params[i]) {
5621       assert(OldParm->getFunctionScopeIndex() == i);
5622 
5623       Optional<unsigned> NumExpansions;
5624       ParmVarDecl *NewParm = nullptr;
5625       if (OldParm->isParameterPack()) {
5626         // We have a function parameter pack that may need to be expanded.
5627         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5628 
5629         // Find the parameter packs that could be expanded.
5630         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5631         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5632         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5633         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5634 
5635         // Determine whether we should expand the parameter packs.
5636         bool ShouldExpand = false;
5637         bool RetainExpansion = false;
5638         Optional<unsigned> OrigNumExpansions;
5639         if (Unexpanded.size() > 0) {
5640           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5641           NumExpansions = OrigNumExpansions;
5642           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5643                                                    Pattern.getSourceRange(),
5644                                                    Unexpanded,
5645                                                    ShouldExpand,
5646                                                    RetainExpansion,
5647                                                    NumExpansions)) {
5648             return true;
5649           }
5650         } else {
5651 #ifndef NDEBUG
5652           const AutoType *AT =
5653               Pattern.getType().getTypePtr()->getContainedAutoType();
5654           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5655                  "Could not find parameter packs or undeduced auto type!");
5656 #endif
5657         }
5658 
5659         if (ShouldExpand) {
5660           // Expand the function parameter pack into multiple, separate
5661           // parameters.
5662           getDerived().ExpandingFunctionParameterPack(OldParm);
5663           for (unsigned I = 0; I != *NumExpansions; ++I) {
5664             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5665             ParmVarDecl *NewParm
5666               = getDerived().TransformFunctionTypeParam(OldParm,
5667                                                         indexAdjustment++,
5668                                                         OrigNumExpansions,
5669                                                 /*ExpectParameterPack=*/false);
5670             if (!NewParm)
5671               return true;
5672 
5673             if (ParamInfos)
5674               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5675             OutParamTypes.push_back(NewParm->getType());
5676             if (PVars)
5677               PVars->push_back(NewParm);
5678           }
5679 
5680           // If we're supposed to retain a pack expansion, do so by temporarily
5681           // forgetting the partially-substituted parameter pack.
5682           if (RetainExpansion) {
5683             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5684             ParmVarDecl *NewParm
5685               = getDerived().TransformFunctionTypeParam(OldParm,
5686                                                         indexAdjustment++,
5687                                                         OrigNumExpansions,
5688                                                 /*ExpectParameterPack=*/false);
5689             if (!NewParm)
5690               return true;
5691 
5692             if (ParamInfos)
5693               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5694             OutParamTypes.push_back(NewParm->getType());
5695             if (PVars)
5696               PVars->push_back(NewParm);
5697           }
5698 
5699           // The next parameter should have the same adjustment as the
5700           // last thing we pushed, but we post-incremented indexAdjustment
5701           // on every push.  Also, if we push nothing, the adjustment should
5702           // go down by one.
5703           indexAdjustment--;
5704 
5705           // We're done with the pack expansion.
5706           continue;
5707         }
5708 
5709         // We'll substitute the parameter now without expanding the pack
5710         // expansion.
5711         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5712         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5713                                                           indexAdjustment,
5714                                                           NumExpansions,
5715                                                   /*ExpectParameterPack=*/true);
5716         assert(NewParm->isParameterPack() &&
5717                "Parameter pack no longer a parameter pack after "
5718                "transformation.");
5719       } else {
5720         NewParm = getDerived().TransformFunctionTypeParam(
5721             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5722       }
5723 
5724       if (!NewParm)
5725         return true;
5726 
5727       if (ParamInfos)
5728         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5729       OutParamTypes.push_back(NewParm->getType());
5730       if (PVars)
5731         PVars->push_back(NewParm);
5732       continue;
5733     }
5734 
5735     // Deal with the possibility that we don't have a parameter
5736     // declaration for this parameter.
5737     QualType OldType = ParamTypes[i];
5738     bool IsPackExpansion = false;
5739     Optional<unsigned> NumExpansions;
5740     QualType NewType;
5741     if (const PackExpansionType *Expansion
5742                                        = dyn_cast<PackExpansionType>(OldType)) {
5743       // We have a function parameter pack that may need to be expanded.
5744       QualType Pattern = Expansion->getPattern();
5745       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5746       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5747 
5748       // Determine whether we should expand the parameter packs.
5749       bool ShouldExpand = false;
5750       bool RetainExpansion = false;
5751       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5752                                                Unexpanded,
5753                                                ShouldExpand,
5754                                                RetainExpansion,
5755                                                NumExpansions)) {
5756         return true;
5757       }
5758 
5759       if (ShouldExpand) {
5760         // Expand the function parameter pack into multiple, separate
5761         // parameters.
5762         for (unsigned I = 0; I != *NumExpansions; ++I) {
5763           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5764           QualType NewType = getDerived().TransformType(Pattern);
5765           if (NewType.isNull())
5766             return true;
5767 
5768           if (NewType->containsUnexpandedParameterPack()) {
5769             NewType =
5770                 getSema().getASTContext().getPackExpansionType(NewType, None);
5771 
5772             if (NewType.isNull())
5773               return true;
5774           }
5775 
5776           if (ParamInfos)
5777             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5778           OutParamTypes.push_back(NewType);
5779           if (PVars)
5780             PVars->push_back(nullptr);
5781         }
5782 
5783         // We're done with the pack expansion.
5784         continue;
5785       }
5786 
5787       // If we're supposed to retain a pack expansion, do so by temporarily
5788       // forgetting the partially-substituted parameter pack.
5789       if (RetainExpansion) {
5790         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5791         QualType NewType = getDerived().TransformType(Pattern);
5792         if (NewType.isNull())
5793           return true;
5794 
5795         if (ParamInfos)
5796           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5797         OutParamTypes.push_back(NewType);
5798         if (PVars)
5799           PVars->push_back(nullptr);
5800       }
5801 
5802       // We'll substitute the parameter now without expanding the pack
5803       // expansion.
5804       OldType = Expansion->getPattern();
5805       IsPackExpansion = true;
5806       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5807       NewType = getDerived().TransformType(OldType);
5808     } else {
5809       NewType = getDerived().TransformType(OldType);
5810     }
5811 
5812     if (NewType.isNull())
5813       return true;
5814 
5815     if (IsPackExpansion)
5816       NewType = getSema().Context.getPackExpansionType(NewType,
5817                                                        NumExpansions);
5818 
5819     if (ParamInfos)
5820       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5821     OutParamTypes.push_back(NewType);
5822     if (PVars)
5823       PVars->push_back(nullptr);
5824   }
5825 
5826 #ifndef NDEBUG
5827   if (PVars) {
5828     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5829       if (ParmVarDecl *parm = (*PVars)[i])
5830         assert(parm->getFunctionScopeIndex() == i);
5831   }
5832 #endif
5833 
5834   return false;
5835 }
5836 
5837 template<typename Derived>
5838 QualType
5839 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5840                                                    FunctionProtoTypeLoc TL) {
5841   SmallVector<QualType, 4> ExceptionStorage;
5842   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5843   return getDerived().TransformFunctionProtoType(
5844       TLB, TL, nullptr, Qualifiers(),
5845       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5846         return This->getDerived().TransformExceptionSpec(
5847             TL.getBeginLoc(), ESI, ExceptionStorage, Changed);
5848       });
5849 }
5850 
5851 template<typename Derived> template<typename Fn>
5852 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5853     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5854     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5855 
5856   // Transform the parameters and return type.
5857   //
5858   // We are required to instantiate the params and return type in source order.
5859   // When the function has a trailing return type, we instantiate the
5860   // parameters before the return type,  since the return type can then refer
5861   // to the parameters themselves (via decltype, sizeof, etc.).
5862   //
5863   SmallVector<QualType, 4> ParamTypes;
5864   SmallVector<ParmVarDecl*, 4> ParamDecls;
5865   Sema::ExtParameterInfoBuilder ExtParamInfos;
5866   const FunctionProtoType *T = TL.getTypePtr();
5867 
5868   QualType ResultType;
5869 
5870   if (T->hasTrailingReturn()) {
5871     if (getDerived().TransformFunctionTypeParams(
5872             TL.getBeginLoc(), TL.getParams(),
5873             TL.getTypePtr()->param_type_begin(),
5874             T->getExtParameterInfosOrNull(),
5875             ParamTypes, &ParamDecls, ExtParamInfos))
5876       return QualType();
5877 
5878     {
5879       // C++11 [expr.prim.general]p3:
5880       //   If a declaration declares a member function or member function
5881       //   template of a class X, the expression this is a prvalue of type
5882       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5883       //   and the end of the function-definition, member-declarator, or
5884       //   declarator.
5885       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5886 
5887       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5888       if (ResultType.isNull())
5889         return QualType();
5890     }
5891   }
5892   else {
5893     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5894     if (ResultType.isNull())
5895       return QualType();
5896 
5897     if (getDerived().TransformFunctionTypeParams(
5898             TL.getBeginLoc(), TL.getParams(),
5899             TL.getTypePtr()->param_type_begin(),
5900             T->getExtParameterInfosOrNull(),
5901             ParamTypes, &ParamDecls, ExtParamInfos))
5902       return QualType();
5903   }
5904 
5905   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5906 
5907   bool EPIChanged = false;
5908   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5909     return QualType();
5910 
5911   // Handle extended parameter information.
5912   if (auto NewExtParamInfos =
5913         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5914     if (!EPI.ExtParameterInfos ||
5915         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5916           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5917       EPIChanged = true;
5918     }
5919     EPI.ExtParameterInfos = NewExtParamInfos;
5920   } else if (EPI.ExtParameterInfos) {
5921     EPIChanged = true;
5922     EPI.ExtParameterInfos = nullptr;
5923   }
5924 
5925   QualType Result = TL.getType();
5926   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5927       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5928     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5929     if (Result.isNull())
5930       return QualType();
5931   }
5932 
5933   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5934   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5935   NewTL.setLParenLoc(TL.getLParenLoc());
5936   NewTL.setRParenLoc(TL.getRParenLoc());
5937   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5938   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5939   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5940     NewTL.setParam(i, ParamDecls[i]);
5941 
5942   return Result;
5943 }
5944 
5945 template<typename Derived>
5946 bool TreeTransform<Derived>::TransformExceptionSpec(
5947     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5948     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5949   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5950 
5951   // Instantiate a dynamic noexcept expression, if any.
5952   if (isComputedNoexcept(ESI.Type)) {
5953     EnterExpressionEvaluationContext Unevaluated(
5954         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5955     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5956     if (NoexceptExpr.isInvalid())
5957       return true;
5958 
5959     ExceptionSpecificationType EST = ESI.Type;
5960     NoexceptExpr =
5961         getSema().ActOnNoexceptSpec(NoexceptExpr.get(), EST);
5962     if (NoexceptExpr.isInvalid())
5963       return true;
5964 
5965     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5966       Changed = true;
5967     ESI.NoexceptExpr = NoexceptExpr.get();
5968     ESI.Type = EST;
5969   }
5970 
5971   if (ESI.Type != EST_Dynamic)
5972     return false;
5973 
5974   // Instantiate a dynamic exception specification's type.
5975   for (QualType T : ESI.Exceptions) {
5976     if (const PackExpansionType *PackExpansion =
5977             T->getAs<PackExpansionType>()) {
5978       Changed = true;
5979 
5980       // We have a pack expansion. Instantiate it.
5981       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5982       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5983                                               Unexpanded);
5984       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5985 
5986       // Determine whether the set of unexpanded parameter packs can and
5987       // should
5988       // be expanded.
5989       bool Expand = false;
5990       bool RetainExpansion = false;
5991       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5992       // FIXME: Track the location of the ellipsis (and track source location
5993       // information for the types in the exception specification in general).
5994       if (getDerived().TryExpandParameterPacks(
5995               Loc, SourceRange(), Unexpanded, Expand,
5996               RetainExpansion, NumExpansions))
5997         return true;
5998 
5999       if (!Expand) {
6000         // We can't expand this pack expansion into separate arguments yet;
6001         // just substitute into the pattern and create a new pack expansion
6002         // type.
6003         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6004         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6005         if (U.isNull())
6006           return true;
6007 
6008         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
6009         Exceptions.push_back(U);
6010         continue;
6011       }
6012 
6013       // Substitute into the pack expansion pattern for each slice of the
6014       // pack.
6015       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6016         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6017 
6018         QualType U = getDerived().TransformType(PackExpansion->getPattern());
6019         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6020           return true;
6021 
6022         Exceptions.push_back(U);
6023       }
6024     } else {
6025       QualType U = getDerived().TransformType(T);
6026       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6027         return true;
6028       if (T != U)
6029         Changed = true;
6030 
6031       Exceptions.push_back(U);
6032     }
6033   }
6034 
6035   ESI.Exceptions = Exceptions;
6036   if (ESI.Exceptions.empty())
6037     ESI.Type = EST_DynamicNone;
6038   return false;
6039 }
6040 
6041 template<typename Derived>
6042 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6043                                                  TypeLocBuilder &TLB,
6044                                                  FunctionNoProtoTypeLoc TL) {
6045   const FunctionNoProtoType *T = TL.getTypePtr();
6046   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6047   if (ResultType.isNull())
6048     return QualType();
6049 
6050   QualType Result = TL.getType();
6051   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6052     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6053 
6054   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6055   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6056   NewTL.setLParenLoc(TL.getLParenLoc());
6057   NewTL.setRParenLoc(TL.getRParenLoc());
6058   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6059 
6060   return Result;
6061 }
6062 
6063 template<typename Derived> QualType
6064 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
6065                                                  UnresolvedUsingTypeLoc TL) {
6066   const UnresolvedUsingType *T = TL.getTypePtr();
6067   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6068   if (!D)
6069     return QualType();
6070 
6071   QualType Result = TL.getType();
6072   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6073     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6074     if (Result.isNull())
6075       return QualType();
6076   }
6077 
6078   // We might get an arbitrary type spec type back.  We should at
6079   // least always get a type spec type, though.
6080   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6081   NewTL.setNameLoc(TL.getNameLoc());
6082 
6083   return Result;
6084 }
6085 
6086 template<typename Derived>
6087 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6088                                                       TypedefTypeLoc TL) {
6089   const TypedefType *T = TL.getTypePtr();
6090   TypedefNameDecl *Typedef
6091     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6092                                                                T->getDecl()));
6093   if (!Typedef)
6094     return QualType();
6095 
6096   QualType Result = TL.getType();
6097   if (getDerived().AlwaysRebuild() ||
6098       Typedef != T->getDecl()) {
6099     Result = getDerived().RebuildTypedefType(Typedef);
6100     if (Result.isNull())
6101       return QualType();
6102   }
6103 
6104   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6105   NewTL.setNameLoc(TL.getNameLoc());
6106 
6107   return Result;
6108 }
6109 
6110 template<typename Derived>
6111 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6112                                                       TypeOfExprTypeLoc TL) {
6113   // typeof expressions are not potentially evaluated contexts
6114   EnterExpressionEvaluationContext Unevaluated(
6115       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6116       Sema::ReuseLambdaContextDecl);
6117 
6118   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6119   if (E.isInvalid())
6120     return QualType();
6121 
6122   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6123   if (E.isInvalid())
6124     return QualType();
6125 
6126   QualType Result = TL.getType();
6127   if (getDerived().AlwaysRebuild() ||
6128       E.get() != TL.getUnderlyingExpr()) {
6129     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6130     if (Result.isNull())
6131       return QualType();
6132   }
6133   else E.get();
6134 
6135   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6136   NewTL.setTypeofLoc(TL.getTypeofLoc());
6137   NewTL.setLParenLoc(TL.getLParenLoc());
6138   NewTL.setRParenLoc(TL.getRParenLoc());
6139 
6140   return Result;
6141 }
6142 
6143 template<typename Derived>
6144 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6145                                                      TypeOfTypeLoc TL) {
6146   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6147   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6148   if (!New_Under_TI)
6149     return QualType();
6150 
6151   QualType Result = TL.getType();
6152   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6153     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6154     if (Result.isNull())
6155       return QualType();
6156   }
6157 
6158   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6159   NewTL.setTypeofLoc(TL.getTypeofLoc());
6160   NewTL.setLParenLoc(TL.getLParenLoc());
6161   NewTL.setRParenLoc(TL.getRParenLoc());
6162   NewTL.setUnderlyingTInfo(New_Under_TI);
6163 
6164   return Result;
6165 }
6166 
6167 template<typename Derived>
6168 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6169                                                        DecltypeTypeLoc TL) {
6170   const DecltypeType *T = TL.getTypePtr();
6171 
6172   // decltype expressions are not potentially evaluated contexts
6173   EnterExpressionEvaluationContext Unevaluated(
6174       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6175       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6176 
6177   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6178   if (E.isInvalid())
6179     return QualType();
6180 
6181   E = getSema().ActOnDecltypeExpression(E.get());
6182   if (E.isInvalid())
6183     return QualType();
6184 
6185   QualType Result = TL.getType();
6186   if (getDerived().AlwaysRebuild() ||
6187       E.get() != T->getUnderlyingExpr()) {
6188     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6189     if (Result.isNull())
6190       return QualType();
6191   }
6192   else E.get();
6193 
6194   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6195   NewTL.setNameLoc(TL.getNameLoc());
6196 
6197   return Result;
6198 }
6199 
6200 template<typename Derived>
6201 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6202                                                             TypeLocBuilder &TLB,
6203                                                      UnaryTransformTypeLoc TL) {
6204   QualType Result = TL.getType();
6205   if (Result->isDependentType()) {
6206     const UnaryTransformType *T = TL.getTypePtr();
6207     QualType NewBase =
6208       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6209     Result = getDerived().RebuildUnaryTransformType(NewBase,
6210                                                     T->getUTTKind(),
6211                                                     TL.getKWLoc());
6212     if (Result.isNull())
6213       return QualType();
6214   }
6215 
6216   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6217   NewTL.setKWLoc(TL.getKWLoc());
6218   NewTL.setParensRange(TL.getParensRange());
6219   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6220   return Result;
6221 }
6222 
6223 template<typename Derived>
6224 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6225     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6226   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6227 
6228   CXXScopeSpec SS;
6229   TemplateName TemplateName = getDerived().TransformTemplateName(
6230       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6231   if (TemplateName.isNull())
6232     return QualType();
6233 
6234   QualType OldDeduced = T->getDeducedType();
6235   QualType NewDeduced;
6236   if (!OldDeduced.isNull()) {
6237     NewDeduced = getDerived().TransformType(OldDeduced);
6238     if (NewDeduced.isNull())
6239       return QualType();
6240   }
6241 
6242   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6243       TemplateName, NewDeduced);
6244   if (Result.isNull())
6245     return QualType();
6246 
6247   DeducedTemplateSpecializationTypeLoc NewTL =
6248       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6249   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6250 
6251   return Result;
6252 }
6253 
6254 template<typename Derived>
6255 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6256                                                      RecordTypeLoc TL) {
6257   const RecordType *T = TL.getTypePtr();
6258   RecordDecl *Record
6259     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6260                                                           T->getDecl()));
6261   if (!Record)
6262     return QualType();
6263 
6264   QualType Result = TL.getType();
6265   if (getDerived().AlwaysRebuild() ||
6266       Record != T->getDecl()) {
6267     Result = getDerived().RebuildRecordType(Record);
6268     if (Result.isNull())
6269       return QualType();
6270   }
6271 
6272   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6273   NewTL.setNameLoc(TL.getNameLoc());
6274 
6275   return Result;
6276 }
6277 
6278 template<typename Derived>
6279 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6280                                                    EnumTypeLoc TL) {
6281   const EnumType *T = TL.getTypePtr();
6282   EnumDecl *Enum
6283     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6284                                                         T->getDecl()));
6285   if (!Enum)
6286     return QualType();
6287 
6288   QualType Result = TL.getType();
6289   if (getDerived().AlwaysRebuild() ||
6290       Enum != T->getDecl()) {
6291     Result = getDerived().RebuildEnumType(Enum);
6292     if (Result.isNull())
6293       return QualType();
6294   }
6295 
6296   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6297   NewTL.setNameLoc(TL.getNameLoc());
6298 
6299   return Result;
6300 }
6301 
6302 template<typename Derived>
6303 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6304                                          TypeLocBuilder &TLB,
6305                                          InjectedClassNameTypeLoc TL) {
6306   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6307                                        TL.getTypePtr()->getDecl());
6308   if (!D) return QualType();
6309 
6310   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6311   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6312   return T;
6313 }
6314 
6315 template<typename Derived>
6316 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6317                                                 TypeLocBuilder &TLB,
6318                                                 TemplateTypeParmTypeLoc TL) {
6319   return TransformTypeSpecType(TLB, TL);
6320 }
6321 
6322 template<typename Derived>
6323 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6324                                          TypeLocBuilder &TLB,
6325                                          SubstTemplateTypeParmTypeLoc TL) {
6326   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6327 
6328   // Substitute into the replacement type, which itself might involve something
6329   // that needs to be transformed. This only tends to occur with default
6330   // template arguments of template template parameters.
6331   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6332   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6333   if (Replacement.isNull())
6334     return QualType();
6335 
6336   // Always canonicalize the replacement type.
6337   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6338   QualType Result
6339     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6340                                                    Replacement);
6341 
6342   // Propagate type-source information.
6343   SubstTemplateTypeParmTypeLoc NewTL
6344     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6345   NewTL.setNameLoc(TL.getNameLoc());
6346   return Result;
6347 
6348 }
6349 
6350 template<typename Derived>
6351 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6352                                           TypeLocBuilder &TLB,
6353                                           SubstTemplateTypeParmPackTypeLoc TL) {
6354   return TransformTypeSpecType(TLB, TL);
6355 }
6356 
6357 template<typename Derived>
6358 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6359                                                         TypeLocBuilder &TLB,
6360                                            TemplateSpecializationTypeLoc TL) {
6361   const TemplateSpecializationType *T = TL.getTypePtr();
6362 
6363   // The nested-name-specifier never matters in a TemplateSpecializationType,
6364   // because we can't have a dependent nested-name-specifier anyway.
6365   CXXScopeSpec SS;
6366   TemplateName Template
6367     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6368                                          TL.getTemplateNameLoc());
6369   if (Template.isNull())
6370     return QualType();
6371 
6372   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6373 }
6374 
6375 template<typename Derived>
6376 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6377                                                      AtomicTypeLoc TL) {
6378   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6379   if (ValueType.isNull())
6380     return QualType();
6381 
6382   QualType Result = TL.getType();
6383   if (getDerived().AlwaysRebuild() ||
6384       ValueType != TL.getValueLoc().getType()) {
6385     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6386     if (Result.isNull())
6387       return QualType();
6388   }
6389 
6390   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6391   NewTL.setKWLoc(TL.getKWLoc());
6392   NewTL.setLParenLoc(TL.getLParenLoc());
6393   NewTL.setRParenLoc(TL.getRParenLoc());
6394 
6395   return Result;
6396 }
6397 
6398 template <typename Derived>
6399 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6400                                                    PipeTypeLoc TL) {
6401   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6402   if (ValueType.isNull())
6403     return QualType();
6404 
6405   QualType Result = TL.getType();
6406   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6407     const PipeType *PT = Result->castAs<PipeType>();
6408     bool isReadPipe = PT->isReadOnly();
6409     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6410     if (Result.isNull())
6411       return QualType();
6412   }
6413 
6414   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6415   NewTL.setKWLoc(TL.getKWLoc());
6416 
6417   return Result;
6418 }
6419 
6420 template <typename Derived>
6421 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6422                                                      ExtIntTypeLoc TL) {
6423   const ExtIntType *EIT = TL.getTypePtr();
6424   QualType Result = TL.getType();
6425 
6426   if (getDerived().AlwaysRebuild()) {
6427     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6428                                             EIT->getNumBits(), TL.getNameLoc());
6429     if (Result.isNull())
6430       return QualType();
6431   }
6432 
6433   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6434   NewTL.setNameLoc(TL.getNameLoc());
6435   return Result;
6436 }
6437 
6438 template <typename Derived>
6439 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6440     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6441   const DependentExtIntType *EIT = TL.getTypePtr();
6442 
6443   EnterExpressionEvaluationContext Unevaluated(
6444       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6445   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6446   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6447 
6448   if (BitsExpr.isInvalid())
6449     return QualType();
6450 
6451   QualType Result = TL.getType();
6452 
6453   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6454     Result = getDerived().RebuildDependentExtIntType(
6455         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6456 
6457     if (Result.isNull())
6458       return QualType();
6459   }
6460 
6461   if (isa<DependentExtIntType>(Result)) {
6462     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6463     NewTL.setNameLoc(TL.getNameLoc());
6464   } else {
6465     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6466     NewTL.setNameLoc(TL.getNameLoc());
6467   }
6468   return Result;
6469 }
6470 
6471   /// Simple iterator that traverses the template arguments in a
6472   /// container that provides a \c getArgLoc() member function.
6473   ///
6474   /// This iterator is intended to be used with the iterator form of
6475   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6476   template<typename ArgLocContainer>
6477   class TemplateArgumentLocContainerIterator {
6478     ArgLocContainer *Container;
6479     unsigned Index;
6480 
6481   public:
6482     typedef TemplateArgumentLoc value_type;
6483     typedef TemplateArgumentLoc reference;
6484     typedef int difference_type;
6485     typedef std::input_iterator_tag iterator_category;
6486 
6487     class pointer {
6488       TemplateArgumentLoc Arg;
6489 
6490     public:
6491       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6492 
6493       const TemplateArgumentLoc *operator->() const {
6494         return &Arg;
6495       }
6496     };
6497 
6498 
6499     TemplateArgumentLocContainerIterator() {}
6500 
6501     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6502                                  unsigned Index)
6503       : Container(&Container), Index(Index) { }
6504 
6505     TemplateArgumentLocContainerIterator &operator++() {
6506       ++Index;
6507       return *this;
6508     }
6509 
6510     TemplateArgumentLocContainerIterator operator++(int) {
6511       TemplateArgumentLocContainerIterator Old(*this);
6512       ++(*this);
6513       return Old;
6514     }
6515 
6516     TemplateArgumentLoc operator*() const {
6517       return Container->getArgLoc(Index);
6518     }
6519 
6520     pointer operator->() const {
6521       return pointer(Container->getArgLoc(Index));
6522     }
6523 
6524     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6525                            const TemplateArgumentLocContainerIterator &Y) {
6526       return X.Container == Y.Container && X.Index == Y.Index;
6527     }
6528 
6529     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6530                            const TemplateArgumentLocContainerIterator &Y) {
6531       return !(X == Y);
6532     }
6533   };
6534 
6535 template<typename Derived>
6536 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6537                                                    AutoTypeLoc TL) {
6538   const AutoType *T = TL.getTypePtr();
6539   QualType OldDeduced = T->getDeducedType();
6540   QualType NewDeduced;
6541   if (!OldDeduced.isNull()) {
6542     NewDeduced = getDerived().TransformType(OldDeduced);
6543     if (NewDeduced.isNull())
6544       return QualType();
6545   }
6546 
6547   ConceptDecl *NewCD = nullptr;
6548   TemplateArgumentListInfo NewTemplateArgs;
6549   NestedNameSpecifierLoc NewNestedNameSpec;
6550   if (T->isConstrained()) {
6551     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6552         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6553 
6554     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6555     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6556     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6557     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6558                                                 ArgIterator(TL,
6559                                                             TL.getNumArgs()),
6560                                                 NewTemplateArgs))
6561       return QualType();
6562 
6563     if (TL.getNestedNameSpecifierLoc()) {
6564       NewNestedNameSpec
6565         = getDerived().TransformNestedNameSpecifierLoc(
6566             TL.getNestedNameSpecifierLoc());
6567       if (!NewNestedNameSpec)
6568         return QualType();
6569     }
6570   }
6571 
6572   QualType Result = TL.getType();
6573   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6574       T->isDependentType() || T->isConstrained()) {
6575     // FIXME: Maybe don't rebuild if all template arguments are the same.
6576     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6577     NewArgList.reserve(NewArgList.size());
6578     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6579       NewArgList.push_back(ArgLoc.getArgument());
6580     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6581                                           NewArgList);
6582     if (Result.isNull())
6583       return QualType();
6584   }
6585 
6586   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6587   NewTL.setNameLoc(TL.getNameLoc());
6588   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6589   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6590   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6591   NewTL.setFoundDecl(TL.getFoundDecl());
6592   NewTL.setLAngleLoc(TL.getLAngleLoc());
6593   NewTL.setRAngleLoc(TL.getRAngleLoc());
6594   for (unsigned I = 0; I < NewTL.getNumArgs(); ++I)
6595     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6596 
6597   return Result;
6598 }
6599 
6600 template <typename Derived>
6601 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6602                                                         TypeLocBuilder &TLB,
6603                                            TemplateSpecializationTypeLoc TL,
6604                                                       TemplateName Template) {
6605   TemplateArgumentListInfo NewTemplateArgs;
6606   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6607   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6608   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6609     ArgIterator;
6610   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6611                                               ArgIterator(TL, TL.getNumArgs()),
6612                                               NewTemplateArgs))
6613     return QualType();
6614 
6615   // FIXME: maybe don't rebuild if all the template arguments are the same.
6616 
6617   QualType Result =
6618     getDerived().RebuildTemplateSpecializationType(Template,
6619                                                    TL.getTemplateNameLoc(),
6620                                                    NewTemplateArgs);
6621 
6622   if (!Result.isNull()) {
6623     // Specializations of template template parameters are represented as
6624     // TemplateSpecializationTypes, and substitution of type alias templates
6625     // within a dependent context can transform them into
6626     // DependentTemplateSpecializationTypes.
6627     if (isa<DependentTemplateSpecializationType>(Result)) {
6628       DependentTemplateSpecializationTypeLoc NewTL
6629         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6630       NewTL.setElaboratedKeywordLoc(SourceLocation());
6631       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6632       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6633       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6634       NewTL.setLAngleLoc(TL.getLAngleLoc());
6635       NewTL.setRAngleLoc(TL.getRAngleLoc());
6636       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6637         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6638       return Result;
6639     }
6640 
6641     TemplateSpecializationTypeLoc NewTL
6642       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6643     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6644     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6645     NewTL.setLAngleLoc(TL.getLAngleLoc());
6646     NewTL.setRAngleLoc(TL.getRAngleLoc());
6647     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6648       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6649   }
6650 
6651   return Result;
6652 }
6653 
6654 template <typename Derived>
6655 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6656                                      TypeLocBuilder &TLB,
6657                                      DependentTemplateSpecializationTypeLoc TL,
6658                                      TemplateName Template,
6659                                      CXXScopeSpec &SS) {
6660   TemplateArgumentListInfo NewTemplateArgs;
6661   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6662   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6663   typedef TemplateArgumentLocContainerIterator<
6664             DependentTemplateSpecializationTypeLoc> ArgIterator;
6665   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6666                                               ArgIterator(TL, TL.getNumArgs()),
6667                                               NewTemplateArgs))
6668     return QualType();
6669 
6670   // FIXME: maybe don't rebuild if all the template arguments are the same.
6671 
6672   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6673     QualType Result
6674       = getSema().Context.getDependentTemplateSpecializationType(
6675                                                 TL.getTypePtr()->getKeyword(),
6676                                                          DTN->getQualifier(),
6677                                                          DTN->getIdentifier(),
6678                                                                NewTemplateArgs);
6679 
6680     DependentTemplateSpecializationTypeLoc NewTL
6681       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6682     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6683     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6684     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6685     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6686     NewTL.setLAngleLoc(TL.getLAngleLoc());
6687     NewTL.setRAngleLoc(TL.getRAngleLoc());
6688     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6689       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6690     return Result;
6691   }
6692 
6693   QualType Result
6694     = getDerived().RebuildTemplateSpecializationType(Template,
6695                                                      TL.getTemplateNameLoc(),
6696                                                      NewTemplateArgs);
6697 
6698   if (!Result.isNull()) {
6699     /// FIXME: Wrap this in an elaborated-type-specifier?
6700     TemplateSpecializationTypeLoc NewTL
6701       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6702     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6703     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6704     NewTL.setLAngleLoc(TL.getLAngleLoc());
6705     NewTL.setRAngleLoc(TL.getRAngleLoc());
6706     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6707       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6708   }
6709 
6710   return Result;
6711 }
6712 
6713 template<typename Derived>
6714 QualType
6715 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6716                                                 ElaboratedTypeLoc TL) {
6717   const ElaboratedType *T = TL.getTypePtr();
6718 
6719   NestedNameSpecifierLoc QualifierLoc;
6720   // NOTE: the qualifier in an ElaboratedType is optional.
6721   if (TL.getQualifierLoc()) {
6722     QualifierLoc
6723       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6724     if (!QualifierLoc)
6725       return QualType();
6726   }
6727 
6728   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6729   if (NamedT.isNull())
6730     return QualType();
6731 
6732   // C++0x [dcl.type.elab]p2:
6733   //   If the identifier resolves to a typedef-name or the simple-template-id
6734   //   resolves to an alias template specialization, the
6735   //   elaborated-type-specifier is ill-formed.
6736   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6737     if (const TemplateSpecializationType *TST =
6738           NamedT->getAs<TemplateSpecializationType>()) {
6739       TemplateName Template = TST->getTemplateName();
6740       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6741               Template.getAsTemplateDecl())) {
6742         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6743                      diag::err_tag_reference_non_tag)
6744             << TAT << Sema::NTK_TypeAliasTemplate
6745             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6746         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6747       }
6748     }
6749   }
6750 
6751   QualType Result = TL.getType();
6752   if (getDerived().AlwaysRebuild() ||
6753       QualifierLoc != TL.getQualifierLoc() ||
6754       NamedT != T->getNamedType()) {
6755     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6756                                                 T->getKeyword(),
6757                                                 QualifierLoc, NamedT);
6758     if (Result.isNull())
6759       return QualType();
6760   }
6761 
6762   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6763   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6764   NewTL.setQualifierLoc(QualifierLoc);
6765   return Result;
6766 }
6767 
6768 template<typename Derived>
6769 QualType TreeTransform<Derived>::TransformAttributedType(
6770                                                 TypeLocBuilder &TLB,
6771                                                 AttributedTypeLoc TL) {
6772   const AttributedType *oldType = TL.getTypePtr();
6773   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6774   if (modifiedType.isNull())
6775     return QualType();
6776 
6777   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6778   const Attr *oldAttr = TL.getAttr();
6779   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6780   if (oldAttr && !newAttr)
6781     return QualType();
6782 
6783   QualType result = TL.getType();
6784 
6785   // FIXME: dependent operand expressions?
6786   if (getDerived().AlwaysRebuild() ||
6787       modifiedType != oldType->getModifiedType()) {
6788     // TODO: this is really lame; we should really be rebuilding the
6789     // equivalent type from first principles.
6790     QualType equivalentType
6791       = getDerived().TransformType(oldType->getEquivalentType());
6792     if (equivalentType.isNull())
6793       return QualType();
6794 
6795     // Check whether we can add nullability; it is only represented as
6796     // type sugar, and therefore cannot be diagnosed in any other way.
6797     if (auto nullability = oldType->getImmediateNullability()) {
6798       if (!modifiedType->canHaveNullability()) {
6799         SemaRef.Diag(TL.getAttr()->getLocation(),
6800                      diag::err_nullability_nonpointer)
6801             << DiagNullabilityKind(*nullability, false) << modifiedType;
6802         return QualType();
6803       }
6804     }
6805 
6806     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6807                                                modifiedType,
6808                                                equivalentType);
6809   }
6810 
6811   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6812   newTL.setAttr(newAttr);
6813   return result;
6814 }
6815 
6816 template<typename Derived>
6817 QualType
6818 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6819                                            ParenTypeLoc TL) {
6820   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6821   if (Inner.isNull())
6822     return QualType();
6823 
6824   QualType Result = TL.getType();
6825   if (getDerived().AlwaysRebuild() ||
6826       Inner != TL.getInnerLoc().getType()) {
6827     Result = getDerived().RebuildParenType(Inner);
6828     if (Result.isNull())
6829       return QualType();
6830   }
6831 
6832   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6833   NewTL.setLParenLoc(TL.getLParenLoc());
6834   NewTL.setRParenLoc(TL.getRParenLoc());
6835   return Result;
6836 }
6837 
6838 template <typename Derived>
6839 QualType
6840 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6841                                                     MacroQualifiedTypeLoc TL) {
6842   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6843   if (Inner.isNull())
6844     return QualType();
6845 
6846   QualType Result = TL.getType();
6847   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6848     Result =
6849         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6850     if (Result.isNull())
6851       return QualType();
6852   }
6853 
6854   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6855   NewTL.setExpansionLoc(TL.getExpansionLoc());
6856   return Result;
6857 }
6858 
6859 template<typename Derived>
6860 QualType TreeTransform<Derived>::TransformDependentNameType(
6861     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6862   return TransformDependentNameType(TLB, TL, false);
6863 }
6864 
6865 template<typename Derived>
6866 QualType TreeTransform<Derived>::TransformDependentNameType(
6867     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6868   const DependentNameType *T = TL.getTypePtr();
6869 
6870   NestedNameSpecifierLoc QualifierLoc
6871     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6872   if (!QualifierLoc)
6873     return QualType();
6874 
6875   QualType Result
6876     = getDerived().RebuildDependentNameType(T->getKeyword(),
6877                                             TL.getElaboratedKeywordLoc(),
6878                                             QualifierLoc,
6879                                             T->getIdentifier(),
6880                                             TL.getNameLoc(),
6881                                             DeducedTSTContext);
6882   if (Result.isNull())
6883     return QualType();
6884 
6885   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6886     QualType NamedT = ElabT->getNamedType();
6887     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6888 
6889     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6890     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6891     NewTL.setQualifierLoc(QualifierLoc);
6892   } else {
6893     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6894     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6895     NewTL.setQualifierLoc(QualifierLoc);
6896     NewTL.setNameLoc(TL.getNameLoc());
6897   }
6898   return Result;
6899 }
6900 
6901 template<typename Derived>
6902 QualType TreeTransform<Derived>::
6903           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6904                                  DependentTemplateSpecializationTypeLoc TL) {
6905   NestedNameSpecifierLoc QualifierLoc;
6906   if (TL.getQualifierLoc()) {
6907     QualifierLoc
6908       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6909     if (!QualifierLoc)
6910       return QualType();
6911   }
6912 
6913   return getDerived()
6914            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6915 }
6916 
6917 template<typename Derived>
6918 QualType TreeTransform<Derived>::
6919 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6920                                    DependentTemplateSpecializationTypeLoc TL,
6921                                        NestedNameSpecifierLoc QualifierLoc) {
6922   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6923 
6924   TemplateArgumentListInfo NewTemplateArgs;
6925   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6926   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6927 
6928   typedef TemplateArgumentLocContainerIterator<
6929   DependentTemplateSpecializationTypeLoc> ArgIterator;
6930   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6931                                               ArgIterator(TL, TL.getNumArgs()),
6932                                               NewTemplateArgs))
6933     return QualType();
6934 
6935   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6936       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6937       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6938       /*AllowInjectedClassName*/ false);
6939   if (Result.isNull())
6940     return QualType();
6941 
6942   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6943     QualType NamedT = ElabT->getNamedType();
6944 
6945     // Copy information relevant to the template specialization.
6946     TemplateSpecializationTypeLoc NamedTL
6947       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6948     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6949     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6950     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6951     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6952     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6953       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6954 
6955     // Copy information relevant to the elaborated type.
6956     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6957     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6958     NewTL.setQualifierLoc(QualifierLoc);
6959   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6960     DependentTemplateSpecializationTypeLoc SpecTL
6961       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6962     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6963     SpecTL.setQualifierLoc(QualifierLoc);
6964     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6965     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6966     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6967     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6968     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6969       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6970   } else {
6971     TemplateSpecializationTypeLoc SpecTL
6972       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6973     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6974     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6975     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6976     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6977     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6978       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6979   }
6980   return Result;
6981 }
6982 
6983 template<typename Derived>
6984 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6985                                                       PackExpansionTypeLoc TL) {
6986   QualType Pattern
6987     = getDerived().TransformType(TLB, TL.getPatternLoc());
6988   if (Pattern.isNull())
6989     return QualType();
6990 
6991   QualType Result = TL.getType();
6992   if (getDerived().AlwaysRebuild() ||
6993       Pattern != TL.getPatternLoc().getType()) {
6994     Result = getDerived().RebuildPackExpansionType(Pattern,
6995                                            TL.getPatternLoc().getSourceRange(),
6996                                                    TL.getEllipsisLoc(),
6997                                            TL.getTypePtr()->getNumExpansions());
6998     if (Result.isNull())
6999       return QualType();
7000   }
7001 
7002   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
7003   NewT.setEllipsisLoc(TL.getEllipsisLoc());
7004   return Result;
7005 }
7006 
7007 template<typename Derived>
7008 QualType
7009 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
7010                                                    ObjCInterfaceTypeLoc TL) {
7011   // ObjCInterfaceType is never dependent.
7012   TLB.pushFullCopy(TL);
7013   return TL.getType();
7014 }
7015 
7016 template<typename Derived>
7017 QualType
7018 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
7019                                                    ObjCTypeParamTypeLoc TL) {
7020   const ObjCTypeParamType *T = TL.getTypePtr();
7021   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
7022       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7023   if (!OTP)
7024     return QualType();
7025 
7026   QualType Result = TL.getType();
7027   if (getDerived().AlwaysRebuild() ||
7028       OTP != T->getDecl()) {
7029     Result = getDerived().RebuildObjCTypeParamType(OTP,
7030                  TL.getProtocolLAngleLoc(),
7031                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7032                                     TL.getNumProtocols()),
7033                  TL.getProtocolLocs(),
7034                  TL.getProtocolRAngleLoc());
7035     if (Result.isNull())
7036       return QualType();
7037   }
7038 
7039   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7040   if (TL.getNumProtocols()) {
7041     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7042     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7043       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7044     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7045   }
7046   return Result;
7047 }
7048 
7049 template<typename Derived>
7050 QualType
7051 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7052                                                 ObjCObjectTypeLoc TL) {
7053   // Transform base type.
7054   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7055   if (BaseType.isNull())
7056     return QualType();
7057 
7058   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7059 
7060   // Transform type arguments.
7061   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7062   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7063     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7064     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7065     QualType TypeArg = TypeArgInfo->getType();
7066     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7067       AnyChanged = true;
7068 
7069       // We have a pack expansion. Instantiate it.
7070       const auto *PackExpansion = PackExpansionLoc.getType()
7071                                     ->castAs<PackExpansionType>();
7072       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7073       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7074                                               Unexpanded);
7075       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7076 
7077       // Determine whether the set of unexpanded parameter packs can
7078       // and should be expanded.
7079       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7080       bool Expand = false;
7081       bool RetainExpansion = false;
7082       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7083       if (getDerived().TryExpandParameterPacks(
7084             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7085             Unexpanded, Expand, RetainExpansion, NumExpansions))
7086         return QualType();
7087 
7088       if (!Expand) {
7089         // We can't expand this pack expansion into separate arguments yet;
7090         // just substitute into the pattern and create a new pack expansion
7091         // type.
7092         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7093 
7094         TypeLocBuilder TypeArgBuilder;
7095         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7096         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7097                                                              PatternLoc);
7098         if (NewPatternType.isNull())
7099           return QualType();
7100 
7101         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7102                                       NewPatternType, NumExpansions);
7103         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7104         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7105         NewTypeArgInfos.push_back(
7106           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7107         continue;
7108       }
7109 
7110       // Substitute into the pack expansion pattern for each slice of the
7111       // pack.
7112       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7113         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7114 
7115         TypeLocBuilder TypeArgBuilder;
7116         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7117 
7118         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7119                                                          PatternLoc);
7120         if (NewTypeArg.isNull())
7121           return QualType();
7122 
7123         NewTypeArgInfos.push_back(
7124           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7125       }
7126 
7127       continue;
7128     }
7129 
7130     TypeLocBuilder TypeArgBuilder;
7131     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7132     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7133     if (NewTypeArg.isNull())
7134       return QualType();
7135 
7136     // If nothing changed, just keep the old TypeSourceInfo.
7137     if (NewTypeArg == TypeArg) {
7138       NewTypeArgInfos.push_back(TypeArgInfo);
7139       continue;
7140     }
7141 
7142     NewTypeArgInfos.push_back(
7143       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7144     AnyChanged = true;
7145   }
7146 
7147   QualType Result = TL.getType();
7148   if (getDerived().AlwaysRebuild() || AnyChanged) {
7149     // Rebuild the type.
7150     Result = getDerived().RebuildObjCObjectType(
7151         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7152         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7153         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7154         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7155 
7156     if (Result.isNull())
7157       return QualType();
7158   }
7159 
7160   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7161   NewT.setHasBaseTypeAsWritten(true);
7162   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7163   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7164     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7165   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7166   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7167   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7168     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7169   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7170   return Result;
7171 }
7172 
7173 template<typename Derived>
7174 QualType
7175 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7176                                                ObjCObjectPointerTypeLoc TL) {
7177   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7178   if (PointeeType.isNull())
7179     return QualType();
7180 
7181   QualType Result = TL.getType();
7182   if (getDerived().AlwaysRebuild() ||
7183       PointeeType != TL.getPointeeLoc().getType()) {
7184     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7185                                                        TL.getStarLoc());
7186     if (Result.isNull())
7187       return QualType();
7188   }
7189 
7190   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7191   NewT.setStarLoc(TL.getStarLoc());
7192   return Result;
7193 }
7194 
7195 //===----------------------------------------------------------------------===//
7196 // Statement transformation
7197 //===----------------------------------------------------------------------===//
7198 template<typename Derived>
7199 StmtResult
7200 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7201   return S;
7202 }
7203 
7204 template<typename Derived>
7205 StmtResult
7206 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7207   return getDerived().TransformCompoundStmt(S, false);
7208 }
7209 
7210 template<typename Derived>
7211 StmtResult
7212 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7213                                               bool IsStmtExpr) {
7214   Sema::CompoundScopeRAII CompoundScope(getSema());
7215 
7216   const Stmt *ExprResult = S->getStmtExprResult();
7217   bool SubStmtInvalid = false;
7218   bool SubStmtChanged = false;
7219   SmallVector<Stmt*, 8> Statements;
7220   for (auto *B : S->body()) {
7221     StmtResult Result = getDerived().TransformStmt(
7222         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7223 
7224     if (Result.isInvalid()) {
7225       // Immediately fail if this was a DeclStmt, since it's very
7226       // likely that this will cause problems for future statements.
7227       if (isa<DeclStmt>(B))
7228         return StmtError();
7229 
7230       // Otherwise, just keep processing substatements and fail later.
7231       SubStmtInvalid = true;
7232       continue;
7233     }
7234 
7235     SubStmtChanged = SubStmtChanged || Result.get() != B;
7236     Statements.push_back(Result.getAs<Stmt>());
7237   }
7238 
7239   if (SubStmtInvalid)
7240     return StmtError();
7241 
7242   if (!getDerived().AlwaysRebuild() &&
7243       !SubStmtChanged)
7244     return S;
7245 
7246   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7247                                           Statements,
7248                                           S->getRBracLoc(),
7249                                           IsStmtExpr);
7250 }
7251 
7252 template<typename Derived>
7253 StmtResult
7254 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7255   ExprResult LHS, RHS;
7256   {
7257     EnterExpressionEvaluationContext Unevaluated(
7258         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7259 
7260     // Transform the left-hand case value.
7261     LHS = getDerived().TransformExpr(S->getLHS());
7262     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7263     if (LHS.isInvalid())
7264       return StmtError();
7265 
7266     // Transform the right-hand case value (for the GNU case-range extension).
7267     RHS = getDerived().TransformExpr(S->getRHS());
7268     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7269     if (RHS.isInvalid())
7270       return StmtError();
7271   }
7272 
7273   // Build the case statement.
7274   // Case statements are always rebuilt so that they will attached to their
7275   // transformed switch statement.
7276   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7277                                                        LHS.get(),
7278                                                        S->getEllipsisLoc(),
7279                                                        RHS.get(),
7280                                                        S->getColonLoc());
7281   if (Case.isInvalid())
7282     return StmtError();
7283 
7284   // Transform the statement following the case
7285   StmtResult SubStmt =
7286       getDerived().TransformStmt(S->getSubStmt());
7287   if (SubStmt.isInvalid())
7288     return StmtError();
7289 
7290   // Attach the body to the case statement
7291   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7292 }
7293 
7294 template <typename Derived>
7295 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7296   // Transform the statement following the default case
7297   StmtResult SubStmt =
7298       getDerived().TransformStmt(S->getSubStmt());
7299   if (SubStmt.isInvalid())
7300     return StmtError();
7301 
7302   // Default statements are always rebuilt
7303   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7304                                          SubStmt.get());
7305 }
7306 
7307 template<typename Derived>
7308 StmtResult
7309 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7310   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7311   if (SubStmt.isInvalid())
7312     return StmtError();
7313 
7314   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7315                                         S->getDecl());
7316   if (!LD)
7317     return StmtError();
7318 
7319   // If we're transforming "in-place" (we're not creating new local
7320   // declarations), assume we're replacing the old label statement
7321   // and clear out the reference to it.
7322   if (LD == S->getDecl())
7323     S->getDecl()->setStmt(nullptr);
7324 
7325   // FIXME: Pass the real colon location in.
7326   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7327                                        cast<LabelDecl>(LD), SourceLocation(),
7328                                        SubStmt.get());
7329 }
7330 
7331 template <typename Derived>
7332 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7333   if (!R)
7334     return R;
7335 
7336   switch (R->getKind()) {
7337 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7338 #define ATTR(X)
7339 #define PRAGMA_SPELLING_ATTR(X)                                                \
7340   case attr::X:                                                                \
7341     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7342 #include "clang/Basic/AttrList.inc"
7343   default:
7344     return R;
7345   }
7346 }
7347 
7348 template <typename Derived>
7349 StmtResult
7350 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7351                                                 StmtDiscardKind SDK) {
7352   bool AttrsChanged = false;
7353   SmallVector<const Attr *, 1> Attrs;
7354 
7355   // Visit attributes and keep track if any are transformed.
7356   for (const auto *I : S->getAttrs()) {
7357     const Attr *R = getDerived().TransformAttr(I);
7358     AttrsChanged |= (I != R);
7359     if (R)
7360       Attrs.push_back(R);
7361   }
7362 
7363   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7364   if (SubStmt.isInvalid())
7365     return StmtError();
7366 
7367   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7368     return S;
7369 
7370   // If transforming the attributes failed for all of the attributes in the
7371   // statement, don't make an AttributedStmt without attributes.
7372   if (Attrs.empty())
7373     return SubStmt;
7374 
7375   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7376                                             SubStmt.get());
7377 }
7378 
7379 template<typename Derived>
7380 StmtResult
7381 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7382   // Transform the initialization statement
7383   StmtResult Init = getDerived().TransformStmt(S->getInit());
7384   if (Init.isInvalid())
7385     return StmtError();
7386 
7387   Sema::ConditionResult Cond;
7388   if (!S->isConsteval()) {
7389     // Transform the condition
7390     Cond = getDerived().TransformCondition(
7391         S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7392         S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7393                          : Sema::ConditionKind::Boolean);
7394     if (Cond.isInvalid())
7395       return StmtError();
7396   }
7397 
7398   // If this is a constexpr if, determine which arm we should instantiate.
7399   llvm::Optional<bool> ConstexprConditionValue;
7400   if (S->isConstexpr())
7401     ConstexprConditionValue = Cond.getKnownValue();
7402 
7403   // Transform the "then" branch.
7404   StmtResult Then;
7405   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7406     Then = getDerived().TransformStmt(S->getThen());
7407     if (Then.isInvalid())
7408       return StmtError();
7409   } else {
7410     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7411   }
7412 
7413   // Transform the "else" branch.
7414   StmtResult Else;
7415   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7416     Else = getDerived().TransformStmt(S->getElse());
7417     if (Else.isInvalid())
7418       return StmtError();
7419   }
7420 
7421   if (!getDerived().AlwaysRebuild() &&
7422       Init.get() == S->getInit() &&
7423       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7424       Then.get() == S->getThen() &&
7425       Else.get() == S->getElse())
7426     return S;
7427 
7428   return getDerived().RebuildIfStmt(
7429       S->getIfLoc(), S->getStatementKind(), S->getLParenLoc(), Cond,
7430       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7431 }
7432 
7433 template<typename Derived>
7434 StmtResult
7435 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7436   // Transform the initialization statement
7437   StmtResult Init = getDerived().TransformStmt(S->getInit());
7438   if (Init.isInvalid())
7439     return StmtError();
7440 
7441   // Transform the condition.
7442   Sema::ConditionResult Cond = getDerived().TransformCondition(
7443       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7444       Sema::ConditionKind::Switch);
7445   if (Cond.isInvalid())
7446     return StmtError();
7447 
7448   // Rebuild the switch statement.
7449   StmtResult Switch =
7450       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7451                                           Init.get(), Cond, S->getRParenLoc());
7452   if (Switch.isInvalid())
7453     return StmtError();
7454 
7455   // Transform the body of the switch statement.
7456   StmtResult Body = getDerived().TransformStmt(S->getBody());
7457   if (Body.isInvalid())
7458     return StmtError();
7459 
7460   // Complete the switch statement.
7461   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7462                                             Body.get());
7463 }
7464 
7465 template<typename Derived>
7466 StmtResult
7467 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7468   // Transform the condition
7469   Sema::ConditionResult Cond = getDerived().TransformCondition(
7470       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7471       Sema::ConditionKind::Boolean);
7472   if (Cond.isInvalid())
7473     return StmtError();
7474 
7475   // Transform the body
7476   StmtResult Body = getDerived().TransformStmt(S->getBody());
7477   if (Body.isInvalid())
7478     return StmtError();
7479 
7480   if (!getDerived().AlwaysRebuild() &&
7481       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7482       Body.get() == S->getBody())
7483     return Owned(S);
7484 
7485   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7486                                        Cond, S->getRParenLoc(), Body.get());
7487 }
7488 
7489 template<typename Derived>
7490 StmtResult
7491 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7492   // Transform the body
7493   StmtResult Body = getDerived().TransformStmt(S->getBody());
7494   if (Body.isInvalid())
7495     return StmtError();
7496 
7497   // Transform the condition
7498   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7499   if (Cond.isInvalid())
7500     return StmtError();
7501 
7502   if (!getDerived().AlwaysRebuild() &&
7503       Cond.get() == S->getCond() &&
7504       Body.get() == S->getBody())
7505     return S;
7506 
7507   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7508                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7509                                     S->getRParenLoc());
7510 }
7511 
7512 template<typename Derived>
7513 StmtResult
7514 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7515   if (getSema().getLangOpts().OpenMP)
7516     getSema().startOpenMPLoop();
7517 
7518   // Transform the initialization statement
7519   StmtResult Init = getDerived().TransformStmt(S->getInit());
7520   if (Init.isInvalid())
7521     return StmtError();
7522 
7523   // In OpenMP loop region loop control variable must be captured and be
7524   // private. Perform analysis of first part (if any).
7525   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7526     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7527 
7528   // Transform the condition
7529   Sema::ConditionResult Cond = getDerived().TransformCondition(
7530       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7531       Sema::ConditionKind::Boolean);
7532   if (Cond.isInvalid())
7533     return StmtError();
7534 
7535   // Transform the increment
7536   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7537   if (Inc.isInvalid())
7538     return StmtError();
7539 
7540   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7541   if (S->getInc() && !FullInc.get())
7542     return StmtError();
7543 
7544   // Transform the body
7545   StmtResult Body = getDerived().TransformStmt(S->getBody());
7546   if (Body.isInvalid())
7547     return StmtError();
7548 
7549   if (!getDerived().AlwaysRebuild() &&
7550       Init.get() == S->getInit() &&
7551       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7552       Inc.get() == S->getInc() &&
7553       Body.get() == S->getBody())
7554     return S;
7555 
7556   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7557                                      Init.get(), Cond, FullInc,
7558                                      S->getRParenLoc(), Body.get());
7559 }
7560 
7561 template<typename Derived>
7562 StmtResult
7563 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7564   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7565                                         S->getLabel());
7566   if (!LD)
7567     return StmtError();
7568 
7569   // Goto statements must always be rebuilt, to resolve the label.
7570   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7571                                       cast<LabelDecl>(LD));
7572 }
7573 
7574 template<typename Derived>
7575 StmtResult
7576 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7577   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7578   if (Target.isInvalid())
7579     return StmtError();
7580   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7581 
7582   if (!getDerived().AlwaysRebuild() &&
7583       Target.get() == S->getTarget())
7584     return S;
7585 
7586   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7587                                               Target.get());
7588 }
7589 
7590 template<typename Derived>
7591 StmtResult
7592 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7593   return S;
7594 }
7595 
7596 template<typename Derived>
7597 StmtResult
7598 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7599   return S;
7600 }
7601 
7602 template<typename Derived>
7603 StmtResult
7604 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7605   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7606                                                         /*NotCopyInit*/false);
7607   if (Result.isInvalid())
7608     return StmtError();
7609 
7610   // FIXME: We always rebuild the return statement because there is no way
7611   // to tell whether the return type of the function has changed.
7612   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7613 }
7614 
7615 template<typename Derived>
7616 StmtResult
7617 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7618   bool DeclChanged = false;
7619   SmallVector<Decl *, 4> Decls;
7620   for (auto *D : S->decls()) {
7621     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7622     if (!Transformed)
7623       return StmtError();
7624 
7625     if (Transformed != D)
7626       DeclChanged = true;
7627 
7628     Decls.push_back(Transformed);
7629   }
7630 
7631   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7632     return S;
7633 
7634   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7635 }
7636 
7637 template<typename Derived>
7638 StmtResult
7639 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7640 
7641   SmallVector<Expr*, 8> Constraints;
7642   SmallVector<Expr*, 8> Exprs;
7643   SmallVector<IdentifierInfo *, 4> Names;
7644 
7645   ExprResult AsmString;
7646   SmallVector<Expr*, 8> Clobbers;
7647 
7648   bool ExprsChanged = false;
7649 
7650   // Go through the outputs.
7651   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7652     Names.push_back(S->getOutputIdentifier(I));
7653 
7654     // No need to transform the constraint literal.
7655     Constraints.push_back(S->getOutputConstraintLiteral(I));
7656 
7657     // Transform the output expr.
7658     Expr *OutputExpr = S->getOutputExpr(I);
7659     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7660     if (Result.isInvalid())
7661       return StmtError();
7662 
7663     ExprsChanged |= Result.get() != OutputExpr;
7664 
7665     Exprs.push_back(Result.get());
7666   }
7667 
7668   // Go through the inputs.
7669   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7670     Names.push_back(S->getInputIdentifier(I));
7671 
7672     // No need to transform the constraint literal.
7673     Constraints.push_back(S->getInputConstraintLiteral(I));
7674 
7675     // Transform the input expr.
7676     Expr *InputExpr = S->getInputExpr(I);
7677     ExprResult Result = getDerived().TransformExpr(InputExpr);
7678     if (Result.isInvalid())
7679       return StmtError();
7680 
7681     ExprsChanged |= Result.get() != InputExpr;
7682 
7683     Exprs.push_back(Result.get());
7684   }
7685 
7686   // Go through the Labels.
7687   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7688     Names.push_back(S->getLabelIdentifier(I));
7689 
7690     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7691     if (Result.isInvalid())
7692       return StmtError();
7693     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7694     Exprs.push_back(Result.get());
7695   }
7696   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7697     return S;
7698 
7699   // Go through the clobbers.
7700   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7701     Clobbers.push_back(S->getClobberStringLiteral(I));
7702 
7703   // No need to transform the asm string literal.
7704   AsmString = S->getAsmString();
7705   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7706                                         S->isVolatile(), S->getNumOutputs(),
7707                                         S->getNumInputs(), Names.data(),
7708                                         Constraints, Exprs, AsmString.get(),
7709                                         Clobbers, S->getNumLabels(),
7710                                         S->getRParenLoc());
7711 }
7712 
7713 template<typename Derived>
7714 StmtResult
7715 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7716   ArrayRef<Token> AsmToks =
7717     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7718 
7719   bool HadError = false, HadChange = false;
7720 
7721   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7722   SmallVector<Expr*, 8> TransformedExprs;
7723   TransformedExprs.reserve(SrcExprs.size());
7724   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7725     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7726     if (!Result.isUsable()) {
7727       HadError = true;
7728     } else {
7729       HadChange |= (Result.get() != SrcExprs[i]);
7730       TransformedExprs.push_back(Result.get());
7731     }
7732   }
7733 
7734   if (HadError) return StmtError();
7735   if (!HadChange && !getDerived().AlwaysRebuild())
7736     return Owned(S);
7737 
7738   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7739                                        AsmToks, S->getAsmString(),
7740                                        S->getNumOutputs(), S->getNumInputs(),
7741                                        S->getAllConstraints(), S->getClobbers(),
7742                                        TransformedExprs, S->getEndLoc());
7743 }
7744 
7745 // C++ Coroutines TS
7746 
7747 template<typename Derived>
7748 StmtResult
7749 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7750   auto *ScopeInfo = SemaRef.getCurFunction();
7751   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7752   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7753          ScopeInfo->NeedsCoroutineSuspends &&
7754          ScopeInfo->CoroutineSuspends.first == nullptr &&
7755          ScopeInfo->CoroutineSuspends.second == nullptr &&
7756          "expected clean scope info");
7757 
7758   // Set that we have (possibly-invalid) suspend points before we do anything
7759   // that may fail.
7760   ScopeInfo->setNeedsCoroutineSuspends(false);
7761 
7762   // We re-build the coroutine promise object (and the coroutine parameters its
7763   // type and constructor depend on) based on the types used in our current
7764   // function. We must do so, and set it on the current FunctionScopeInfo,
7765   // before attempting to transform the other parts of the coroutine body
7766   // statement, such as the implicit suspend statements (because those
7767   // statements reference the FunctionScopeInfo::CoroutinePromise).
7768   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7769     return StmtError();
7770   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7771   if (!Promise)
7772     return StmtError();
7773   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7774   ScopeInfo->CoroutinePromise = Promise;
7775 
7776   // Transform the implicit coroutine statements constructed using dependent
7777   // types during the previous parse: initial and final suspensions, the return
7778   // object, and others. We also transform the coroutine function's body.
7779   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7780   if (InitSuspend.isInvalid())
7781     return StmtError();
7782   StmtResult FinalSuspend =
7783       getDerived().TransformStmt(S->getFinalSuspendStmt());
7784   if (FinalSuspend.isInvalid() ||
7785       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7786     return StmtError();
7787   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7788   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7789 
7790   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7791   if (BodyRes.isInvalid())
7792     return StmtError();
7793 
7794   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7795   if (Builder.isInvalid())
7796     return StmtError();
7797 
7798   Expr *ReturnObject = S->getReturnValueInit();
7799   assert(ReturnObject && "the return object is expected to be valid");
7800   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7801                                                      /*NoCopyInit*/ false);
7802   if (Res.isInvalid())
7803     return StmtError();
7804   Builder.ReturnValue = Res.get();
7805 
7806   // If during the previous parse the coroutine still had a dependent promise
7807   // statement, we may need to build some implicit coroutine statements
7808   // (such as exception and fallthrough handlers) for the first time.
7809   if (S->hasDependentPromiseType()) {
7810     // We can only build these statements, however, if the current promise type
7811     // is not dependent.
7812     if (!Promise->getType()->isDependentType()) {
7813       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7814              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7815              "these nodes should not have been built yet");
7816       if (!Builder.buildDependentStatements())
7817         return StmtError();
7818     }
7819   } else {
7820     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7821       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7822       if (Res.isInvalid())
7823         return StmtError();
7824       Builder.OnFallthrough = Res.get();
7825     }
7826 
7827     if (auto *OnException = S->getExceptionHandler()) {
7828       StmtResult Res = getDerived().TransformStmt(OnException);
7829       if (Res.isInvalid())
7830         return StmtError();
7831       Builder.OnException = Res.get();
7832     }
7833 
7834     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7835       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7836       if (Res.isInvalid())
7837         return StmtError();
7838       Builder.ReturnStmtOnAllocFailure = Res.get();
7839     }
7840 
7841     // Transform any additional statements we may have already built
7842     assert(S->getAllocate() && S->getDeallocate() &&
7843            "allocation and deallocation calls must already be built");
7844     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7845     if (AllocRes.isInvalid())
7846       return StmtError();
7847     Builder.Allocate = AllocRes.get();
7848 
7849     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7850     if (DeallocRes.isInvalid())
7851       return StmtError();
7852     Builder.Deallocate = DeallocRes.get();
7853 
7854     assert(S->getResultDecl() && "ResultDecl must already be built");
7855     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7856     if (ResultDecl.isInvalid())
7857       return StmtError();
7858     Builder.ResultDecl = ResultDecl.get();
7859 
7860     if (auto *ReturnStmt = S->getReturnStmt()) {
7861       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7862       if (Res.isInvalid())
7863         return StmtError();
7864       Builder.ReturnStmt = Res.get();
7865     }
7866   }
7867 
7868   return getDerived().RebuildCoroutineBodyStmt(Builder);
7869 }
7870 
7871 template<typename Derived>
7872 StmtResult
7873 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7874   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7875                                                         /*NotCopyInit*/false);
7876   if (Result.isInvalid())
7877     return StmtError();
7878 
7879   // Always rebuild; we don't know if this needs to be injected into a new
7880   // context or if the promise type has changed.
7881   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7882                                           S->isImplicit());
7883 }
7884 
7885 template<typename Derived>
7886 ExprResult
7887 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7888   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7889                                                         /*NotCopyInit*/false);
7890   if (Result.isInvalid())
7891     return ExprError();
7892 
7893   // Always rebuild; we don't know if this needs to be injected into a new
7894   // context or if the promise type has changed.
7895   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7896                                          E->isImplicit());
7897 }
7898 
7899 template <typename Derived>
7900 ExprResult
7901 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7902   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7903                                                         /*NotCopyInit*/ false);
7904   if (OperandResult.isInvalid())
7905     return ExprError();
7906 
7907   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7908           E->getOperatorCoawaitLookup());
7909 
7910   if (LookupResult.isInvalid())
7911     return ExprError();
7912 
7913   // Always rebuild; we don't know if this needs to be injected into a new
7914   // context or if the promise type has changed.
7915   return getDerived().RebuildDependentCoawaitExpr(
7916       E->getKeywordLoc(), OperandResult.get(),
7917       cast<UnresolvedLookupExpr>(LookupResult.get()));
7918 }
7919 
7920 template<typename Derived>
7921 ExprResult
7922 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7923   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7924                                                         /*NotCopyInit*/false);
7925   if (Result.isInvalid())
7926     return ExprError();
7927 
7928   // Always rebuild; we don't know if this needs to be injected into a new
7929   // context or if the promise type has changed.
7930   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7931 }
7932 
7933 // Objective-C Statements.
7934 
7935 template<typename Derived>
7936 StmtResult
7937 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7938   // Transform the body of the @try.
7939   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7940   if (TryBody.isInvalid())
7941     return StmtError();
7942 
7943   // Transform the @catch statements (if present).
7944   bool AnyCatchChanged = false;
7945   SmallVector<Stmt*, 8> CatchStmts;
7946   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7947     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7948     if (Catch.isInvalid())
7949       return StmtError();
7950     if (Catch.get() != S->getCatchStmt(I))
7951       AnyCatchChanged = true;
7952     CatchStmts.push_back(Catch.get());
7953   }
7954 
7955   // Transform the @finally statement (if present).
7956   StmtResult Finally;
7957   if (S->getFinallyStmt()) {
7958     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7959     if (Finally.isInvalid())
7960       return StmtError();
7961   }
7962 
7963   // If nothing changed, just retain this statement.
7964   if (!getDerived().AlwaysRebuild() &&
7965       TryBody.get() == S->getTryBody() &&
7966       !AnyCatchChanged &&
7967       Finally.get() == S->getFinallyStmt())
7968     return S;
7969 
7970   // Build a new statement.
7971   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7972                                            CatchStmts, Finally.get());
7973 }
7974 
7975 template<typename Derived>
7976 StmtResult
7977 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7978   // Transform the @catch parameter, if there is one.
7979   VarDecl *Var = nullptr;
7980   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7981     TypeSourceInfo *TSInfo = nullptr;
7982     if (FromVar->getTypeSourceInfo()) {
7983       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7984       if (!TSInfo)
7985         return StmtError();
7986     }
7987 
7988     QualType T;
7989     if (TSInfo)
7990       T = TSInfo->getType();
7991     else {
7992       T = getDerived().TransformType(FromVar->getType());
7993       if (T.isNull())
7994         return StmtError();
7995     }
7996 
7997     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7998     if (!Var)
7999       return StmtError();
8000   }
8001 
8002   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
8003   if (Body.isInvalid())
8004     return StmtError();
8005 
8006   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
8007                                              S->getRParenLoc(),
8008                                              Var, Body.get());
8009 }
8010 
8011 template<typename Derived>
8012 StmtResult
8013 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
8014   // Transform the body.
8015   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
8016   if (Body.isInvalid())
8017     return StmtError();
8018 
8019   // If nothing changed, just retain this statement.
8020   if (!getDerived().AlwaysRebuild() &&
8021       Body.get() == S->getFinallyBody())
8022     return S;
8023 
8024   // Build a new statement.
8025   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8026                                                Body.get());
8027 }
8028 
8029 template<typename Derived>
8030 StmtResult
8031 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8032   ExprResult Operand;
8033   if (S->getThrowExpr()) {
8034     Operand = getDerived().TransformExpr(S->getThrowExpr());
8035     if (Operand.isInvalid())
8036       return StmtError();
8037   }
8038 
8039   if (!getDerived().AlwaysRebuild() &&
8040       Operand.get() == S->getThrowExpr())
8041     return S;
8042 
8043   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8044 }
8045 
8046 template<typename Derived>
8047 StmtResult
8048 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8049                                                   ObjCAtSynchronizedStmt *S) {
8050   // Transform the object we are locking.
8051   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8052   if (Object.isInvalid())
8053     return StmtError();
8054   Object =
8055     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8056                                                   Object.get());
8057   if (Object.isInvalid())
8058     return StmtError();
8059 
8060   // Transform the body.
8061   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8062   if (Body.isInvalid())
8063     return StmtError();
8064 
8065   // If nothing change, just retain the current statement.
8066   if (!getDerived().AlwaysRebuild() &&
8067       Object.get() == S->getSynchExpr() &&
8068       Body.get() == S->getSynchBody())
8069     return S;
8070 
8071   // Build a new statement.
8072   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8073                                                     Object.get(), Body.get());
8074 }
8075 
8076 template<typename Derived>
8077 StmtResult
8078 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8079                                               ObjCAutoreleasePoolStmt *S) {
8080   // Transform the body.
8081   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8082   if (Body.isInvalid())
8083     return StmtError();
8084 
8085   // If nothing changed, just retain this statement.
8086   if (!getDerived().AlwaysRebuild() &&
8087       Body.get() == S->getSubStmt())
8088     return S;
8089 
8090   // Build a new statement.
8091   return getDerived().RebuildObjCAutoreleasePoolStmt(
8092                         S->getAtLoc(), Body.get());
8093 }
8094 
8095 template<typename Derived>
8096 StmtResult
8097 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8098                                                   ObjCForCollectionStmt *S) {
8099   // Transform the element statement.
8100   StmtResult Element =
8101       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8102   if (Element.isInvalid())
8103     return StmtError();
8104 
8105   // Transform the collection expression.
8106   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8107   if (Collection.isInvalid())
8108     return StmtError();
8109 
8110   // Transform the body.
8111   StmtResult Body = getDerived().TransformStmt(S->getBody());
8112   if (Body.isInvalid())
8113     return StmtError();
8114 
8115   // If nothing changed, just retain this statement.
8116   if (!getDerived().AlwaysRebuild() &&
8117       Element.get() == S->getElement() &&
8118       Collection.get() == S->getCollection() &&
8119       Body.get() == S->getBody())
8120     return S;
8121 
8122   // Build a new statement.
8123   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8124                                                    Element.get(),
8125                                                    Collection.get(),
8126                                                    S->getRParenLoc(),
8127                                                    Body.get());
8128 }
8129 
8130 template <typename Derived>
8131 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8132   // Transform the exception declaration, if any.
8133   VarDecl *Var = nullptr;
8134   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8135     TypeSourceInfo *T =
8136         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8137     if (!T)
8138       return StmtError();
8139 
8140     Var = getDerived().RebuildExceptionDecl(
8141         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8142         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8143     if (!Var || Var->isInvalidDecl())
8144       return StmtError();
8145   }
8146 
8147   // Transform the actual exception handler.
8148   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8149   if (Handler.isInvalid())
8150     return StmtError();
8151 
8152   if (!getDerived().AlwaysRebuild() && !Var &&
8153       Handler.get() == S->getHandlerBlock())
8154     return S;
8155 
8156   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8157 }
8158 
8159 template <typename Derived>
8160 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8161   // Transform the try block itself.
8162   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8163   if (TryBlock.isInvalid())
8164     return StmtError();
8165 
8166   // Transform the handlers.
8167   bool HandlerChanged = false;
8168   SmallVector<Stmt *, 8> Handlers;
8169   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8170     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8171     if (Handler.isInvalid())
8172       return StmtError();
8173 
8174     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8175     Handlers.push_back(Handler.getAs<Stmt>());
8176   }
8177 
8178   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8179       !HandlerChanged)
8180     return S;
8181 
8182   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8183                                         Handlers);
8184 }
8185 
8186 template<typename Derived>
8187 StmtResult
8188 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8189   StmtResult Init =
8190       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8191   if (Init.isInvalid())
8192     return StmtError();
8193 
8194   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8195   if (Range.isInvalid())
8196     return StmtError();
8197 
8198   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8199   if (Begin.isInvalid())
8200     return StmtError();
8201   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8202   if (End.isInvalid())
8203     return StmtError();
8204 
8205   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8206   if (Cond.isInvalid())
8207     return StmtError();
8208   if (Cond.get())
8209     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8210   if (Cond.isInvalid())
8211     return StmtError();
8212   if (Cond.get())
8213     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8214 
8215   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8216   if (Inc.isInvalid())
8217     return StmtError();
8218   if (Inc.get())
8219     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8220 
8221   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8222   if (LoopVar.isInvalid())
8223     return StmtError();
8224 
8225   StmtResult NewStmt = S;
8226   if (getDerived().AlwaysRebuild() ||
8227       Init.get() != S->getInit() ||
8228       Range.get() != S->getRangeStmt() ||
8229       Begin.get() != S->getBeginStmt() ||
8230       End.get() != S->getEndStmt() ||
8231       Cond.get() != S->getCond() ||
8232       Inc.get() != S->getInc() ||
8233       LoopVar.get() != S->getLoopVarStmt()) {
8234     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8235                                                   S->getCoawaitLoc(), Init.get(),
8236                                                   S->getColonLoc(), Range.get(),
8237                                                   Begin.get(), End.get(),
8238                                                   Cond.get(),
8239                                                   Inc.get(), LoopVar.get(),
8240                                                   S->getRParenLoc());
8241     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8242       // Might not have attached any initializer to the loop variable.
8243       getSema().ActOnInitializerError(
8244           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8245       return StmtError();
8246     }
8247   }
8248 
8249   StmtResult Body = getDerived().TransformStmt(S->getBody());
8250   if (Body.isInvalid())
8251     return StmtError();
8252 
8253   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8254   // it now so we have a new statement to attach the body to.
8255   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8256     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8257                                                   S->getCoawaitLoc(), Init.get(),
8258                                                   S->getColonLoc(), Range.get(),
8259                                                   Begin.get(), End.get(),
8260                                                   Cond.get(),
8261                                                   Inc.get(), LoopVar.get(),
8262                                                   S->getRParenLoc());
8263     if (NewStmt.isInvalid())
8264       return StmtError();
8265   }
8266 
8267   if (NewStmt.get() == S)
8268     return S;
8269 
8270   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8271 }
8272 
8273 template<typename Derived>
8274 StmtResult
8275 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8276                                                     MSDependentExistsStmt *S) {
8277   // Transform the nested-name-specifier, if any.
8278   NestedNameSpecifierLoc QualifierLoc;
8279   if (S->getQualifierLoc()) {
8280     QualifierLoc
8281       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8282     if (!QualifierLoc)
8283       return StmtError();
8284   }
8285 
8286   // Transform the declaration name.
8287   DeclarationNameInfo NameInfo = S->getNameInfo();
8288   if (NameInfo.getName()) {
8289     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8290     if (!NameInfo.getName())
8291       return StmtError();
8292   }
8293 
8294   // Check whether anything changed.
8295   if (!getDerived().AlwaysRebuild() &&
8296       QualifierLoc == S->getQualifierLoc() &&
8297       NameInfo.getName() == S->getNameInfo().getName())
8298     return S;
8299 
8300   // Determine whether this name exists, if we can.
8301   CXXScopeSpec SS;
8302   SS.Adopt(QualifierLoc);
8303   bool Dependent = false;
8304   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8305   case Sema::IER_Exists:
8306     if (S->isIfExists())
8307       break;
8308 
8309     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8310 
8311   case Sema::IER_DoesNotExist:
8312     if (S->isIfNotExists())
8313       break;
8314 
8315     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8316 
8317   case Sema::IER_Dependent:
8318     Dependent = true;
8319     break;
8320 
8321   case Sema::IER_Error:
8322     return StmtError();
8323   }
8324 
8325   // We need to continue with the instantiation, so do so now.
8326   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8327   if (SubStmt.isInvalid())
8328     return StmtError();
8329 
8330   // If we have resolved the name, just transform to the substatement.
8331   if (!Dependent)
8332     return SubStmt;
8333 
8334   // The name is still dependent, so build a dependent expression again.
8335   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8336                                                    S->isIfExists(),
8337                                                    QualifierLoc,
8338                                                    NameInfo,
8339                                                    SubStmt.get());
8340 }
8341 
8342 template<typename Derived>
8343 ExprResult
8344 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8345   NestedNameSpecifierLoc QualifierLoc;
8346   if (E->getQualifierLoc()) {
8347     QualifierLoc
8348     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8349     if (!QualifierLoc)
8350       return ExprError();
8351   }
8352 
8353   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8354     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8355   if (!PD)
8356     return ExprError();
8357 
8358   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8359   if (Base.isInvalid())
8360     return ExprError();
8361 
8362   return new (SemaRef.getASTContext())
8363       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8364                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8365                         QualifierLoc, E->getMemberLoc());
8366 }
8367 
8368 template <typename Derived>
8369 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8370     MSPropertySubscriptExpr *E) {
8371   auto BaseRes = getDerived().TransformExpr(E->getBase());
8372   if (BaseRes.isInvalid())
8373     return ExprError();
8374   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8375   if (IdxRes.isInvalid())
8376     return ExprError();
8377 
8378   if (!getDerived().AlwaysRebuild() &&
8379       BaseRes.get() == E->getBase() &&
8380       IdxRes.get() == E->getIdx())
8381     return E;
8382 
8383   return getDerived().RebuildArraySubscriptExpr(
8384       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8385 }
8386 
8387 template <typename Derived>
8388 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8389   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8390   if (TryBlock.isInvalid())
8391     return StmtError();
8392 
8393   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8394   if (Handler.isInvalid())
8395     return StmtError();
8396 
8397   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8398       Handler.get() == S->getHandler())
8399     return S;
8400 
8401   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8402                                         TryBlock.get(), Handler.get());
8403 }
8404 
8405 template <typename Derived>
8406 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8407   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8408   if (Block.isInvalid())
8409     return StmtError();
8410 
8411   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8412 }
8413 
8414 template <typename Derived>
8415 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8416   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8417   if (FilterExpr.isInvalid())
8418     return StmtError();
8419 
8420   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8421   if (Block.isInvalid())
8422     return StmtError();
8423 
8424   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8425                                            Block.get());
8426 }
8427 
8428 template <typename Derived>
8429 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8430   if (isa<SEHFinallyStmt>(Handler))
8431     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8432   else
8433     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8434 }
8435 
8436 template<typename Derived>
8437 StmtResult
8438 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8439   return S;
8440 }
8441 
8442 //===----------------------------------------------------------------------===//
8443 // OpenMP directive transformation
8444 //===----------------------------------------------------------------------===//
8445 
8446 template <typename Derived>
8447 StmtResult
8448 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8449   // OMPCanonicalLoops are eliminated during transformation, since they will be
8450   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8451   // after transformation.
8452   return getDerived().TransformStmt(L->getLoopStmt());
8453 }
8454 
8455 template <typename Derived>
8456 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8457     OMPExecutableDirective *D) {
8458 
8459   // Transform the clauses
8460   llvm::SmallVector<OMPClause *, 16> TClauses;
8461   ArrayRef<OMPClause *> Clauses = D->clauses();
8462   TClauses.reserve(Clauses.size());
8463   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8464        I != E; ++I) {
8465     if (*I) {
8466       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8467       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8468       getDerived().getSema().EndOpenMPClause();
8469       if (Clause)
8470         TClauses.push_back(Clause);
8471     } else {
8472       TClauses.push_back(nullptr);
8473     }
8474   }
8475   StmtResult AssociatedStmt;
8476   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8477     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8478                                                   /*CurScope=*/nullptr);
8479     StmtResult Body;
8480     {
8481       Sema::CompoundScopeRAII CompoundScope(getSema());
8482       Stmt *CS;
8483       if (D->getDirectiveKind() == OMPD_atomic ||
8484           D->getDirectiveKind() == OMPD_critical ||
8485           D->getDirectiveKind() == OMPD_section ||
8486           D->getDirectiveKind() == OMPD_master)
8487         CS = D->getAssociatedStmt();
8488       else
8489         CS = D->getRawStmt();
8490       Body = getDerived().TransformStmt(CS);
8491       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8492           getSema().getLangOpts().OpenMPIRBuilder)
8493         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8494     }
8495     AssociatedStmt =
8496         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8497     if (AssociatedStmt.isInvalid()) {
8498       return StmtError();
8499     }
8500   }
8501   if (TClauses.size() != Clauses.size()) {
8502     return StmtError();
8503   }
8504 
8505   // Transform directive name for 'omp critical' directive.
8506   DeclarationNameInfo DirName;
8507   if (D->getDirectiveKind() == OMPD_critical) {
8508     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8509     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8510   }
8511   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8512   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8513     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8514   } else if (D->getDirectiveKind() == OMPD_cancel) {
8515     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8516   }
8517 
8518   return getDerived().RebuildOMPExecutableDirective(
8519       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8520       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8521 }
8522 
8523 template <typename Derived>
8524 StmtResult
8525 TreeTransform<Derived>::TransformOMPMetaDirective(OMPMetaDirective *D) {
8526   // TODO: Fix This
8527   SemaRef.Diag(D->getBeginLoc(), diag::err_omp_instantiation_not_supported)
8528       << getOpenMPDirectiveName(D->getDirectiveKind());
8529   return StmtError();
8530 }
8531 
8532 template <typename Derived>
8533 StmtResult
8534 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8535   DeclarationNameInfo DirName;
8536   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8537                                              D->getBeginLoc());
8538   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8539   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8540   return Res;
8541 }
8542 
8543 template <typename Derived>
8544 StmtResult
8545 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8546   DeclarationNameInfo DirName;
8547   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8548                                              D->getBeginLoc());
8549   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8550   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8551   return Res;
8552 }
8553 
8554 template <typename Derived>
8555 StmtResult
8556 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8557   DeclarationNameInfo DirName;
8558   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8559                                              nullptr, D->getBeginLoc());
8560   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8561   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8562   return Res;
8563 }
8564 
8565 template <typename Derived>
8566 StmtResult
8567 TreeTransform<Derived>::TransformOMPUnrollDirective(OMPUnrollDirective *D) {
8568   DeclarationNameInfo DirName;
8569   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8570                                              nullptr, D->getBeginLoc());
8571   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8572   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8573   return Res;
8574 }
8575 
8576 template <typename Derived>
8577 StmtResult
8578 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8579   DeclarationNameInfo DirName;
8580   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8581                                              D->getBeginLoc());
8582   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8583   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8584   return Res;
8585 }
8586 
8587 template <typename Derived>
8588 StmtResult
8589 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8590   DeclarationNameInfo DirName;
8591   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8592                                              D->getBeginLoc());
8593   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8594   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8595   return Res;
8596 }
8597 
8598 template <typename Derived>
8599 StmtResult
8600 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8601   DeclarationNameInfo DirName;
8602   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8603                                              D->getBeginLoc());
8604   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8605   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8606   return Res;
8607 }
8608 
8609 template <typename Derived>
8610 StmtResult
8611 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8612   DeclarationNameInfo DirName;
8613   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8614                                              D->getBeginLoc());
8615   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8616   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8617   return Res;
8618 }
8619 
8620 template <typename Derived>
8621 StmtResult
8622 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8623   DeclarationNameInfo DirName;
8624   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8625                                              D->getBeginLoc());
8626   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8627   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8628   return Res;
8629 }
8630 
8631 template <typename Derived>
8632 StmtResult
8633 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8634   DeclarationNameInfo DirName;
8635   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8636                                              D->getBeginLoc());
8637   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8638   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8639   return Res;
8640 }
8641 
8642 template <typename Derived>
8643 StmtResult
8644 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8645   getDerived().getSema().StartOpenMPDSABlock(
8646       OMPD_critical, D->getDirectiveName(), nullptr, 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 TreeTransform<Derived>::TransformOMPParallelForDirective(
8654     OMPParallelForDirective *D) {
8655   DeclarationNameInfo DirName;
8656   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8657                                              nullptr, 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 TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8665     OMPParallelForSimdDirective *D) {
8666   DeclarationNameInfo DirName;
8667   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8668                                              nullptr, 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 TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8676     OMPParallelMasterDirective *D) {
8677   DeclarationNameInfo DirName;
8678   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8679                                              nullptr, 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 TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8687     OMPParallelSectionsDirective *D) {
8688   DeclarationNameInfo DirName;
8689   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8690                                              nullptr, D->getBeginLoc());
8691   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8692   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8693   return Res;
8694 }
8695 
8696 template <typename Derived>
8697 StmtResult
8698 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8699   DeclarationNameInfo DirName;
8700   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8701                                              D->getBeginLoc());
8702   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8703   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8704   return Res;
8705 }
8706 
8707 template <typename Derived>
8708 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8709     OMPTaskyieldDirective *D) {
8710   DeclarationNameInfo DirName;
8711   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8712                                              D->getBeginLoc());
8713   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8714   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8715   return Res;
8716 }
8717 
8718 template <typename Derived>
8719 StmtResult
8720 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8721   DeclarationNameInfo DirName;
8722   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8723                                              D->getBeginLoc());
8724   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8725   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8726   return Res;
8727 }
8728 
8729 template <typename Derived>
8730 StmtResult
8731 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8732   DeclarationNameInfo DirName;
8733   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8734                                              D->getBeginLoc());
8735   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8736   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8737   return Res;
8738 }
8739 
8740 template <typename Derived>
8741 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8742     OMPTaskgroupDirective *D) {
8743   DeclarationNameInfo DirName;
8744   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8745                                              D->getBeginLoc());
8746   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8747   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8748   return Res;
8749 }
8750 
8751 template <typename Derived>
8752 StmtResult
8753 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8754   DeclarationNameInfo DirName;
8755   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8756                                              D->getBeginLoc());
8757   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8758   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8759   return Res;
8760 }
8761 
8762 template <typename Derived>
8763 StmtResult
8764 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8765   DeclarationNameInfo DirName;
8766   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8767                                              D->getBeginLoc());
8768   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8769   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8770   return Res;
8771 }
8772 
8773 template <typename Derived>
8774 StmtResult
8775 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8776   DeclarationNameInfo DirName;
8777   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8778                                              D->getBeginLoc());
8779   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8780   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8781   return Res;
8782 }
8783 
8784 template <typename Derived>
8785 StmtResult
8786 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8787   DeclarationNameInfo DirName;
8788   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8789                                              D->getBeginLoc());
8790   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8791   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8792   return Res;
8793 }
8794 
8795 template <typename Derived>
8796 StmtResult
8797 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8798   DeclarationNameInfo DirName;
8799   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8800                                              D->getBeginLoc());
8801   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8802   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8803   return Res;
8804 }
8805 
8806 template <typename Derived>
8807 StmtResult
8808 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8809   DeclarationNameInfo DirName;
8810   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8811                                              D->getBeginLoc());
8812   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8813   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8814   return Res;
8815 }
8816 
8817 template <typename Derived>
8818 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8819     OMPTargetDataDirective *D) {
8820   DeclarationNameInfo DirName;
8821   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8822                                              D->getBeginLoc());
8823   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8824   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8825   return Res;
8826 }
8827 
8828 template <typename Derived>
8829 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8830     OMPTargetEnterDataDirective *D) {
8831   DeclarationNameInfo DirName;
8832   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8833                                              nullptr, D->getBeginLoc());
8834   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8835   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8836   return Res;
8837 }
8838 
8839 template <typename Derived>
8840 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8841     OMPTargetExitDataDirective *D) {
8842   DeclarationNameInfo DirName;
8843   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8844                                              nullptr, D->getBeginLoc());
8845   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8846   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8847   return Res;
8848 }
8849 
8850 template <typename Derived>
8851 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8852     OMPTargetParallelDirective *D) {
8853   DeclarationNameInfo DirName;
8854   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8855                                              nullptr, D->getBeginLoc());
8856   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8857   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8858   return Res;
8859 }
8860 
8861 template <typename Derived>
8862 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8863     OMPTargetParallelForDirective *D) {
8864   DeclarationNameInfo DirName;
8865   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8866                                              nullptr, D->getBeginLoc());
8867   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8868   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8869   return Res;
8870 }
8871 
8872 template <typename Derived>
8873 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8874     OMPTargetUpdateDirective *D) {
8875   DeclarationNameInfo DirName;
8876   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8877                                              nullptr, D->getBeginLoc());
8878   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8879   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8880   return Res;
8881 }
8882 
8883 template <typename Derived>
8884 StmtResult
8885 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8886   DeclarationNameInfo DirName;
8887   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8888                                              D->getBeginLoc());
8889   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8890   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8891   return Res;
8892 }
8893 
8894 template <typename Derived>
8895 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8896     OMPCancellationPointDirective *D) {
8897   DeclarationNameInfo DirName;
8898   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8899                                              nullptr, D->getBeginLoc());
8900   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8901   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8902   return Res;
8903 }
8904 
8905 template <typename Derived>
8906 StmtResult
8907 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8908   DeclarationNameInfo DirName;
8909   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8910                                              D->getBeginLoc());
8911   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8912   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8913   return Res;
8914 }
8915 
8916 template <typename Derived>
8917 StmtResult
8918 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8919   DeclarationNameInfo DirName;
8920   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8921                                              D->getBeginLoc());
8922   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8923   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8924   return Res;
8925 }
8926 
8927 template <typename Derived>
8928 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8929     OMPTaskLoopSimdDirective *D) {
8930   DeclarationNameInfo DirName;
8931   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8932                                              nullptr, D->getBeginLoc());
8933   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8934   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8935   return Res;
8936 }
8937 
8938 template <typename Derived>
8939 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8940     OMPMasterTaskLoopDirective *D) {
8941   DeclarationNameInfo DirName;
8942   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8943                                              nullptr, D->getBeginLoc());
8944   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8945   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8946   return Res;
8947 }
8948 
8949 template <typename Derived>
8950 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8951     OMPMasterTaskLoopSimdDirective *D) {
8952   DeclarationNameInfo DirName;
8953   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8954                                              nullptr, D->getBeginLoc());
8955   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8956   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8957   return Res;
8958 }
8959 
8960 template <typename Derived>
8961 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8962     OMPParallelMasterTaskLoopDirective *D) {
8963   DeclarationNameInfo DirName;
8964   getDerived().getSema().StartOpenMPDSABlock(
8965       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8966   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8967   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8968   return Res;
8969 }
8970 
8971 template <typename Derived>
8972 StmtResult
8973 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8974     OMPParallelMasterTaskLoopSimdDirective *D) {
8975   DeclarationNameInfo DirName;
8976   getDerived().getSema().StartOpenMPDSABlock(
8977       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8978   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8979   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8980   return Res;
8981 }
8982 
8983 template <typename Derived>
8984 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8985     OMPDistributeDirective *D) {
8986   DeclarationNameInfo DirName;
8987   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8988                                              D->getBeginLoc());
8989   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8990   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8991   return Res;
8992 }
8993 
8994 template <typename Derived>
8995 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8996     OMPDistributeParallelForDirective *D) {
8997   DeclarationNameInfo DirName;
8998   getDerived().getSema().StartOpenMPDSABlock(
8999       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9000   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9001   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9002   return Res;
9003 }
9004 
9005 template <typename Derived>
9006 StmtResult
9007 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
9008     OMPDistributeParallelForSimdDirective *D) {
9009   DeclarationNameInfo DirName;
9010   getDerived().getSema().StartOpenMPDSABlock(
9011       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9012   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9013   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9014   return Res;
9015 }
9016 
9017 template <typename Derived>
9018 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
9019     OMPDistributeSimdDirective *D) {
9020   DeclarationNameInfo DirName;
9021   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
9022                                              nullptr, D->getBeginLoc());
9023   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9024   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9025   return Res;
9026 }
9027 
9028 template <typename Derived>
9029 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
9030     OMPTargetParallelForSimdDirective *D) {
9031   DeclarationNameInfo DirName;
9032   getDerived().getSema().StartOpenMPDSABlock(
9033       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
9034   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9035   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9036   return Res;
9037 }
9038 
9039 template <typename Derived>
9040 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
9041     OMPTargetSimdDirective *D) {
9042   DeclarationNameInfo DirName;
9043   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
9044                                              D->getBeginLoc());
9045   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9046   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9047   return Res;
9048 }
9049 
9050 template <typename Derived>
9051 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9052     OMPTeamsDistributeDirective *D) {
9053   DeclarationNameInfo DirName;
9054   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9055                                              nullptr, D->getBeginLoc());
9056   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9057   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9058   return Res;
9059 }
9060 
9061 template <typename Derived>
9062 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9063     OMPTeamsDistributeSimdDirective *D) {
9064   DeclarationNameInfo DirName;
9065   getDerived().getSema().StartOpenMPDSABlock(
9066       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9067   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9068   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9069   return Res;
9070 }
9071 
9072 template <typename Derived>
9073 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9074     OMPTeamsDistributeParallelForSimdDirective *D) {
9075   DeclarationNameInfo DirName;
9076   getDerived().getSema().StartOpenMPDSABlock(
9077       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9078       D->getBeginLoc());
9079   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9080   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9081   return Res;
9082 }
9083 
9084 template <typename Derived>
9085 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9086     OMPTeamsDistributeParallelForDirective *D) {
9087   DeclarationNameInfo DirName;
9088   getDerived().getSema().StartOpenMPDSABlock(
9089       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9090   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9091   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9092   return Res;
9093 }
9094 
9095 template <typename Derived>
9096 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9097     OMPTargetTeamsDirective *D) {
9098   DeclarationNameInfo DirName;
9099   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9100                                              nullptr, D->getBeginLoc());
9101   auto Res = getDerived().TransformOMPExecutableDirective(D);
9102   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9103   return Res;
9104 }
9105 
9106 template <typename Derived>
9107 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9108     OMPTargetTeamsDistributeDirective *D) {
9109   DeclarationNameInfo DirName;
9110   getDerived().getSema().StartOpenMPDSABlock(
9111       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9112   auto Res = getDerived().TransformOMPExecutableDirective(D);
9113   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9114   return Res;
9115 }
9116 
9117 template <typename Derived>
9118 StmtResult
9119 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9120     OMPTargetTeamsDistributeParallelForDirective *D) {
9121   DeclarationNameInfo DirName;
9122   getDerived().getSema().StartOpenMPDSABlock(
9123       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9124       D->getBeginLoc());
9125   auto Res = getDerived().TransformOMPExecutableDirective(D);
9126   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9127   return Res;
9128 }
9129 
9130 template <typename Derived>
9131 StmtResult TreeTransform<Derived>::
9132     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9133         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9134   DeclarationNameInfo DirName;
9135   getDerived().getSema().StartOpenMPDSABlock(
9136       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9137       D->getBeginLoc());
9138   auto Res = getDerived().TransformOMPExecutableDirective(D);
9139   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9140   return Res;
9141 }
9142 
9143 template <typename Derived>
9144 StmtResult
9145 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9146     OMPTargetTeamsDistributeSimdDirective *D) {
9147   DeclarationNameInfo DirName;
9148   getDerived().getSema().StartOpenMPDSABlock(
9149       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9150   auto Res = getDerived().TransformOMPExecutableDirective(D);
9151   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9152   return Res;
9153 }
9154 
9155 template <typename Derived>
9156 StmtResult
9157 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9158   DeclarationNameInfo DirName;
9159   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9160                                              D->getBeginLoc());
9161   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9162   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9163   return Res;
9164 }
9165 
9166 template <typename Derived>
9167 StmtResult
9168 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9169   DeclarationNameInfo DirName;
9170   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9171                                              D->getBeginLoc());
9172   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9173   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9174   return Res;
9175 }
9176 
9177 template <typename Derived>
9178 StmtResult
9179 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9180   DeclarationNameInfo DirName;
9181   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9182                                              D->getBeginLoc());
9183   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9184   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9185   return Res;
9186 }
9187 
9188 template <typename Derived>
9189 StmtResult TreeTransform<Derived>::TransformOMPGenericLoopDirective(
9190     OMPGenericLoopDirective *D) {
9191   DeclarationNameInfo DirName;
9192   getDerived().getSema().StartOpenMPDSABlock(OMPD_loop, DirName, nullptr,
9193                                              D->getBeginLoc());
9194   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9195   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9196   return Res;
9197 }
9198 
9199 //===----------------------------------------------------------------------===//
9200 // OpenMP clause transformation
9201 //===----------------------------------------------------------------------===//
9202 template <typename Derived>
9203 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9204   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9205   if (Cond.isInvalid())
9206     return nullptr;
9207   return getDerived().RebuildOMPIfClause(
9208       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9209       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9210 }
9211 
9212 template <typename Derived>
9213 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9214   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9215   if (Cond.isInvalid())
9216     return nullptr;
9217   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9218                                             C->getLParenLoc(), C->getEndLoc());
9219 }
9220 
9221 template <typename Derived>
9222 OMPClause *
9223 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9224   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9225   if (NumThreads.isInvalid())
9226     return nullptr;
9227   return getDerived().RebuildOMPNumThreadsClause(
9228       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9229 }
9230 
9231 template <typename Derived>
9232 OMPClause *
9233 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9234   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9235   if (E.isInvalid())
9236     return nullptr;
9237   return getDerived().RebuildOMPSafelenClause(
9238       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9239 }
9240 
9241 template <typename Derived>
9242 OMPClause *
9243 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9244   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9245   if (E.isInvalid())
9246     return nullptr;
9247   return getDerived().RebuildOMPAllocatorClause(
9248       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9249 }
9250 
9251 template <typename Derived>
9252 OMPClause *
9253 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9254   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9255   if (E.isInvalid())
9256     return nullptr;
9257   return getDerived().RebuildOMPSimdlenClause(
9258       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9259 }
9260 
9261 template <typename Derived>
9262 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9263   SmallVector<Expr *, 4> TransformedSizes;
9264   TransformedSizes.reserve(C->getNumSizes());
9265   bool Changed = false;
9266   for (Expr *E : C->getSizesRefs()) {
9267     if (!E) {
9268       TransformedSizes.push_back(nullptr);
9269       continue;
9270     }
9271 
9272     ExprResult T = getDerived().TransformExpr(E);
9273     if (T.isInvalid())
9274       return nullptr;
9275     if (E != T.get())
9276       Changed = true;
9277     TransformedSizes.push_back(T.get());
9278   }
9279 
9280   if (!Changed && !getDerived().AlwaysRebuild())
9281     return C;
9282   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9283                                C->getLParenLoc(), C->getEndLoc());
9284 }
9285 
9286 template <typename Derived>
9287 OMPClause *TreeTransform<Derived>::TransformOMPFullClause(OMPFullClause *C) {
9288   if (!getDerived().AlwaysRebuild())
9289     return C;
9290   return RebuildOMPFullClause(C->getBeginLoc(), C->getEndLoc());
9291 }
9292 
9293 template <typename Derived>
9294 OMPClause *
9295 TreeTransform<Derived>::TransformOMPPartialClause(OMPPartialClause *C) {
9296   ExprResult T = getDerived().TransformExpr(C->getFactor());
9297   if (T.isInvalid())
9298     return nullptr;
9299   Expr *Factor = T.get();
9300   bool Changed = Factor != C->getFactor();
9301 
9302   if (!Changed && !getDerived().AlwaysRebuild())
9303     return C;
9304   return RebuildOMPPartialClause(Factor, C->getBeginLoc(), C->getLParenLoc(),
9305                                  C->getEndLoc());
9306 }
9307 
9308 template <typename Derived>
9309 OMPClause *
9310 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9311   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9312   if (E.isInvalid())
9313     return nullptr;
9314   return getDerived().RebuildOMPCollapseClause(
9315       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9316 }
9317 
9318 template <typename Derived>
9319 OMPClause *
9320 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9321   return getDerived().RebuildOMPDefaultClause(
9322       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9323       C->getLParenLoc(), C->getEndLoc());
9324 }
9325 
9326 template <typename Derived>
9327 OMPClause *
9328 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9329   return getDerived().RebuildOMPProcBindClause(
9330       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9331       C->getLParenLoc(), C->getEndLoc());
9332 }
9333 
9334 template <typename Derived>
9335 OMPClause *
9336 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9337   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9338   if (E.isInvalid())
9339     return nullptr;
9340   return getDerived().RebuildOMPScheduleClause(
9341       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9342       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9343       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9344       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9345 }
9346 
9347 template <typename Derived>
9348 OMPClause *
9349 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9350   ExprResult E;
9351   if (auto *Num = C->getNumForLoops()) {
9352     E = getDerived().TransformExpr(Num);
9353     if (E.isInvalid())
9354       return nullptr;
9355   }
9356   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9357                                               C->getLParenLoc(), E.get());
9358 }
9359 
9360 template <typename Derived>
9361 OMPClause *
9362 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9363   ExprResult E;
9364   if (Expr *Evt = C->getEventHandler()) {
9365     E = getDerived().TransformExpr(Evt);
9366     if (E.isInvalid())
9367       return nullptr;
9368   }
9369   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9370                                              C->getLParenLoc(), C->getEndLoc());
9371 }
9372 
9373 template <typename Derived>
9374 OMPClause *
9375 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9376   // No need to rebuild this clause, no template-dependent parameters.
9377   return C;
9378 }
9379 
9380 template <typename Derived>
9381 OMPClause *
9382 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9383   // No need to rebuild this clause, no template-dependent parameters.
9384   return C;
9385 }
9386 
9387 template <typename Derived>
9388 OMPClause *
9389 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9390   // No need to rebuild this clause, no template-dependent parameters.
9391   return C;
9392 }
9393 
9394 template <typename Derived>
9395 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9396   // No need to rebuild this clause, no template-dependent parameters.
9397   return C;
9398 }
9399 
9400 template <typename Derived>
9401 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9402   // No need to rebuild this clause, no template-dependent parameters.
9403   return C;
9404 }
9405 
9406 template <typename Derived>
9407 OMPClause *
9408 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9409   // No need to rebuild this clause, no template-dependent parameters.
9410   return C;
9411 }
9412 
9413 template <typename Derived>
9414 OMPClause *
9415 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9416   // No need to rebuild this clause, no template-dependent parameters.
9417   return C;
9418 }
9419 
9420 template <typename Derived>
9421 OMPClause *
9422 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9423   // No need to rebuild this clause, no template-dependent parameters.
9424   return C;
9425 }
9426 
9427 template <typename Derived>
9428 OMPClause *
9429 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9430   // No need to rebuild this clause, no template-dependent parameters.
9431   return C;
9432 }
9433 
9434 template <typename Derived>
9435 OMPClause *
9436 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9437   // No need to rebuild this clause, no template-dependent parameters.
9438   return C;
9439 }
9440 
9441 template <typename Derived>
9442 OMPClause *
9443 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9444   // No need to rebuild this clause, no template-dependent parameters.
9445   return C;
9446 }
9447 
9448 template <typename Derived>
9449 OMPClause *
9450 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9451   // No need to rebuild this clause, no template-dependent parameters.
9452   return C;
9453 }
9454 
9455 template <typename Derived>
9456 OMPClause *
9457 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9458   // No need to rebuild this clause, no template-dependent parameters.
9459   return C;
9460 }
9461 
9462 template <typename Derived>
9463 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9464   // No need to rebuild this clause, no template-dependent parameters.
9465   return C;
9466 }
9467 
9468 template <typename Derived>
9469 OMPClause *
9470 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9471   // No need to rebuild this clause, no template-dependent parameters.
9472   return C;
9473 }
9474 
9475 template <typename Derived>
9476 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9477   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9478   if (IVR.isInvalid())
9479     return nullptr;
9480 
9481   llvm::SmallVector<Expr *, 8> PrefExprs;
9482   PrefExprs.reserve(C->varlist_size() - 1);
9483   for (Expr *E : llvm::drop_begin(C->varlists())) {
9484     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9485     if (ER.isInvalid())
9486       return nullptr;
9487     PrefExprs.push_back(ER.get());
9488   }
9489   return getDerived().RebuildOMPInitClause(
9490       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9491       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9492 }
9493 
9494 template <typename Derived>
9495 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9496   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9497   if (ER.isInvalid())
9498     return nullptr;
9499   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9500                                           C->getLParenLoc(), C->getVarLoc(),
9501                                           C->getEndLoc());
9502 }
9503 
9504 template <typename Derived>
9505 OMPClause *
9506 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9507   ExprResult ER;
9508   if (Expr *IV = C->getInteropVar()) {
9509     ER = getDerived().TransformExpr(IV);
9510     if (ER.isInvalid())
9511       return nullptr;
9512   }
9513   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9514                                               C->getLParenLoc(), C->getVarLoc(),
9515                                               C->getEndLoc());
9516 }
9517 
9518 template <typename Derived>
9519 OMPClause *
9520 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9521   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9522   if (Cond.isInvalid())
9523     return nullptr;
9524   return getDerived().RebuildOMPNovariantsClause(
9525       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9526 }
9527 
9528 template <typename Derived>
9529 OMPClause *
9530 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9531   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9532   if (Cond.isInvalid())
9533     return nullptr;
9534   return getDerived().RebuildOMPNocontextClause(
9535       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9536 }
9537 
9538 template <typename Derived>
9539 OMPClause *
9540 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9541   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9542   if (ThreadID.isInvalid())
9543     return nullptr;
9544   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9545                                              C->getLParenLoc(), C->getEndLoc());
9546 }
9547 
9548 template <typename Derived>
9549 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9550     OMPUnifiedAddressClause *C) {
9551   llvm_unreachable("unified_address clause cannot appear in dependent context");
9552 }
9553 
9554 template <typename Derived>
9555 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9556     OMPUnifiedSharedMemoryClause *C) {
9557   llvm_unreachable(
9558       "unified_shared_memory clause cannot appear in dependent context");
9559 }
9560 
9561 template <typename Derived>
9562 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9563     OMPReverseOffloadClause *C) {
9564   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9565 }
9566 
9567 template <typename Derived>
9568 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9569     OMPDynamicAllocatorsClause *C) {
9570   llvm_unreachable(
9571       "dynamic_allocators clause cannot appear in dependent context");
9572 }
9573 
9574 template <typename Derived>
9575 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9576     OMPAtomicDefaultMemOrderClause *C) {
9577   llvm_unreachable(
9578       "atomic_default_mem_order clause cannot appear in dependent context");
9579 }
9580 
9581 template <typename Derived>
9582 OMPClause *
9583 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9584   llvm::SmallVector<Expr *, 16> Vars;
9585   Vars.reserve(C->varlist_size());
9586   for (auto *VE : C->varlists()) {
9587     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9588     if (EVar.isInvalid())
9589       return nullptr;
9590     Vars.push_back(EVar.get());
9591   }
9592   return getDerived().RebuildOMPPrivateClause(
9593       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9594 }
9595 
9596 template <typename Derived>
9597 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9598     OMPFirstprivateClause *C) {
9599   llvm::SmallVector<Expr *, 16> Vars;
9600   Vars.reserve(C->varlist_size());
9601   for (auto *VE : C->varlists()) {
9602     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9603     if (EVar.isInvalid())
9604       return nullptr;
9605     Vars.push_back(EVar.get());
9606   }
9607   return getDerived().RebuildOMPFirstprivateClause(
9608       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9609 }
9610 
9611 template <typename Derived>
9612 OMPClause *
9613 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9614   llvm::SmallVector<Expr *, 16> Vars;
9615   Vars.reserve(C->varlist_size());
9616   for (auto *VE : C->varlists()) {
9617     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9618     if (EVar.isInvalid())
9619       return nullptr;
9620     Vars.push_back(EVar.get());
9621   }
9622   return getDerived().RebuildOMPLastprivateClause(
9623       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9624       C->getLParenLoc(), C->getEndLoc());
9625 }
9626 
9627 template <typename Derived>
9628 OMPClause *
9629 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9630   llvm::SmallVector<Expr *, 16> Vars;
9631   Vars.reserve(C->varlist_size());
9632   for (auto *VE : C->varlists()) {
9633     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9634     if (EVar.isInvalid())
9635       return nullptr;
9636     Vars.push_back(EVar.get());
9637   }
9638   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9639                                              C->getLParenLoc(), C->getEndLoc());
9640 }
9641 
9642 template <typename Derived>
9643 OMPClause *
9644 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9645   llvm::SmallVector<Expr *, 16> Vars;
9646   Vars.reserve(C->varlist_size());
9647   for (auto *VE : C->varlists()) {
9648     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9649     if (EVar.isInvalid())
9650       return nullptr;
9651     Vars.push_back(EVar.get());
9652   }
9653   CXXScopeSpec ReductionIdScopeSpec;
9654   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9655 
9656   DeclarationNameInfo NameInfo = C->getNameInfo();
9657   if (NameInfo.getName()) {
9658     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9659     if (!NameInfo.getName())
9660       return nullptr;
9661   }
9662   // Build a list of all UDR decls with the same names ranged by the Scopes.
9663   // The Scope boundary is a duplication of the previous decl.
9664   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9665   for (auto *E : C->reduction_ops()) {
9666     // Transform all the decls.
9667     if (E) {
9668       auto *ULE = cast<UnresolvedLookupExpr>(E);
9669       UnresolvedSet<8> Decls;
9670       for (auto *D : ULE->decls()) {
9671         NamedDecl *InstD =
9672             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9673         Decls.addDecl(InstD, InstD->getAccess());
9674       }
9675       UnresolvedReductions.push_back(
9676        UnresolvedLookupExpr::Create(
9677           SemaRef.Context, /*NamingClass=*/nullptr,
9678           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9679           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9680           Decls.begin(), Decls.end()));
9681     } else
9682       UnresolvedReductions.push_back(nullptr);
9683   }
9684   return getDerived().RebuildOMPReductionClause(
9685       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9686       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9687       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9688 }
9689 
9690 template <typename Derived>
9691 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9692     OMPTaskReductionClause *C) {
9693   llvm::SmallVector<Expr *, 16> Vars;
9694   Vars.reserve(C->varlist_size());
9695   for (auto *VE : C->varlists()) {
9696     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9697     if (EVar.isInvalid())
9698       return nullptr;
9699     Vars.push_back(EVar.get());
9700   }
9701   CXXScopeSpec ReductionIdScopeSpec;
9702   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9703 
9704   DeclarationNameInfo NameInfo = C->getNameInfo();
9705   if (NameInfo.getName()) {
9706     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9707     if (!NameInfo.getName())
9708       return nullptr;
9709   }
9710   // Build a list of all UDR decls with the same names ranged by the Scopes.
9711   // The Scope boundary is a duplication of the previous decl.
9712   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9713   for (auto *E : C->reduction_ops()) {
9714     // Transform all the decls.
9715     if (E) {
9716       auto *ULE = cast<UnresolvedLookupExpr>(E);
9717       UnresolvedSet<8> Decls;
9718       for (auto *D : ULE->decls()) {
9719         NamedDecl *InstD =
9720             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9721         Decls.addDecl(InstD, InstD->getAccess());
9722       }
9723       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9724           SemaRef.Context, /*NamingClass=*/nullptr,
9725           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9726           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9727     } else
9728       UnresolvedReductions.push_back(nullptr);
9729   }
9730   return getDerived().RebuildOMPTaskReductionClause(
9731       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9732       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9733 }
9734 
9735 template <typename Derived>
9736 OMPClause *
9737 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9738   llvm::SmallVector<Expr *, 16> Vars;
9739   Vars.reserve(C->varlist_size());
9740   for (auto *VE : C->varlists()) {
9741     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9742     if (EVar.isInvalid())
9743       return nullptr;
9744     Vars.push_back(EVar.get());
9745   }
9746   CXXScopeSpec ReductionIdScopeSpec;
9747   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9748 
9749   DeclarationNameInfo NameInfo = C->getNameInfo();
9750   if (NameInfo.getName()) {
9751     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9752     if (!NameInfo.getName())
9753       return nullptr;
9754   }
9755   // Build a list of all UDR decls with the same names ranged by the Scopes.
9756   // The Scope boundary is a duplication of the previous decl.
9757   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9758   for (auto *E : C->reduction_ops()) {
9759     // Transform all the decls.
9760     if (E) {
9761       auto *ULE = cast<UnresolvedLookupExpr>(E);
9762       UnresolvedSet<8> Decls;
9763       for (auto *D : ULE->decls()) {
9764         NamedDecl *InstD =
9765             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9766         Decls.addDecl(InstD, InstD->getAccess());
9767       }
9768       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9769           SemaRef.Context, /*NamingClass=*/nullptr,
9770           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9771           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9772     } else
9773       UnresolvedReductions.push_back(nullptr);
9774   }
9775   return getDerived().RebuildOMPInReductionClause(
9776       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9777       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9778 }
9779 
9780 template <typename Derived>
9781 OMPClause *
9782 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9783   llvm::SmallVector<Expr *, 16> Vars;
9784   Vars.reserve(C->varlist_size());
9785   for (auto *VE : C->varlists()) {
9786     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9787     if (EVar.isInvalid())
9788       return nullptr;
9789     Vars.push_back(EVar.get());
9790   }
9791   ExprResult Step = getDerived().TransformExpr(C->getStep());
9792   if (Step.isInvalid())
9793     return nullptr;
9794   return getDerived().RebuildOMPLinearClause(
9795       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9796       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9797 }
9798 
9799 template <typename Derived>
9800 OMPClause *
9801 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9802   llvm::SmallVector<Expr *, 16> Vars;
9803   Vars.reserve(C->varlist_size());
9804   for (auto *VE : C->varlists()) {
9805     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9806     if (EVar.isInvalid())
9807       return nullptr;
9808     Vars.push_back(EVar.get());
9809   }
9810   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9811   if (Alignment.isInvalid())
9812     return nullptr;
9813   return getDerived().RebuildOMPAlignedClause(
9814       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9815       C->getColonLoc(), C->getEndLoc());
9816 }
9817 
9818 template <typename Derived>
9819 OMPClause *
9820 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9821   llvm::SmallVector<Expr *, 16> Vars;
9822   Vars.reserve(C->varlist_size());
9823   for (auto *VE : C->varlists()) {
9824     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9825     if (EVar.isInvalid())
9826       return nullptr;
9827     Vars.push_back(EVar.get());
9828   }
9829   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9830                                              C->getLParenLoc(), C->getEndLoc());
9831 }
9832 
9833 template <typename Derived>
9834 OMPClause *
9835 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9836   llvm::SmallVector<Expr *, 16> Vars;
9837   Vars.reserve(C->varlist_size());
9838   for (auto *VE : C->varlists()) {
9839     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9840     if (EVar.isInvalid())
9841       return nullptr;
9842     Vars.push_back(EVar.get());
9843   }
9844   return getDerived().RebuildOMPCopyprivateClause(
9845       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9846 }
9847 
9848 template <typename Derived>
9849 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9850   llvm::SmallVector<Expr *, 16> Vars;
9851   Vars.reserve(C->varlist_size());
9852   for (auto *VE : C->varlists()) {
9853     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9854     if (EVar.isInvalid())
9855       return nullptr;
9856     Vars.push_back(EVar.get());
9857   }
9858   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9859                                             C->getLParenLoc(), C->getEndLoc());
9860 }
9861 
9862 template <typename Derived>
9863 OMPClause *
9864 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9865   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9866   if (E.isInvalid())
9867     return nullptr;
9868   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9869                                              C->getLParenLoc(), C->getEndLoc());
9870 }
9871 
9872 template <typename Derived>
9873 OMPClause *
9874 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9875   llvm::SmallVector<Expr *, 16> Vars;
9876   Expr *DepModifier = C->getModifier();
9877   if (DepModifier) {
9878     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9879     if (DepModRes.isInvalid())
9880       return nullptr;
9881     DepModifier = DepModRes.get();
9882   }
9883   Vars.reserve(C->varlist_size());
9884   for (auto *VE : C->varlists()) {
9885     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9886     if (EVar.isInvalid())
9887       return nullptr;
9888     Vars.push_back(EVar.get());
9889   }
9890   return getDerived().RebuildOMPDependClause(
9891       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9892       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9893       C->getEndLoc());
9894 }
9895 
9896 template <typename Derived>
9897 OMPClause *
9898 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9899   ExprResult E = getDerived().TransformExpr(C->getDevice());
9900   if (E.isInvalid())
9901     return nullptr;
9902   return getDerived().RebuildOMPDeviceClause(
9903       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9904       C->getModifierLoc(), C->getEndLoc());
9905 }
9906 
9907 template <typename Derived, class T>
9908 bool transformOMPMappableExprListClause(
9909     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9910     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9911     DeclarationNameInfo &MapperIdInfo,
9912     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9913   // Transform expressions in the list.
9914   Vars.reserve(C->varlist_size());
9915   for (auto *VE : C->varlists()) {
9916     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9917     if (EVar.isInvalid())
9918       return true;
9919     Vars.push_back(EVar.get());
9920   }
9921   // Transform mapper scope specifier and identifier.
9922   NestedNameSpecifierLoc QualifierLoc;
9923   if (C->getMapperQualifierLoc()) {
9924     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9925         C->getMapperQualifierLoc());
9926     if (!QualifierLoc)
9927       return true;
9928   }
9929   MapperIdScopeSpec.Adopt(QualifierLoc);
9930   MapperIdInfo = C->getMapperIdInfo();
9931   if (MapperIdInfo.getName()) {
9932     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9933     if (!MapperIdInfo.getName())
9934       return true;
9935   }
9936   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9937   // the previous user-defined mapper lookup in dependent environment.
9938   for (auto *E : C->mapperlists()) {
9939     // Transform all the decls.
9940     if (E) {
9941       auto *ULE = cast<UnresolvedLookupExpr>(E);
9942       UnresolvedSet<8> Decls;
9943       for (auto *D : ULE->decls()) {
9944         NamedDecl *InstD =
9945             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9946         Decls.addDecl(InstD, InstD->getAccess());
9947       }
9948       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9949           TT.getSema().Context, /*NamingClass=*/nullptr,
9950           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9951           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9952           Decls.end()));
9953     } else {
9954       UnresolvedMappers.push_back(nullptr);
9955     }
9956   }
9957   return false;
9958 }
9959 
9960 template <typename Derived>
9961 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9962   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9963   llvm::SmallVector<Expr *, 16> Vars;
9964   CXXScopeSpec MapperIdScopeSpec;
9965   DeclarationNameInfo MapperIdInfo;
9966   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9967   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9968           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9969     return nullptr;
9970   return getDerived().RebuildOMPMapClause(
9971       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9972       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9973       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9974 }
9975 
9976 template <typename Derived>
9977 OMPClause *
9978 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9979   Expr *Allocator = C->getAllocator();
9980   if (Allocator) {
9981     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9982     if (AllocatorRes.isInvalid())
9983       return nullptr;
9984     Allocator = AllocatorRes.get();
9985   }
9986   llvm::SmallVector<Expr *, 16> Vars;
9987   Vars.reserve(C->varlist_size());
9988   for (auto *VE : C->varlists()) {
9989     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9990     if (EVar.isInvalid())
9991       return nullptr;
9992     Vars.push_back(EVar.get());
9993   }
9994   return getDerived().RebuildOMPAllocateClause(
9995       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9996       C->getEndLoc());
9997 }
9998 
9999 template <typename Derived>
10000 OMPClause *
10001 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
10002   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
10003   if (E.isInvalid())
10004     return nullptr;
10005   return getDerived().RebuildOMPNumTeamsClause(
10006       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10007 }
10008 
10009 template <typename Derived>
10010 OMPClause *
10011 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
10012   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
10013   if (E.isInvalid())
10014     return nullptr;
10015   return getDerived().RebuildOMPThreadLimitClause(
10016       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10017 }
10018 
10019 template <typename Derived>
10020 OMPClause *
10021 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
10022   ExprResult E = getDerived().TransformExpr(C->getPriority());
10023   if (E.isInvalid())
10024     return nullptr;
10025   return getDerived().RebuildOMPPriorityClause(
10026       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10027 }
10028 
10029 template <typename Derived>
10030 OMPClause *
10031 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
10032   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
10033   if (E.isInvalid())
10034     return nullptr;
10035   return getDerived().RebuildOMPGrainsizeClause(
10036       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10037 }
10038 
10039 template <typename Derived>
10040 OMPClause *
10041 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
10042   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
10043   if (E.isInvalid())
10044     return nullptr;
10045   return getDerived().RebuildOMPNumTasksClause(
10046       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10047 }
10048 
10049 template <typename Derived>
10050 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
10051   ExprResult E = getDerived().TransformExpr(C->getHint());
10052   if (E.isInvalid())
10053     return nullptr;
10054   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
10055                                            C->getLParenLoc(), C->getEndLoc());
10056 }
10057 
10058 template <typename Derived>
10059 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
10060     OMPDistScheduleClause *C) {
10061   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
10062   if (E.isInvalid())
10063     return nullptr;
10064   return getDerived().RebuildOMPDistScheduleClause(
10065       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
10066       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
10067 }
10068 
10069 template <typename Derived>
10070 OMPClause *
10071 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
10072   // Rebuild Defaultmap Clause since we need to invoke the checking of
10073   // defaultmap(none:variable-category) after template initialization.
10074   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
10075                                                  C->getDefaultmapKind(),
10076                                                  C->getBeginLoc(),
10077                                                  C->getLParenLoc(),
10078                                                  C->getDefaultmapModifierLoc(),
10079                                                  C->getDefaultmapKindLoc(),
10080                                                  C->getEndLoc());
10081 }
10082 
10083 template <typename Derived>
10084 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10085   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10086   llvm::SmallVector<Expr *, 16> Vars;
10087   CXXScopeSpec MapperIdScopeSpec;
10088   DeclarationNameInfo MapperIdInfo;
10089   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10090   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10091           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10092     return nullptr;
10093   return getDerived().RebuildOMPToClause(
10094       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10095       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10096 }
10097 
10098 template <typename Derived>
10099 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10100   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10101   llvm::SmallVector<Expr *, 16> Vars;
10102   CXXScopeSpec MapperIdScopeSpec;
10103   DeclarationNameInfo MapperIdInfo;
10104   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10105   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10106           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10107     return nullptr;
10108   return getDerived().RebuildOMPFromClause(
10109       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10110       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10111 }
10112 
10113 template <typename Derived>
10114 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10115     OMPUseDevicePtrClause *C) {
10116   llvm::SmallVector<Expr *, 16> Vars;
10117   Vars.reserve(C->varlist_size());
10118   for (auto *VE : C->varlists()) {
10119     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10120     if (EVar.isInvalid())
10121       return nullptr;
10122     Vars.push_back(EVar.get());
10123   }
10124   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10125   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10126 }
10127 
10128 template <typename Derived>
10129 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10130     OMPUseDeviceAddrClause *C) {
10131   llvm::SmallVector<Expr *, 16> Vars;
10132   Vars.reserve(C->varlist_size());
10133   for (auto *VE : C->varlists()) {
10134     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10135     if (EVar.isInvalid())
10136       return nullptr;
10137     Vars.push_back(EVar.get());
10138   }
10139   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10140   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10141 }
10142 
10143 template <typename Derived>
10144 OMPClause *
10145 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10146   llvm::SmallVector<Expr *, 16> Vars;
10147   Vars.reserve(C->varlist_size());
10148   for (auto *VE : C->varlists()) {
10149     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10150     if (EVar.isInvalid())
10151       return nullptr;
10152     Vars.push_back(EVar.get());
10153   }
10154   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10155   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10156 }
10157 
10158 template <typename Derived>
10159 OMPClause *
10160 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10161   llvm::SmallVector<Expr *, 16> Vars;
10162   Vars.reserve(C->varlist_size());
10163   for (auto *VE : C->varlists()) {
10164     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10165     if (EVar.isInvalid())
10166       return nullptr;
10167     Vars.push_back(EVar.get());
10168   }
10169   return getDerived().RebuildOMPNontemporalClause(
10170       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10171 }
10172 
10173 template <typename Derived>
10174 OMPClause *
10175 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10176   llvm::SmallVector<Expr *, 16> Vars;
10177   Vars.reserve(C->varlist_size());
10178   for (auto *VE : C->varlists()) {
10179     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10180     if (EVar.isInvalid())
10181       return nullptr;
10182     Vars.push_back(EVar.get());
10183   }
10184   return getDerived().RebuildOMPInclusiveClause(
10185       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10186 }
10187 
10188 template <typename Derived>
10189 OMPClause *
10190 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10191   llvm::SmallVector<Expr *, 16> Vars;
10192   Vars.reserve(C->varlist_size());
10193   for (auto *VE : C->varlists()) {
10194     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10195     if (EVar.isInvalid())
10196       return nullptr;
10197     Vars.push_back(EVar.get());
10198   }
10199   return getDerived().RebuildOMPExclusiveClause(
10200       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10201 }
10202 
10203 template <typename Derived>
10204 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10205     OMPUsesAllocatorsClause *C) {
10206   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10207   Data.reserve(C->getNumberOfAllocators());
10208   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10209     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10210     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10211     if (Allocator.isInvalid())
10212       continue;
10213     ExprResult AllocatorTraits;
10214     if (Expr *AT = D.AllocatorTraits) {
10215       AllocatorTraits = getDerived().TransformExpr(AT);
10216       if (AllocatorTraits.isInvalid())
10217         continue;
10218     }
10219     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10220     NewD.Allocator = Allocator.get();
10221     NewD.AllocatorTraits = AllocatorTraits.get();
10222     NewD.LParenLoc = D.LParenLoc;
10223     NewD.RParenLoc = D.RParenLoc;
10224   }
10225   return getDerived().RebuildOMPUsesAllocatorsClause(
10226       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10227 }
10228 
10229 template <typename Derived>
10230 OMPClause *
10231 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10232   SmallVector<Expr *, 4> Locators;
10233   Locators.reserve(C->varlist_size());
10234   ExprResult ModifierRes;
10235   if (Expr *Modifier = C->getModifier()) {
10236     ModifierRes = getDerived().TransformExpr(Modifier);
10237     if (ModifierRes.isInvalid())
10238       return nullptr;
10239   }
10240   for (Expr *E : C->varlists()) {
10241     ExprResult Locator = getDerived().TransformExpr(E);
10242     if (Locator.isInvalid())
10243       continue;
10244     Locators.push_back(Locator.get());
10245   }
10246   return getDerived().RebuildOMPAffinityClause(
10247       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10248       ModifierRes.get(), Locators);
10249 }
10250 
10251 template <typename Derived>
10252 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10253   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10254                                             C->getBeginLoc(), C->getLParenLoc(),
10255                                             C->getEndLoc());
10256 }
10257 
10258 template <typename Derived>
10259 OMPClause *TreeTransform<Derived>::TransformOMPBindClause(OMPBindClause *C) {
10260   return getDerived().RebuildOMPBindClause(
10261       C->getBindKind(), C->getBindKindLoc(), C->getBeginLoc(),
10262       C->getLParenLoc(), C->getEndLoc());
10263 }
10264 
10265 //===----------------------------------------------------------------------===//
10266 // Expression transformation
10267 //===----------------------------------------------------------------------===//
10268 template<typename Derived>
10269 ExprResult
10270 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10271   return TransformExpr(E->getSubExpr());
10272 }
10273 
10274 template <typename Derived>
10275 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10276     SYCLUniqueStableNameExpr *E) {
10277   if (!E->isTypeDependent())
10278     return E;
10279 
10280   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10281 
10282   if (!NewT)
10283     return ExprError();
10284 
10285   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10286     return E;
10287 
10288   return getDerived().RebuildSYCLUniqueStableNameExpr(
10289       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10290 }
10291 
10292 template<typename Derived>
10293 ExprResult
10294 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10295   if (!E->isTypeDependent())
10296     return E;
10297 
10298   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10299                                             E->getIdentKind());
10300 }
10301 
10302 template<typename Derived>
10303 ExprResult
10304 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10305   NestedNameSpecifierLoc QualifierLoc;
10306   if (E->getQualifierLoc()) {
10307     QualifierLoc
10308       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10309     if (!QualifierLoc)
10310       return ExprError();
10311   }
10312 
10313   ValueDecl *ND
10314     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10315                                                          E->getDecl()));
10316   if (!ND)
10317     return ExprError();
10318 
10319   NamedDecl *Found = ND;
10320   if (E->getFoundDecl() != E->getDecl()) {
10321     Found = cast_or_null<NamedDecl>(
10322         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10323     if (!Found)
10324       return ExprError();
10325   }
10326 
10327   DeclarationNameInfo NameInfo = E->getNameInfo();
10328   if (NameInfo.getName()) {
10329     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10330     if (!NameInfo.getName())
10331       return ExprError();
10332   }
10333 
10334   if (!getDerived().AlwaysRebuild() &&
10335       QualifierLoc == E->getQualifierLoc() &&
10336       ND == E->getDecl() &&
10337       Found == E->getFoundDecl() &&
10338       NameInfo.getName() == E->getDecl()->getDeclName() &&
10339       !E->hasExplicitTemplateArgs()) {
10340 
10341     // Mark it referenced in the new context regardless.
10342     // FIXME: this is a bit instantiation-specific.
10343     SemaRef.MarkDeclRefReferenced(E);
10344 
10345     return E;
10346   }
10347 
10348   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10349   if (E->hasExplicitTemplateArgs()) {
10350     TemplateArgs = &TransArgs;
10351     TransArgs.setLAngleLoc(E->getLAngleLoc());
10352     TransArgs.setRAngleLoc(E->getRAngleLoc());
10353     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10354                                                 E->getNumTemplateArgs(),
10355                                                 TransArgs))
10356       return ExprError();
10357   }
10358 
10359   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10360                                          Found, TemplateArgs);
10361 }
10362 
10363 template<typename Derived>
10364 ExprResult
10365 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10366   return E;
10367 }
10368 
10369 template <typename Derived>
10370 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10371     FixedPointLiteral *E) {
10372   return E;
10373 }
10374 
10375 template<typename Derived>
10376 ExprResult
10377 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10378   return E;
10379 }
10380 
10381 template<typename Derived>
10382 ExprResult
10383 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10384   return E;
10385 }
10386 
10387 template<typename Derived>
10388 ExprResult
10389 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10390   return E;
10391 }
10392 
10393 template<typename Derived>
10394 ExprResult
10395 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10396   return E;
10397 }
10398 
10399 template<typename Derived>
10400 ExprResult
10401 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10402   if (FunctionDecl *FD = E->getDirectCallee())
10403     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10404   return SemaRef.MaybeBindToTemporary(E);
10405 }
10406 
10407 template<typename Derived>
10408 ExprResult
10409 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10410   ExprResult ControllingExpr =
10411     getDerived().TransformExpr(E->getControllingExpr());
10412   if (ControllingExpr.isInvalid())
10413     return ExprError();
10414 
10415   SmallVector<Expr *, 4> AssocExprs;
10416   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10417   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10418     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10419     if (TSI) {
10420       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10421       if (!AssocType)
10422         return ExprError();
10423       AssocTypes.push_back(AssocType);
10424     } else {
10425       AssocTypes.push_back(nullptr);
10426     }
10427 
10428     ExprResult AssocExpr =
10429         getDerived().TransformExpr(Assoc.getAssociationExpr());
10430     if (AssocExpr.isInvalid())
10431       return ExprError();
10432     AssocExprs.push_back(AssocExpr.get());
10433   }
10434 
10435   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10436                                                   E->getDefaultLoc(),
10437                                                   E->getRParenLoc(),
10438                                                   ControllingExpr.get(),
10439                                                   AssocTypes,
10440                                                   AssocExprs);
10441 }
10442 
10443 template<typename Derived>
10444 ExprResult
10445 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10446   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10447   if (SubExpr.isInvalid())
10448     return ExprError();
10449 
10450   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10451     return E;
10452 
10453   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10454                                        E->getRParen());
10455 }
10456 
10457 /// The operand of a unary address-of operator has special rules: it's
10458 /// allowed to refer to a non-static member of a class even if there's no 'this'
10459 /// object available.
10460 template<typename Derived>
10461 ExprResult
10462 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10463   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10464     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10465   else
10466     return getDerived().TransformExpr(E);
10467 }
10468 
10469 template<typename Derived>
10470 ExprResult
10471 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10472   ExprResult SubExpr;
10473   if (E->getOpcode() == UO_AddrOf)
10474     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10475   else
10476     SubExpr = TransformExpr(E->getSubExpr());
10477   if (SubExpr.isInvalid())
10478     return ExprError();
10479 
10480   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10481     return E;
10482 
10483   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10484                                            E->getOpcode(),
10485                                            SubExpr.get());
10486 }
10487 
10488 template<typename Derived>
10489 ExprResult
10490 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10491   // Transform the type.
10492   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10493   if (!Type)
10494     return ExprError();
10495 
10496   // Transform all of the components into components similar to what the
10497   // parser uses.
10498   // FIXME: It would be slightly more efficient in the non-dependent case to
10499   // just map FieldDecls, rather than requiring the rebuilder to look for
10500   // the fields again. However, __builtin_offsetof is rare enough in
10501   // template code that we don't care.
10502   bool ExprChanged = false;
10503   typedef Sema::OffsetOfComponent Component;
10504   SmallVector<Component, 4> Components;
10505   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10506     const OffsetOfNode &ON = E->getComponent(I);
10507     Component Comp;
10508     Comp.isBrackets = true;
10509     Comp.LocStart = ON.getSourceRange().getBegin();
10510     Comp.LocEnd = ON.getSourceRange().getEnd();
10511     switch (ON.getKind()) {
10512     case OffsetOfNode::Array: {
10513       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10514       ExprResult Index = getDerived().TransformExpr(FromIndex);
10515       if (Index.isInvalid())
10516         return ExprError();
10517 
10518       ExprChanged = ExprChanged || Index.get() != FromIndex;
10519       Comp.isBrackets = true;
10520       Comp.U.E = Index.get();
10521       break;
10522     }
10523 
10524     case OffsetOfNode::Field:
10525     case OffsetOfNode::Identifier:
10526       Comp.isBrackets = false;
10527       Comp.U.IdentInfo = ON.getFieldName();
10528       if (!Comp.U.IdentInfo)
10529         continue;
10530 
10531       break;
10532 
10533     case OffsetOfNode::Base:
10534       // Will be recomputed during the rebuild.
10535       continue;
10536     }
10537 
10538     Components.push_back(Comp);
10539   }
10540 
10541   // If nothing changed, retain the existing expression.
10542   if (!getDerived().AlwaysRebuild() &&
10543       Type == E->getTypeSourceInfo() &&
10544       !ExprChanged)
10545     return E;
10546 
10547   // Build a new offsetof expression.
10548   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10549                                           Components, E->getRParenLoc());
10550 }
10551 
10552 template<typename Derived>
10553 ExprResult
10554 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10555   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10556          "opaque value expression requires transformation");
10557   return E;
10558 }
10559 
10560 template<typename Derived>
10561 ExprResult
10562 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10563   return E;
10564 }
10565 
10566 template <typename Derived>
10567 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10568   llvm::SmallVector<Expr *, 8> Children;
10569   bool Changed = false;
10570   for (Expr *C : E->subExpressions()) {
10571     ExprResult NewC = getDerived().TransformExpr(C);
10572     if (NewC.isInvalid())
10573       return ExprError();
10574     Children.push_back(NewC.get());
10575 
10576     Changed |= NewC.get() != C;
10577   }
10578   if (!getDerived().AlwaysRebuild() && !Changed)
10579     return E;
10580   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10581                                           Children, E->getType());
10582 }
10583 
10584 template<typename Derived>
10585 ExprResult
10586 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10587   // Rebuild the syntactic form.  The original syntactic form has
10588   // opaque-value expressions in it, so strip those away and rebuild
10589   // the result.  This is a really awful way of doing this, but the
10590   // better solution (rebuilding the semantic expressions and
10591   // rebinding OVEs as necessary) doesn't work; we'd need
10592   // TreeTransform to not strip away implicit conversions.
10593   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10594   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10595   if (result.isInvalid()) return ExprError();
10596 
10597   // If that gives us a pseudo-object result back, the pseudo-object
10598   // expression must have been an lvalue-to-rvalue conversion which we
10599   // should reapply.
10600   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10601     result = SemaRef.checkPseudoObjectRValue(result.get());
10602 
10603   return result;
10604 }
10605 
10606 template<typename Derived>
10607 ExprResult
10608 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10609                                                 UnaryExprOrTypeTraitExpr *E) {
10610   if (E->isArgumentType()) {
10611     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10612 
10613     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10614     if (!NewT)
10615       return ExprError();
10616 
10617     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10618       return E;
10619 
10620     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10621                                                     E->getKind(),
10622                                                     E->getSourceRange());
10623   }
10624 
10625   // C++0x [expr.sizeof]p1:
10626   //   The operand is either an expression, which is an unevaluated operand
10627   //   [...]
10628   EnterExpressionEvaluationContext Unevaluated(
10629       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10630       Sema::ReuseLambdaContextDecl);
10631 
10632   // Try to recover if we have something like sizeof(T::X) where X is a type.
10633   // Notably, there must be *exactly* one set of parens if X is a type.
10634   TypeSourceInfo *RecoveryTSI = nullptr;
10635   ExprResult SubExpr;
10636   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10637   if (auto *DRE =
10638           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10639     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10640         PE, DRE, false, &RecoveryTSI);
10641   else
10642     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10643 
10644   if (RecoveryTSI) {
10645     return getDerived().RebuildUnaryExprOrTypeTrait(
10646         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10647   } else if (SubExpr.isInvalid())
10648     return ExprError();
10649 
10650   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10651     return E;
10652 
10653   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10654                                                   E->getOperatorLoc(),
10655                                                   E->getKind(),
10656                                                   E->getSourceRange());
10657 }
10658 
10659 template<typename Derived>
10660 ExprResult
10661 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10662   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10663   if (LHS.isInvalid())
10664     return ExprError();
10665 
10666   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10667   if (RHS.isInvalid())
10668     return ExprError();
10669 
10670 
10671   if (!getDerived().AlwaysRebuild() &&
10672       LHS.get() == E->getLHS() &&
10673       RHS.get() == E->getRHS())
10674     return E;
10675 
10676   return getDerived().RebuildArraySubscriptExpr(
10677       LHS.get(),
10678       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10679 }
10680 
10681 template <typename Derived>
10682 ExprResult
10683 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10684   ExprResult Base = getDerived().TransformExpr(E->getBase());
10685   if (Base.isInvalid())
10686     return ExprError();
10687 
10688   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10689   if (RowIdx.isInvalid())
10690     return ExprError();
10691 
10692   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10693   if (ColumnIdx.isInvalid())
10694     return ExprError();
10695 
10696   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10697       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10698     return E;
10699 
10700   return getDerived().RebuildMatrixSubscriptExpr(
10701       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10702 }
10703 
10704 template <typename Derived>
10705 ExprResult
10706 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10707   ExprResult Base = getDerived().TransformExpr(E->getBase());
10708   if (Base.isInvalid())
10709     return ExprError();
10710 
10711   ExprResult LowerBound;
10712   if (E->getLowerBound()) {
10713     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10714     if (LowerBound.isInvalid())
10715       return ExprError();
10716   }
10717 
10718   ExprResult Length;
10719   if (E->getLength()) {
10720     Length = getDerived().TransformExpr(E->getLength());
10721     if (Length.isInvalid())
10722       return ExprError();
10723   }
10724 
10725   ExprResult Stride;
10726   if (Expr *Str = E->getStride()) {
10727     Stride = getDerived().TransformExpr(Str);
10728     if (Stride.isInvalid())
10729       return ExprError();
10730   }
10731 
10732   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10733       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10734     return E;
10735 
10736   return getDerived().RebuildOMPArraySectionExpr(
10737       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10738       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10739       E->getRBracketLoc());
10740 }
10741 
10742 template <typename Derived>
10743 ExprResult
10744 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10745   ExprResult Base = getDerived().TransformExpr(E->getBase());
10746   if (Base.isInvalid())
10747     return ExprError();
10748 
10749   SmallVector<Expr *, 4> Dims;
10750   bool ErrorFound = false;
10751   for (Expr *Dim : E->getDimensions()) {
10752     ExprResult DimRes = getDerived().TransformExpr(Dim);
10753     if (DimRes.isInvalid()) {
10754       ErrorFound = true;
10755       continue;
10756     }
10757     Dims.push_back(DimRes.get());
10758   }
10759 
10760   if (ErrorFound)
10761     return ExprError();
10762   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10763                                                  E->getRParenLoc(), Dims,
10764                                                  E->getBracketsRanges());
10765 }
10766 
10767 template <typename Derived>
10768 ExprResult
10769 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10770   unsigned NumIterators = E->numOfIterators();
10771   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10772 
10773   bool ErrorFound = false;
10774   bool NeedToRebuild = getDerived().AlwaysRebuild();
10775   for (unsigned I = 0; I < NumIterators; ++I) {
10776     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10777     Data[I].DeclIdent = D->getIdentifier();
10778     Data[I].DeclIdentLoc = D->getLocation();
10779     if (D->getLocation() == D->getBeginLoc()) {
10780       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10781              "Implicit type must be int.");
10782     } else {
10783       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10784       QualType DeclTy = getDerived().TransformType(D->getType());
10785       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10786     }
10787     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10788     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10789     ExprResult End = getDerived().TransformExpr(Range.End);
10790     ExprResult Step = getDerived().TransformExpr(Range.Step);
10791     ErrorFound = ErrorFound ||
10792                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10793                                                !Data[I].Type.get().isNull())) ||
10794                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10795     if (ErrorFound)
10796       continue;
10797     Data[I].Range.Begin = Begin.get();
10798     Data[I].Range.End = End.get();
10799     Data[I].Range.Step = Step.get();
10800     Data[I].AssignLoc = E->getAssignLoc(I);
10801     Data[I].ColonLoc = E->getColonLoc(I);
10802     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10803     NeedToRebuild =
10804         NeedToRebuild ||
10805         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10806                                        D->getType().getTypePtrOrNull()) ||
10807         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10808         Range.Step != Data[I].Range.Step;
10809   }
10810   if (ErrorFound)
10811     return ExprError();
10812   if (!NeedToRebuild)
10813     return E;
10814 
10815   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10816       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10817   if (!Res.isUsable())
10818     return Res;
10819   auto *IE = cast<OMPIteratorExpr>(Res.get());
10820   for (unsigned I = 0; I < NumIterators; ++I)
10821     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10822                                       IE->getIteratorDecl(I));
10823   return Res;
10824 }
10825 
10826 template<typename Derived>
10827 ExprResult
10828 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10829   // Transform the callee.
10830   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10831   if (Callee.isInvalid())
10832     return ExprError();
10833 
10834   // Transform arguments.
10835   bool ArgChanged = false;
10836   SmallVector<Expr*, 8> Args;
10837   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10838                                   &ArgChanged))
10839     return ExprError();
10840 
10841   if (!getDerived().AlwaysRebuild() &&
10842       Callee.get() == E->getCallee() &&
10843       !ArgChanged)
10844     return SemaRef.MaybeBindToTemporary(E);
10845 
10846   // FIXME: Wrong source location information for the '('.
10847   SourceLocation FakeLParenLoc
10848     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10849 
10850   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10851   if (E->hasStoredFPFeatures()) {
10852     FPOptionsOverride NewOverrides = E->getFPFeatures();
10853     getSema().CurFPFeatures =
10854         NewOverrides.applyOverrides(getSema().getLangOpts());
10855     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10856   }
10857 
10858   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10859                                       Args,
10860                                       E->getRParenLoc());
10861 }
10862 
10863 template<typename Derived>
10864 ExprResult
10865 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10866   ExprResult Base = getDerived().TransformExpr(E->getBase());
10867   if (Base.isInvalid())
10868     return ExprError();
10869 
10870   NestedNameSpecifierLoc QualifierLoc;
10871   if (E->hasQualifier()) {
10872     QualifierLoc
10873       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10874 
10875     if (!QualifierLoc)
10876       return ExprError();
10877   }
10878   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10879 
10880   ValueDecl *Member
10881     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10882                                                          E->getMemberDecl()));
10883   if (!Member)
10884     return ExprError();
10885 
10886   NamedDecl *FoundDecl = E->getFoundDecl();
10887   if (FoundDecl == E->getMemberDecl()) {
10888     FoundDecl = Member;
10889   } else {
10890     FoundDecl = cast_or_null<NamedDecl>(
10891                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10892     if (!FoundDecl)
10893       return ExprError();
10894   }
10895 
10896   if (!getDerived().AlwaysRebuild() &&
10897       Base.get() == E->getBase() &&
10898       QualifierLoc == E->getQualifierLoc() &&
10899       Member == E->getMemberDecl() &&
10900       FoundDecl == E->getFoundDecl() &&
10901       !E->hasExplicitTemplateArgs()) {
10902 
10903     // Mark it referenced in the new context regardless.
10904     // FIXME: this is a bit instantiation-specific.
10905     SemaRef.MarkMemberReferenced(E);
10906 
10907     return E;
10908   }
10909 
10910   TemplateArgumentListInfo TransArgs;
10911   if (E->hasExplicitTemplateArgs()) {
10912     TransArgs.setLAngleLoc(E->getLAngleLoc());
10913     TransArgs.setRAngleLoc(E->getRAngleLoc());
10914     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10915                                                 E->getNumTemplateArgs(),
10916                                                 TransArgs))
10917       return ExprError();
10918   }
10919 
10920   // FIXME: Bogus source location for the operator
10921   SourceLocation FakeOperatorLoc =
10922       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10923 
10924   // FIXME: to do this check properly, we will need to preserve the
10925   // first-qualifier-in-scope here, just in case we had a dependent
10926   // base (and therefore couldn't do the check) and a
10927   // nested-name-qualifier (and therefore could do the lookup).
10928   NamedDecl *FirstQualifierInScope = nullptr;
10929   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10930   if (MemberNameInfo.getName()) {
10931     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10932     if (!MemberNameInfo.getName())
10933       return ExprError();
10934   }
10935 
10936   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10937                                         E->isArrow(),
10938                                         QualifierLoc,
10939                                         TemplateKWLoc,
10940                                         MemberNameInfo,
10941                                         Member,
10942                                         FoundDecl,
10943                                         (E->hasExplicitTemplateArgs()
10944                                            ? &TransArgs : nullptr),
10945                                         FirstQualifierInScope);
10946 }
10947 
10948 template<typename Derived>
10949 ExprResult
10950 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10951   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10952   if (LHS.isInvalid())
10953     return ExprError();
10954 
10955   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10956   if (RHS.isInvalid())
10957     return ExprError();
10958 
10959   if (!getDerived().AlwaysRebuild() &&
10960       LHS.get() == E->getLHS() &&
10961       RHS.get() == E->getRHS())
10962     return E;
10963 
10964   if (E->isCompoundAssignmentOp())
10965     // FPFeatures has already been established from trailing storage
10966     return getDerived().RebuildBinaryOperator(
10967         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10968   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10969   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10970   getSema().CurFPFeatures =
10971       NewOverrides.applyOverrides(getSema().getLangOpts());
10972   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10973   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10974                                             LHS.get(), RHS.get());
10975 }
10976 
10977 template <typename Derived>
10978 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10979     CXXRewrittenBinaryOperator *E) {
10980   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10981 
10982   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10983   if (LHS.isInvalid())
10984     return ExprError();
10985 
10986   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10987   if (RHS.isInvalid())
10988     return ExprError();
10989 
10990   if (!getDerived().AlwaysRebuild() &&
10991       LHS.get() == Decomp.LHS &&
10992       RHS.get() == Decomp.RHS)
10993     return E;
10994 
10995   // Extract the already-resolved callee declarations so that we can restrict
10996   // ourselves to using them as the unqualified lookup results when rebuilding.
10997   UnresolvedSet<2> UnqualLookups;
10998   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10999                             const_cast<Expr *>(Decomp.InnerBinOp)};
11000   for (Expr *PossibleBinOp : PossibleBinOps) {
11001     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
11002     if (!Op)
11003       continue;
11004     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
11005     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
11006       continue;
11007 
11008     // Transform the callee in case we built a call to a local extern
11009     // declaration.
11010     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
11011         E->getOperatorLoc(), Callee->getFoundDecl()));
11012     if (!Found)
11013       return ExprError();
11014     UnqualLookups.addDecl(Found);
11015   }
11016 
11017   return getDerived().RebuildCXXRewrittenBinaryOperator(
11018       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
11019 }
11020 
11021 template<typename Derived>
11022 ExprResult
11023 TreeTransform<Derived>::TransformCompoundAssignOperator(
11024                                                       CompoundAssignOperator *E) {
11025   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11026   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
11027   getSema().CurFPFeatures =
11028       NewOverrides.applyOverrides(getSema().getLangOpts());
11029   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11030   return getDerived().TransformBinaryOperator(E);
11031 }
11032 
11033 template<typename Derived>
11034 ExprResult TreeTransform<Derived>::
11035 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
11036   // Just rebuild the common and RHS expressions and see whether we
11037   // get any changes.
11038 
11039   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
11040   if (commonExpr.isInvalid())
11041     return ExprError();
11042 
11043   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
11044   if (rhs.isInvalid())
11045     return ExprError();
11046 
11047   if (!getDerived().AlwaysRebuild() &&
11048       commonExpr.get() == e->getCommon() &&
11049       rhs.get() == e->getFalseExpr())
11050     return e;
11051 
11052   return getDerived().RebuildConditionalOperator(commonExpr.get(),
11053                                                  e->getQuestionLoc(),
11054                                                  nullptr,
11055                                                  e->getColonLoc(),
11056                                                  rhs.get());
11057 }
11058 
11059 template<typename Derived>
11060 ExprResult
11061 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
11062   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11063   if (Cond.isInvalid())
11064     return ExprError();
11065 
11066   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11067   if (LHS.isInvalid())
11068     return ExprError();
11069 
11070   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11071   if (RHS.isInvalid())
11072     return ExprError();
11073 
11074   if (!getDerived().AlwaysRebuild() &&
11075       Cond.get() == E->getCond() &&
11076       LHS.get() == E->getLHS() &&
11077       RHS.get() == E->getRHS())
11078     return E;
11079 
11080   return getDerived().RebuildConditionalOperator(Cond.get(),
11081                                                  E->getQuestionLoc(),
11082                                                  LHS.get(),
11083                                                  E->getColonLoc(),
11084                                                  RHS.get());
11085 }
11086 
11087 template<typename Derived>
11088 ExprResult
11089 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11090   // Implicit casts are eliminated during transformation, since they
11091   // will be recomputed by semantic analysis after transformation.
11092   return getDerived().TransformExpr(E->getSubExprAsWritten());
11093 }
11094 
11095 template<typename Derived>
11096 ExprResult
11097 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11098   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11099   if (!Type)
11100     return ExprError();
11101 
11102   ExprResult SubExpr
11103     = getDerived().TransformExpr(E->getSubExprAsWritten());
11104   if (SubExpr.isInvalid())
11105     return ExprError();
11106 
11107   if (!getDerived().AlwaysRebuild() &&
11108       Type == E->getTypeInfoAsWritten() &&
11109       SubExpr.get() == E->getSubExpr())
11110     return E;
11111 
11112   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11113                                             Type,
11114                                             E->getRParenLoc(),
11115                                             SubExpr.get());
11116 }
11117 
11118 template<typename Derived>
11119 ExprResult
11120 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11121   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11122   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11123   if (!NewT)
11124     return ExprError();
11125 
11126   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11127   if (Init.isInvalid())
11128     return ExprError();
11129 
11130   if (!getDerived().AlwaysRebuild() &&
11131       OldT == NewT &&
11132       Init.get() == E->getInitializer())
11133     return SemaRef.MaybeBindToTemporary(E);
11134 
11135   // Note: the expression type doesn't necessarily match the
11136   // type-as-written, but that's okay, because it should always be
11137   // derivable from the initializer.
11138 
11139   return getDerived().RebuildCompoundLiteralExpr(
11140       E->getLParenLoc(), NewT,
11141       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11142 }
11143 
11144 template<typename Derived>
11145 ExprResult
11146 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11147   ExprResult Base = getDerived().TransformExpr(E->getBase());
11148   if (Base.isInvalid())
11149     return ExprError();
11150 
11151   if (!getDerived().AlwaysRebuild() &&
11152       Base.get() == E->getBase())
11153     return E;
11154 
11155   // FIXME: Bad source location
11156   SourceLocation FakeOperatorLoc =
11157       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11158   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11159                                                   E->getAccessorLoc(),
11160                                                   E->getAccessor());
11161 }
11162 
11163 template<typename Derived>
11164 ExprResult
11165 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11166   if (InitListExpr *Syntactic = E->getSyntacticForm())
11167     E = Syntactic;
11168 
11169   bool InitChanged = false;
11170 
11171   EnterExpressionEvaluationContext Context(
11172       getSema(), EnterExpressionEvaluationContext::InitList);
11173 
11174   SmallVector<Expr*, 4> Inits;
11175   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11176                                   Inits, &InitChanged))
11177     return ExprError();
11178 
11179   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11180     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11181     // in some cases. We can't reuse it in general, because the syntactic and
11182     // semantic forms are linked, and we can't know that semantic form will
11183     // match even if the syntactic form does.
11184   }
11185 
11186   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11187                                       E->getRBraceLoc());
11188 }
11189 
11190 template<typename Derived>
11191 ExprResult
11192 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11193   Designation Desig;
11194 
11195   // transform the initializer value
11196   ExprResult Init = getDerived().TransformExpr(E->getInit());
11197   if (Init.isInvalid())
11198     return ExprError();
11199 
11200   // transform the designators.
11201   SmallVector<Expr*, 4> ArrayExprs;
11202   bool ExprChanged = false;
11203   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11204     if (D.isFieldDesignator()) {
11205       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11206                                                D.getDotLoc(),
11207                                                D.getFieldLoc()));
11208       if (D.getField()) {
11209         FieldDecl *Field = cast_or_null<FieldDecl>(
11210             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11211         if (Field != D.getField())
11212           // Rebuild the expression when the transformed FieldDecl is
11213           // different to the already assigned FieldDecl.
11214           ExprChanged = true;
11215       } else {
11216         // Ensure that the designator expression is rebuilt when there isn't
11217         // a resolved FieldDecl in the designator as we don't want to assign
11218         // a FieldDecl to a pattern designator that will be instantiated again.
11219         ExprChanged = true;
11220       }
11221       continue;
11222     }
11223 
11224     if (D.isArrayDesignator()) {
11225       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11226       if (Index.isInvalid())
11227         return ExprError();
11228 
11229       Desig.AddDesignator(
11230           Designator::getArray(Index.get(), D.getLBracketLoc()));
11231 
11232       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11233       ArrayExprs.push_back(Index.get());
11234       continue;
11235     }
11236 
11237     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11238     ExprResult Start
11239       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11240     if (Start.isInvalid())
11241       return ExprError();
11242 
11243     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11244     if (End.isInvalid())
11245       return ExprError();
11246 
11247     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11248                                                   End.get(),
11249                                                   D.getLBracketLoc(),
11250                                                   D.getEllipsisLoc()));
11251 
11252     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11253                   End.get() != E->getArrayRangeEnd(D);
11254 
11255     ArrayExprs.push_back(Start.get());
11256     ArrayExprs.push_back(End.get());
11257   }
11258 
11259   if (!getDerived().AlwaysRebuild() &&
11260       Init.get() == E->getInit() &&
11261       !ExprChanged)
11262     return E;
11263 
11264   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11265                                                 E->getEqualOrColonLoc(),
11266                                                 E->usesGNUSyntax(), Init.get());
11267 }
11268 
11269 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11270 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11271 template<typename Derived>
11272 ExprResult
11273 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11274     DesignatedInitUpdateExpr *E) {
11275   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11276                    "initializer");
11277   return ExprError();
11278 }
11279 
11280 template<typename Derived>
11281 ExprResult
11282 TreeTransform<Derived>::TransformNoInitExpr(
11283     NoInitExpr *E) {
11284   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11285   return ExprError();
11286 }
11287 
11288 template<typename Derived>
11289 ExprResult
11290 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11291   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11292   return ExprError();
11293 }
11294 
11295 template<typename Derived>
11296 ExprResult
11297 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11298   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11299   return ExprError();
11300 }
11301 
11302 template<typename Derived>
11303 ExprResult
11304 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11305                                                      ImplicitValueInitExpr *E) {
11306   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11307 
11308   // FIXME: Will we ever have proper type location here? Will we actually
11309   // need to transform the type?
11310   QualType T = getDerived().TransformType(E->getType());
11311   if (T.isNull())
11312     return ExprError();
11313 
11314   if (!getDerived().AlwaysRebuild() &&
11315       T == E->getType())
11316     return E;
11317 
11318   return getDerived().RebuildImplicitValueInitExpr(T);
11319 }
11320 
11321 template<typename Derived>
11322 ExprResult
11323 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11324   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11325   if (!TInfo)
11326     return ExprError();
11327 
11328   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11329   if (SubExpr.isInvalid())
11330     return ExprError();
11331 
11332   if (!getDerived().AlwaysRebuild() &&
11333       TInfo == E->getWrittenTypeInfo() &&
11334       SubExpr.get() == E->getSubExpr())
11335     return E;
11336 
11337   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11338                                        TInfo, E->getRParenLoc());
11339 }
11340 
11341 template<typename Derived>
11342 ExprResult
11343 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11344   bool ArgumentChanged = false;
11345   SmallVector<Expr*, 4> Inits;
11346   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11347                      &ArgumentChanged))
11348     return ExprError();
11349 
11350   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11351                                            Inits,
11352                                            E->getRParenLoc());
11353 }
11354 
11355 /// Transform an address-of-label expression.
11356 ///
11357 /// By default, the transformation of an address-of-label expression always
11358 /// rebuilds the expression, so that the label identifier can be resolved to
11359 /// the corresponding label statement by semantic analysis.
11360 template<typename Derived>
11361 ExprResult
11362 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11363   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11364                                         E->getLabel());
11365   if (!LD)
11366     return ExprError();
11367 
11368   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11369                                            cast<LabelDecl>(LD));
11370 }
11371 
11372 template<typename Derived>
11373 ExprResult
11374 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11375   SemaRef.ActOnStartStmtExpr();
11376   StmtResult SubStmt
11377     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11378   if (SubStmt.isInvalid()) {
11379     SemaRef.ActOnStmtExprError();
11380     return ExprError();
11381   }
11382 
11383   unsigned OldDepth = E->getTemplateDepth();
11384   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11385 
11386   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11387       SubStmt.get() == E->getSubStmt()) {
11388     // Calling this an 'error' is unintuitive, but it does the right thing.
11389     SemaRef.ActOnStmtExprError();
11390     return SemaRef.MaybeBindToTemporary(E);
11391   }
11392 
11393   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11394                                       E->getRParenLoc(), NewDepth);
11395 }
11396 
11397 template<typename Derived>
11398 ExprResult
11399 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11400   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11401   if (Cond.isInvalid())
11402     return ExprError();
11403 
11404   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11405   if (LHS.isInvalid())
11406     return ExprError();
11407 
11408   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11409   if (RHS.isInvalid())
11410     return ExprError();
11411 
11412   if (!getDerived().AlwaysRebuild() &&
11413       Cond.get() == E->getCond() &&
11414       LHS.get() == E->getLHS() &&
11415       RHS.get() == E->getRHS())
11416     return E;
11417 
11418   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11419                                         Cond.get(), LHS.get(), RHS.get(),
11420                                         E->getRParenLoc());
11421 }
11422 
11423 template<typename Derived>
11424 ExprResult
11425 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11426   return E;
11427 }
11428 
11429 template<typename Derived>
11430 ExprResult
11431 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11432   switch (E->getOperator()) {
11433   case OO_New:
11434   case OO_Delete:
11435   case OO_Array_New:
11436   case OO_Array_Delete:
11437     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11438 
11439   case OO_Call: {
11440     // This is a call to an object's operator().
11441     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11442 
11443     // Transform the object itself.
11444     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11445     if (Object.isInvalid())
11446       return ExprError();
11447 
11448     // FIXME: Poor location information
11449     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11450         static_cast<Expr *>(Object.get())->getEndLoc());
11451 
11452     // Transform the call arguments.
11453     SmallVector<Expr*, 8> Args;
11454     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11455                                     Args))
11456       return ExprError();
11457 
11458     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11459                                         E->getEndLoc());
11460   }
11461 
11462 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11463   case OO_##Name:
11464 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11465 #include "clang/Basic/OperatorKinds.def"
11466   case OO_Subscript:
11467     // Handled below.
11468     break;
11469 
11470   case OO_Conditional:
11471     llvm_unreachable("conditional operator is not actually overloadable");
11472 
11473   case OO_None:
11474   case NUM_OVERLOADED_OPERATORS:
11475     llvm_unreachable("not an overloaded operator?");
11476   }
11477 
11478   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11479   if (Callee.isInvalid())
11480     return ExprError();
11481 
11482   ExprResult First;
11483   if (E->getOperator() == OO_Amp)
11484     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11485   else
11486     First = getDerived().TransformExpr(E->getArg(0));
11487   if (First.isInvalid())
11488     return ExprError();
11489 
11490   ExprResult Second;
11491   if (E->getNumArgs() == 2) {
11492     Second = getDerived().TransformExpr(E->getArg(1));
11493     if (Second.isInvalid())
11494       return ExprError();
11495   }
11496 
11497   if (!getDerived().AlwaysRebuild() &&
11498       Callee.get() == E->getCallee() &&
11499       First.get() == E->getArg(0) &&
11500       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11501     return SemaRef.MaybeBindToTemporary(E);
11502 
11503   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11504   FPOptionsOverride NewOverrides(E->getFPFeatures());
11505   getSema().CurFPFeatures =
11506       NewOverrides.applyOverrides(getSema().getLangOpts());
11507   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11508 
11509   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11510                                                  E->getOperatorLoc(),
11511                                                  Callee.get(),
11512                                                  First.get(),
11513                                                  Second.get());
11514 }
11515 
11516 template<typename Derived>
11517 ExprResult
11518 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11519   return getDerived().TransformCallExpr(E);
11520 }
11521 
11522 template <typename Derived>
11523 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11524   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11525                          getSema().CurContext != E->getParentContext();
11526 
11527   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11528     return E;
11529 
11530   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11531                                            E->getEndLoc(),
11532                                            getSema().CurContext);
11533 }
11534 
11535 template<typename Derived>
11536 ExprResult
11537 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11538   // Transform the callee.
11539   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11540   if (Callee.isInvalid())
11541     return ExprError();
11542 
11543   // Transform exec config.
11544   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11545   if (EC.isInvalid())
11546     return ExprError();
11547 
11548   // Transform arguments.
11549   bool ArgChanged = false;
11550   SmallVector<Expr*, 8> Args;
11551   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11552                                   &ArgChanged))
11553     return ExprError();
11554 
11555   if (!getDerived().AlwaysRebuild() &&
11556       Callee.get() == E->getCallee() &&
11557       !ArgChanged)
11558     return SemaRef.MaybeBindToTemporary(E);
11559 
11560   // FIXME: Wrong source location information for the '('.
11561   SourceLocation FakeLParenLoc
11562     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11563   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11564                                       Args,
11565                                       E->getRParenLoc(), EC.get());
11566 }
11567 
11568 template<typename Derived>
11569 ExprResult
11570 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11571   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11572   if (!Type)
11573     return ExprError();
11574 
11575   ExprResult SubExpr
11576     = getDerived().TransformExpr(E->getSubExprAsWritten());
11577   if (SubExpr.isInvalid())
11578     return ExprError();
11579 
11580   if (!getDerived().AlwaysRebuild() &&
11581       Type == E->getTypeInfoAsWritten() &&
11582       SubExpr.get() == E->getSubExpr())
11583     return E;
11584   return getDerived().RebuildCXXNamedCastExpr(
11585       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11586       Type, E->getAngleBrackets().getEnd(),
11587       // FIXME. this should be '(' location
11588       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11589 }
11590 
11591 template<typename Derived>
11592 ExprResult
11593 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11594   TypeSourceInfo *TSI =
11595       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11596   if (!TSI)
11597     return ExprError();
11598 
11599   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11600   if (Sub.isInvalid())
11601     return ExprError();
11602 
11603   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11604                                                 Sub.get(), BCE->getEndLoc());
11605 }
11606 
11607 template<typename Derived>
11608 ExprResult
11609 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11610   return getDerived().TransformCXXNamedCastExpr(E);
11611 }
11612 
11613 template<typename Derived>
11614 ExprResult
11615 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11616   return getDerived().TransformCXXNamedCastExpr(E);
11617 }
11618 
11619 template<typename Derived>
11620 ExprResult
11621 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11622                                                       CXXReinterpretCastExpr *E) {
11623   return getDerived().TransformCXXNamedCastExpr(E);
11624 }
11625 
11626 template<typename Derived>
11627 ExprResult
11628 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11629   return getDerived().TransformCXXNamedCastExpr(E);
11630 }
11631 
11632 template<typename Derived>
11633 ExprResult
11634 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11635   return getDerived().TransformCXXNamedCastExpr(E);
11636 }
11637 
11638 template<typename Derived>
11639 ExprResult
11640 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11641                                                      CXXFunctionalCastExpr *E) {
11642   TypeSourceInfo *Type =
11643       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11644   if (!Type)
11645     return ExprError();
11646 
11647   ExprResult SubExpr
11648     = getDerived().TransformExpr(E->getSubExprAsWritten());
11649   if (SubExpr.isInvalid())
11650     return ExprError();
11651 
11652   if (!getDerived().AlwaysRebuild() &&
11653       Type == E->getTypeInfoAsWritten() &&
11654       SubExpr.get() == E->getSubExpr())
11655     return E;
11656 
11657   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11658                                                    E->getLParenLoc(),
11659                                                    SubExpr.get(),
11660                                                    E->getRParenLoc(),
11661                                                    E->isListInitialization());
11662 }
11663 
11664 template<typename Derived>
11665 ExprResult
11666 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11667   if (E->isTypeOperand()) {
11668     TypeSourceInfo *TInfo
11669       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11670     if (!TInfo)
11671       return ExprError();
11672 
11673     if (!getDerived().AlwaysRebuild() &&
11674         TInfo == E->getTypeOperandSourceInfo())
11675       return E;
11676 
11677     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11678                                              TInfo, E->getEndLoc());
11679   }
11680 
11681   // Typeid's operand is an unevaluated context, unless it's a polymorphic
11682   // type.  We must not unilaterally enter unevaluated context here, as then
11683   // semantic processing can re-transform an already transformed operand.
11684   Expr *Op = E->getExprOperand();
11685   auto EvalCtx = Sema::ExpressionEvaluationContext::Unevaluated;
11686   if (E->isGLValue())
11687     if (auto *RecordT = Op->getType()->getAs<RecordType>())
11688       if (cast<CXXRecordDecl>(RecordT->getDecl())->isPolymorphic())
11689         EvalCtx = SemaRef.ExprEvalContexts.back().Context;
11690 
11691   EnterExpressionEvaluationContext Unevaluated(SemaRef, EvalCtx,
11692                                                Sema::ReuseLambdaContextDecl);
11693 
11694   ExprResult SubExpr = getDerived().TransformExpr(Op);
11695   if (SubExpr.isInvalid())
11696     return ExprError();
11697 
11698   if (!getDerived().AlwaysRebuild() &&
11699       SubExpr.get() == E->getExprOperand())
11700     return E;
11701 
11702   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11703                                            SubExpr.get(), E->getEndLoc());
11704 }
11705 
11706 template<typename Derived>
11707 ExprResult
11708 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11709   if (E->isTypeOperand()) {
11710     TypeSourceInfo *TInfo
11711       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11712     if (!TInfo)
11713       return ExprError();
11714 
11715     if (!getDerived().AlwaysRebuild() &&
11716         TInfo == E->getTypeOperandSourceInfo())
11717       return E;
11718 
11719     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11720                                              TInfo, E->getEndLoc());
11721   }
11722 
11723   EnterExpressionEvaluationContext Unevaluated(
11724       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11725 
11726   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11727   if (SubExpr.isInvalid())
11728     return ExprError();
11729 
11730   if (!getDerived().AlwaysRebuild() &&
11731       SubExpr.get() == E->getExprOperand())
11732     return E;
11733 
11734   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11735                                            SubExpr.get(), E->getEndLoc());
11736 }
11737 
11738 template<typename Derived>
11739 ExprResult
11740 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11741   return E;
11742 }
11743 
11744 template<typename Derived>
11745 ExprResult
11746 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11747                                                      CXXNullPtrLiteralExpr *E) {
11748   return E;
11749 }
11750 
11751 template<typename Derived>
11752 ExprResult
11753 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11754   QualType T = getSema().getCurrentThisType();
11755 
11756   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11757     // Mark it referenced in the new context regardless.
11758     // FIXME: this is a bit instantiation-specific.
11759     getSema().MarkThisReferenced(E);
11760     return E;
11761   }
11762 
11763   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11764 }
11765 
11766 template<typename Derived>
11767 ExprResult
11768 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11769   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11770   if (SubExpr.isInvalid())
11771     return ExprError();
11772 
11773   if (!getDerived().AlwaysRebuild() &&
11774       SubExpr.get() == E->getSubExpr())
11775     return E;
11776 
11777   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11778                                           E->isThrownVariableInScope());
11779 }
11780 
11781 template<typename Derived>
11782 ExprResult
11783 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11784   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11785       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11786   if (!Param)
11787     return ExprError();
11788 
11789   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11790       E->getUsedContext() == SemaRef.CurContext)
11791     return E;
11792 
11793   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11794 }
11795 
11796 template<typename Derived>
11797 ExprResult
11798 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11799   FieldDecl *Field = cast_or_null<FieldDecl>(
11800       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11801   if (!Field)
11802     return ExprError();
11803 
11804   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11805       E->getUsedContext() == SemaRef.CurContext)
11806     return E;
11807 
11808   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11809 }
11810 
11811 template<typename Derived>
11812 ExprResult
11813 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11814                                                     CXXScalarValueInitExpr *E) {
11815   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11816   if (!T)
11817     return ExprError();
11818 
11819   if (!getDerived().AlwaysRebuild() &&
11820       T == E->getTypeSourceInfo())
11821     return E;
11822 
11823   return getDerived().RebuildCXXScalarValueInitExpr(T,
11824                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11825                                                     E->getRParenLoc());
11826 }
11827 
11828 template<typename Derived>
11829 ExprResult
11830 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11831   // Transform the type that we're allocating
11832   TypeSourceInfo *AllocTypeInfo =
11833       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11834   if (!AllocTypeInfo)
11835     return ExprError();
11836 
11837   // Transform the size of the array we're allocating (if any).
11838   Optional<Expr *> ArraySize;
11839   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11840     ExprResult NewArraySize;
11841     if (*OldArraySize) {
11842       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11843       if (NewArraySize.isInvalid())
11844         return ExprError();
11845     }
11846     ArraySize = NewArraySize.get();
11847   }
11848 
11849   // Transform the placement arguments (if any).
11850   bool ArgumentChanged = false;
11851   SmallVector<Expr*, 8> PlacementArgs;
11852   if (getDerived().TransformExprs(E->getPlacementArgs(),
11853                                   E->getNumPlacementArgs(), true,
11854                                   PlacementArgs, &ArgumentChanged))
11855     return ExprError();
11856 
11857   // Transform the initializer (if any).
11858   Expr *OldInit = E->getInitializer();
11859   ExprResult NewInit;
11860   if (OldInit)
11861     NewInit = getDerived().TransformInitializer(OldInit, true);
11862   if (NewInit.isInvalid())
11863     return ExprError();
11864 
11865   // Transform new operator and delete operator.
11866   FunctionDecl *OperatorNew = nullptr;
11867   if (E->getOperatorNew()) {
11868     OperatorNew = cast_or_null<FunctionDecl>(
11869         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11870     if (!OperatorNew)
11871       return ExprError();
11872   }
11873 
11874   FunctionDecl *OperatorDelete = nullptr;
11875   if (E->getOperatorDelete()) {
11876     OperatorDelete = cast_or_null<FunctionDecl>(
11877         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11878     if (!OperatorDelete)
11879       return ExprError();
11880   }
11881 
11882   if (!getDerived().AlwaysRebuild() &&
11883       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11884       ArraySize == E->getArraySize() &&
11885       NewInit.get() == OldInit &&
11886       OperatorNew == E->getOperatorNew() &&
11887       OperatorDelete == E->getOperatorDelete() &&
11888       !ArgumentChanged) {
11889     // Mark any declarations we need as referenced.
11890     // FIXME: instantiation-specific.
11891     if (OperatorNew)
11892       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11893     if (OperatorDelete)
11894       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11895 
11896     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11897       QualType ElementType
11898         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11899       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11900         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11901         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11902           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11903         }
11904       }
11905     }
11906 
11907     return E;
11908   }
11909 
11910   QualType AllocType = AllocTypeInfo->getType();
11911   if (!ArraySize) {
11912     // If no array size was specified, but the new expression was
11913     // instantiated with an array type (e.g., "new T" where T is
11914     // instantiated with "int[4]"), extract the outer bound from the
11915     // array type as our array size. We do this with constant and
11916     // dependently-sized array types.
11917     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11918     if (!ArrayT) {
11919       // Do nothing
11920     } else if (const ConstantArrayType *ConsArrayT
11921                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11922       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11923                                          SemaRef.Context.getSizeType(),
11924                                          /*FIXME:*/ E->getBeginLoc());
11925       AllocType = ConsArrayT->getElementType();
11926     } else if (const DependentSizedArrayType *DepArrayT
11927                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11928       if (DepArrayT->getSizeExpr()) {
11929         ArraySize = DepArrayT->getSizeExpr();
11930         AllocType = DepArrayT->getElementType();
11931       }
11932     }
11933   }
11934 
11935   return getDerived().RebuildCXXNewExpr(
11936       E->getBeginLoc(), E->isGlobalNew(),
11937       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11938       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11939       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11940 }
11941 
11942 template<typename Derived>
11943 ExprResult
11944 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11945   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11946   if (Operand.isInvalid())
11947     return ExprError();
11948 
11949   // Transform the delete operator, if known.
11950   FunctionDecl *OperatorDelete = nullptr;
11951   if (E->getOperatorDelete()) {
11952     OperatorDelete = cast_or_null<FunctionDecl>(
11953         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11954     if (!OperatorDelete)
11955       return ExprError();
11956   }
11957 
11958   if (!getDerived().AlwaysRebuild() &&
11959       Operand.get() == E->getArgument() &&
11960       OperatorDelete == E->getOperatorDelete()) {
11961     // Mark any declarations we need as referenced.
11962     // FIXME: instantiation-specific.
11963     if (OperatorDelete)
11964       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11965 
11966     if (!E->getArgument()->isTypeDependent()) {
11967       QualType Destroyed = SemaRef.Context.getBaseElementType(
11968                                                          E->getDestroyedType());
11969       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11970         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11971         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11972                                        SemaRef.LookupDestructor(Record));
11973       }
11974     }
11975 
11976     return E;
11977   }
11978 
11979   return getDerived().RebuildCXXDeleteExpr(
11980       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11981 }
11982 
11983 template<typename Derived>
11984 ExprResult
11985 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11986                                                      CXXPseudoDestructorExpr *E) {
11987   ExprResult Base = getDerived().TransformExpr(E->getBase());
11988   if (Base.isInvalid())
11989     return ExprError();
11990 
11991   ParsedType ObjectTypePtr;
11992   bool MayBePseudoDestructor = false;
11993   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11994                                               E->getOperatorLoc(),
11995                                         E->isArrow()? tok::arrow : tok::period,
11996                                               ObjectTypePtr,
11997                                               MayBePseudoDestructor);
11998   if (Base.isInvalid())
11999     return ExprError();
12000 
12001   QualType ObjectType = ObjectTypePtr.get();
12002   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
12003   if (QualifierLoc) {
12004     QualifierLoc
12005       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
12006     if (!QualifierLoc)
12007       return ExprError();
12008   }
12009   CXXScopeSpec SS;
12010   SS.Adopt(QualifierLoc);
12011 
12012   PseudoDestructorTypeStorage Destroyed;
12013   if (E->getDestroyedTypeInfo()) {
12014     TypeSourceInfo *DestroyedTypeInfo
12015       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
12016                                                 ObjectType, nullptr, SS);
12017     if (!DestroyedTypeInfo)
12018       return ExprError();
12019     Destroyed = DestroyedTypeInfo;
12020   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
12021     // We aren't likely to be able to resolve the identifier down to a type
12022     // now anyway, so just retain the identifier.
12023     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
12024                                             E->getDestroyedTypeLoc());
12025   } else {
12026     // Look for a destructor known with the given name.
12027     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
12028                                               *E->getDestroyedTypeIdentifier(),
12029                                                 E->getDestroyedTypeLoc(),
12030                                                 /*Scope=*/nullptr,
12031                                                 SS, ObjectTypePtr,
12032                                                 false);
12033     if (!T)
12034       return ExprError();
12035 
12036     Destroyed
12037       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
12038                                                  E->getDestroyedTypeLoc());
12039   }
12040 
12041   TypeSourceInfo *ScopeTypeInfo = nullptr;
12042   if (E->getScopeTypeInfo()) {
12043     CXXScopeSpec EmptySS;
12044     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
12045                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
12046     if (!ScopeTypeInfo)
12047       return ExprError();
12048   }
12049 
12050   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
12051                                                      E->getOperatorLoc(),
12052                                                      E->isArrow(),
12053                                                      SS,
12054                                                      ScopeTypeInfo,
12055                                                      E->getColonColonLoc(),
12056                                                      E->getTildeLoc(),
12057                                                      Destroyed);
12058 }
12059 
12060 template <typename Derived>
12061 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
12062                                                         bool RequiresADL,
12063                                                         LookupResult &R) {
12064   // Transform all the decls.
12065   bool AllEmptyPacks = true;
12066   for (auto *OldD : Old->decls()) {
12067     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
12068     if (!InstD) {
12069       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
12070       // This can happen because of dependent hiding.
12071       if (isa<UsingShadowDecl>(OldD))
12072         continue;
12073       else {
12074         R.clear();
12075         return true;
12076       }
12077     }
12078 
12079     // Expand using pack declarations.
12080     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
12081     ArrayRef<NamedDecl*> Decls = SingleDecl;
12082     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
12083       Decls = UPD->expansions();
12084 
12085     // Expand using declarations.
12086     for (auto *D : Decls) {
12087       if (auto *UD = dyn_cast<UsingDecl>(D)) {
12088         for (auto *SD : UD->shadows())
12089           R.addDecl(SD);
12090       } else {
12091         R.addDecl(D);
12092       }
12093     }
12094 
12095     AllEmptyPacks &= Decls.empty();
12096   };
12097 
12098   // C++ [temp.res]/8.4.2:
12099   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12100   //   a name in the template definition found a using-declaration, but the
12101   //   lookup in the corresponding scope in the instantiation odoes not find
12102   //   any declarations because the using-declaration was a pack expansion and
12103   //   the corresponding pack is empty
12104   if (AllEmptyPacks && !RequiresADL) {
12105     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12106         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12107     return true;
12108   }
12109 
12110   // Resolve a kind, but don't do any further analysis.  If it's
12111   // ambiguous, the callee needs to deal with it.
12112   R.resolveKind();
12113   return false;
12114 }
12115 
12116 template<typename Derived>
12117 ExprResult
12118 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12119                                                   UnresolvedLookupExpr *Old) {
12120   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12121                  Sema::LookupOrdinaryName);
12122 
12123   // Transform the declaration set.
12124   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12125     return ExprError();
12126 
12127   // Rebuild the nested-name qualifier, if present.
12128   CXXScopeSpec SS;
12129   if (Old->getQualifierLoc()) {
12130     NestedNameSpecifierLoc QualifierLoc
12131       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12132     if (!QualifierLoc)
12133       return ExprError();
12134 
12135     SS.Adopt(QualifierLoc);
12136   }
12137 
12138   if (Old->getNamingClass()) {
12139     CXXRecordDecl *NamingClass
12140       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12141                                                             Old->getNameLoc(),
12142                                                         Old->getNamingClass()));
12143     if (!NamingClass) {
12144       R.clear();
12145       return ExprError();
12146     }
12147 
12148     R.setNamingClass(NamingClass);
12149   }
12150 
12151   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12152 
12153   // If we have neither explicit template arguments, nor the template keyword,
12154   // it's a normal declaration name or member reference.
12155   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12156     NamedDecl *D = R.getAsSingle<NamedDecl>();
12157     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12158     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12159     // give a good diagnostic.
12160     if (D && D->isCXXInstanceMember()) {
12161       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12162                                                      /*TemplateArgs=*/nullptr,
12163                                                      /*Scope=*/nullptr);
12164     }
12165 
12166     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12167   }
12168 
12169   // If we have template arguments, rebuild them, then rebuild the
12170   // templateid expression.
12171   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12172   if (Old->hasExplicitTemplateArgs() &&
12173       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12174                                               Old->getNumTemplateArgs(),
12175                                               TransArgs)) {
12176     R.clear();
12177     return ExprError();
12178   }
12179 
12180   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12181                                             Old->requiresADL(), &TransArgs);
12182 }
12183 
12184 template<typename Derived>
12185 ExprResult
12186 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12187   bool ArgChanged = false;
12188   SmallVector<TypeSourceInfo *, 4> Args;
12189   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12190     TypeSourceInfo *From = E->getArg(I);
12191     TypeLoc FromTL = From->getTypeLoc();
12192     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12193       TypeLocBuilder TLB;
12194       TLB.reserve(FromTL.getFullDataSize());
12195       QualType To = getDerived().TransformType(TLB, FromTL);
12196       if (To.isNull())
12197         return ExprError();
12198 
12199       if (To == From->getType())
12200         Args.push_back(From);
12201       else {
12202         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12203         ArgChanged = true;
12204       }
12205       continue;
12206     }
12207 
12208     ArgChanged = true;
12209 
12210     // We have a pack expansion. Instantiate it.
12211     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12212     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12213     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12214     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12215 
12216     // Determine whether the set of unexpanded parameter packs can and should
12217     // be expanded.
12218     bool Expand = true;
12219     bool RetainExpansion = false;
12220     Optional<unsigned> OrigNumExpansions =
12221         ExpansionTL.getTypePtr()->getNumExpansions();
12222     Optional<unsigned> NumExpansions = OrigNumExpansions;
12223     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12224                                              PatternTL.getSourceRange(),
12225                                              Unexpanded,
12226                                              Expand, RetainExpansion,
12227                                              NumExpansions))
12228       return ExprError();
12229 
12230     if (!Expand) {
12231       // The transform has determined that we should perform a simple
12232       // transformation on the pack expansion, producing another pack
12233       // expansion.
12234       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12235 
12236       TypeLocBuilder TLB;
12237       TLB.reserve(From->getTypeLoc().getFullDataSize());
12238 
12239       QualType To = getDerived().TransformType(TLB, PatternTL);
12240       if (To.isNull())
12241         return ExprError();
12242 
12243       To = getDerived().RebuildPackExpansionType(To,
12244                                                  PatternTL.getSourceRange(),
12245                                                  ExpansionTL.getEllipsisLoc(),
12246                                                  NumExpansions);
12247       if (To.isNull())
12248         return ExprError();
12249 
12250       PackExpansionTypeLoc ToExpansionTL
12251         = TLB.push<PackExpansionTypeLoc>(To);
12252       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12253       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12254       continue;
12255     }
12256 
12257     // Expand the pack expansion by substituting for each argument in the
12258     // pack(s).
12259     for (unsigned I = 0; I != *NumExpansions; ++I) {
12260       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12261       TypeLocBuilder TLB;
12262       TLB.reserve(PatternTL.getFullDataSize());
12263       QualType To = getDerived().TransformType(TLB, PatternTL);
12264       if (To.isNull())
12265         return ExprError();
12266 
12267       if (To->containsUnexpandedParameterPack()) {
12268         To = getDerived().RebuildPackExpansionType(To,
12269                                                    PatternTL.getSourceRange(),
12270                                                    ExpansionTL.getEllipsisLoc(),
12271                                                    NumExpansions);
12272         if (To.isNull())
12273           return ExprError();
12274 
12275         PackExpansionTypeLoc ToExpansionTL
12276           = TLB.push<PackExpansionTypeLoc>(To);
12277         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12278       }
12279 
12280       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12281     }
12282 
12283     if (!RetainExpansion)
12284       continue;
12285 
12286     // If we're supposed to retain a pack expansion, do so by temporarily
12287     // forgetting the partially-substituted parameter pack.
12288     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12289 
12290     TypeLocBuilder TLB;
12291     TLB.reserve(From->getTypeLoc().getFullDataSize());
12292 
12293     QualType To = getDerived().TransformType(TLB, PatternTL);
12294     if (To.isNull())
12295       return ExprError();
12296 
12297     To = getDerived().RebuildPackExpansionType(To,
12298                                                PatternTL.getSourceRange(),
12299                                                ExpansionTL.getEllipsisLoc(),
12300                                                NumExpansions);
12301     if (To.isNull())
12302       return ExprError();
12303 
12304     PackExpansionTypeLoc ToExpansionTL
12305       = TLB.push<PackExpansionTypeLoc>(To);
12306     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12307     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12308   }
12309 
12310   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12311     return E;
12312 
12313   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12314                                        E->getEndLoc());
12315 }
12316 
12317 template<typename Derived>
12318 ExprResult
12319 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12320                                                  ConceptSpecializationExpr *E) {
12321   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12322   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12323   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12324                                               Old->NumTemplateArgs, TransArgs))
12325     return ExprError();
12326 
12327   return getDerived().RebuildConceptSpecializationExpr(
12328       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12329       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12330       &TransArgs);
12331 }
12332 
12333 template<typename Derived>
12334 ExprResult
12335 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12336   SmallVector<ParmVarDecl*, 4> TransParams;
12337   SmallVector<QualType, 4> TransParamTypes;
12338   Sema::ExtParameterInfoBuilder ExtParamInfos;
12339 
12340   // C++2a [expr.prim.req]p2
12341   // Expressions appearing within a requirement-body are unevaluated operands.
12342   EnterExpressionEvaluationContext Ctx(
12343       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12344 
12345   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12346       getSema().Context, getSema().CurContext,
12347       E->getBody()->getBeginLoc());
12348 
12349   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12350 
12351   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12352                                                E->getLocalParameters(),
12353                                                /*ParamTypes=*/nullptr,
12354                                                /*ParamInfos=*/nullptr,
12355                                                TransParamTypes, &TransParams,
12356                                                ExtParamInfos))
12357     return ExprError();
12358 
12359   for (ParmVarDecl *Param : TransParams)
12360     Param->setDeclContext(Body);
12361 
12362   SmallVector<concepts::Requirement *, 4> TransReqs;
12363   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12364                                                      TransReqs))
12365     return ExprError();
12366 
12367   for (concepts::Requirement *Req : TransReqs) {
12368     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12369       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12370         ER->getReturnTypeRequirement()
12371                 .getTypeConstraintTemplateParameterList()->getParam(0)
12372                 ->setDeclContext(Body);
12373       }
12374     }
12375   }
12376 
12377   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12378                                           TransParams, TransReqs,
12379                                           E->getRBraceLoc());
12380 }
12381 
12382 template<typename Derived>
12383 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12384     ArrayRef<concepts::Requirement *> Reqs,
12385     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12386   for (concepts::Requirement *Req : Reqs) {
12387     concepts::Requirement *TransReq = nullptr;
12388     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12389       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12390     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12391       TransReq = getDerived().TransformExprRequirement(ExprReq);
12392     else
12393       TransReq = getDerived().TransformNestedRequirement(
12394                      cast<concepts::NestedRequirement>(Req));
12395     if (!TransReq)
12396       return true;
12397     Transformed.push_back(TransReq);
12398   }
12399   return false;
12400 }
12401 
12402 template<typename Derived>
12403 concepts::TypeRequirement *
12404 TreeTransform<Derived>::TransformTypeRequirement(
12405     concepts::TypeRequirement *Req) {
12406   if (Req->isSubstitutionFailure()) {
12407     if (getDerived().AlwaysRebuild())
12408       return getDerived().RebuildTypeRequirement(
12409               Req->getSubstitutionDiagnostic());
12410     return Req;
12411   }
12412   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12413   if (!TransType)
12414     return nullptr;
12415   return getDerived().RebuildTypeRequirement(TransType);
12416 }
12417 
12418 template<typename Derived>
12419 concepts::ExprRequirement *
12420 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12421   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12422   if (Req->isExprSubstitutionFailure())
12423     TransExpr = Req->getExprSubstitutionDiagnostic();
12424   else {
12425     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12426     if (TransExprRes.isInvalid())
12427       return nullptr;
12428     TransExpr = TransExprRes.get();
12429   }
12430 
12431   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12432   const auto &RetReq = Req->getReturnTypeRequirement();
12433   if (RetReq.isEmpty())
12434     TransRetReq.emplace();
12435   else if (RetReq.isSubstitutionFailure())
12436     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12437   else if (RetReq.isTypeConstraint()) {
12438     TemplateParameterList *OrigTPL =
12439         RetReq.getTypeConstraintTemplateParameterList();
12440     TemplateParameterList *TPL =
12441         getDerived().TransformTemplateParameterList(OrigTPL);
12442     if (!TPL)
12443       return nullptr;
12444     TransRetReq.emplace(TPL);
12445   }
12446   assert(TransRetReq.hasValue() &&
12447          "All code paths leading here must set TransRetReq");
12448   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12449     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12450                                                Req->getNoexceptLoc(),
12451                                                std::move(*TransRetReq));
12452   return getDerived().RebuildExprRequirement(
12453       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12454       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12455 }
12456 
12457 template<typename Derived>
12458 concepts::NestedRequirement *
12459 TreeTransform<Derived>::TransformNestedRequirement(
12460     concepts::NestedRequirement *Req) {
12461   if (Req->isSubstitutionFailure()) {
12462     if (getDerived().AlwaysRebuild())
12463       return getDerived().RebuildNestedRequirement(
12464           Req->getSubstitutionDiagnostic());
12465     return Req;
12466   }
12467   ExprResult TransConstraint =
12468       getDerived().TransformExpr(Req->getConstraintExpr());
12469   if (TransConstraint.isInvalid())
12470     return nullptr;
12471   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12472 }
12473 
12474 template<typename Derived>
12475 ExprResult
12476 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12477   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12478   if (!T)
12479     return ExprError();
12480 
12481   if (!getDerived().AlwaysRebuild() &&
12482       T == E->getQueriedTypeSourceInfo())
12483     return E;
12484 
12485   ExprResult SubExpr;
12486   {
12487     EnterExpressionEvaluationContext Unevaluated(
12488         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12489     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12490     if (SubExpr.isInvalid())
12491       return ExprError();
12492 
12493     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12494       return E;
12495   }
12496 
12497   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12498                                             SubExpr.get(), E->getEndLoc());
12499 }
12500 
12501 template<typename Derived>
12502 ExprResult
12503 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12504   ExprResult SubExpr;
12505   {
12506     EnterExpressionEvaluationContext Unevaluated(
12507         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12508     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12509     if (SubExpr.isInvalid())
12510       return ExprError();
12511 
12512     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12513       return E;
12514   }
12515 
12516   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12517                                              SubExpr.get(), E->getEndLoc());
12518 }
12519 
12520 template <typename Derived>
12521 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12522     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12523     TypeSourceInfo **RecoveryTSI) {
12524   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12525       DRE, AddrTaken, RecoveryTSI);
12526 
12527   // Propagate both errors and recovered types, which return ExprEmpty.
12528   if (!NewDRE.isUsable())
12529     return NewDRE;
12530 
12531   // We got an expr, wrap it up in parens.
12532   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12533     return PE;
12534   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12535                                        PE->getRParen());
12536 }
12537 
12538 template <typename Derived>
12539 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12540     DependentScopeDeclRefExpr *E) {
12541   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12542                                             nullptr);
12543 }
12544 
12545 template <typename Derived>
12546 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12547     DependentScopeDeclRefExpr *E, bool IsAddressOfOperand,
12548     TypeSourceInfo **RecoveryTSI) {
12549   assert(E->getQualifierLoc());
12550   NestedNameSpecifierLoc QualifierLoc =
12551       getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12552   if (!QualifierLoc)
12553     return ExprError();
12554   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12555 
12556   // TODO: If this is a conversion-function-id, verify that the
12557   // destination type name (if present) resolves the same way after
12558   // instantiation as it did in the local scope.
12559 
12560   DeclarationNameInfo NameInfo =
12561       getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12562   if (!NameInfo.getName())
12563     return ExprError();
12564 
12565   if (!E->hasExplicitTemplateArgs()) {
12566     if (!getDerived().AlwaysRebuild() && QualifierLoc == E->getQualifierLoc() &&
12567         // Note: it is sufficient to compare the Name component of NameInfo:
12568         // if name has not changed, DNLoc has not changed either.
12569         NameInfo.getName() == E->getDeclName())
12570       return E;
12571 
12572     return getDerived().RebuildDependentScopeDeclRefExpr(
12573         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12574         IsAddressOfOperand, RecoveryTSI);
12575   }
12576 
12577   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12578   if (getDerived().TransformTemplateArguments(
12579           E->getTemplateArgs(), E->getNumTemplateArgs(), TransArgs))
12580     return ExprError();
12581 
12582   return getDerived().RebuildDependentScopeDeclRefExpr(
12583       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12584       RecoveryTSI);
12585 }
12586 
12587 template<typename Derived>
12588 ExprResult
12589 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12590   // CXXConstructExprs other than for list-initialization and
12591   // CXXTemporaryObjectExpr are always implicit, so when we have
12592   // a 1-argument construction we just transform that argument.
12593   if (getDerived().AllowSkippingCXXConstructExpr() &&
12594       ((E->getNumArgs() == 1 ||
12595         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12596        (!getDerived().DropCallArgument(E->getArg(0))) &&
12597        !E->isListInitialization()))
12598     return getDerived().TransformInitializer(E->getArg(0),
12599                                              /*DirectInit*/ false);
12600 
12601   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12602 
12603   QualType T = getDerived().TransformType(E->getType());
12604   if (T.isNull())
12605     return ExprError();
12606 
12607   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12608       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12609   if (!Constructor)
12610     return ExprError();
12611 
12612   bool ArgumentChanged = false;
12613   SmallVector<Expr*, 8> Args;
12614   {
12615     EnterExpressionEvaluationContext Context(
12616         getSema(), EnterExpressionEvaluationContext::InitList,
12617         E->isListInitialization());
12618     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12619                                     &ArgumentChanged))
12620       return ExprError();
12621   }
12622 
12623   if (!getDerived().AlwaysRebuild() &&
12624       T == E->getType() &&
12625       Constructor == E->getConstructor() &&
12626       !ArgumentChanged) {
12627     // Mark the constructor as referenced.
12628     // FIXME: Instantiation-specific
12629     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12630     return E;
12631   }
12632 
12633   return getDerived().RebuildCXXConstructExpr(
12634       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12635       E->hadMultipleCandidates(), E->isListInitialization(),
12636       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12637       E->getConstructionKind(), E->getParenOrBraceRange());
12638 }
12639 
12640 template<typename Derived>
12641 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12642     CXXInheritedCtorInitExpr *E) {
12643   QualType T = getDerived().TransformType(E->getType());
12644   if (T.isNull())
12645     return ExprError();
12646 
12647   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12648       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12649   if (!Constructor)
12650     return ExprError();
12651 
12652   if (!getDerived().AlwaysRebuild() &&
12653       T == E->getType() &&
12654       Constructor == E->getConstructor()) {
12655     // Mark the constructor as referenced.
12656     // FIXME: Instantiation-specific
12657     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12658     return E;
12659   }
12660 
12661   return getDerived().RebuildCXXInheritedCtorInitExpr(
12662       T, E->getLocation(), Constructor,
12663       E->constructsVBase(), E->inheritedFromVBase());
12664 }
12665 
12666 /// Transform a C++ temporary-binding expression.
12667 ///
12668 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12669 /// transform the subexpression and return that.
12670 template<typename Derived>
12671 ExprResult
12672 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12673   return getDerived().TransformExpr(E->getSubExpr());
12674 }
12675 
12676 /// Transform a C++ expression that contains cleanups that should
12677 /// be run after the expression is evaluated.
12678 ///
12679 /// Since ExprWithCleanups nodes are implicitly generated, we
12680 /// just transform the subexpression and return that.
12681 template<typename Derived>
12682 ExprResult
12683 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12684   return getDerived().TransformExpr(E->getSubExpr());
12685 }
12686 
12687 template<typename Derived>
12688 ExprResult
12689 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12690                                                     CXXTemporaryObjectExpr *E) {
12691   TypeSourceInfo *T =
12692       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12693   if (!T)
12694     return ExprError();
12695 
12696   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12697       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12698   if (!Constructor)
12699     return ExprError();
12700 
12701   bool ArgumentChanged = false;
12702   SmallVector<Expr*, 8> Args;
12703   Args.reserve(E->getNumArgs());
12704   {
12705     EnterExpressionEvaluationContext Context(
12706         getSema(), EnterExpressionEvaluationContext::InitList,
12707         E->isListInitialization());
12708     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12709                        &ArgumentChanged))
12710       return ExprError();
12711   }
12712 
12713   if (!getDerived().AlwaysRebuild() &&
12714       T == E->getTypeSourceInfo() &&
12715       Constructor == E->getConstructor() &&
12716       !ArgumentChanged) {
12717     // FIXME: Instantiation-specific
12718     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12719     return SemaRef.MaybeBindToTemporary(E);
12720   }
12721 
12722   // FIXME: We should just pass E->isListInitialization(), but we're not
12723   // prepared to handle list-initialization without a child InitListExpr.
12724   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12725   return getDerived().RebuildCXXTemporaryObjectExpr(
12726       T, LParenLoc, Args, E->getEndLoc(),
12727       /*ListInitialization=*/LParenLoc.isInvalid());
12728 }
12729 
12730 template<typename Derived>
12731 ExprResult
12732 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12733   // Transform any init-capture expressions before entering the scope of the
12734   // lambda body, because they are not semantically within that scope.
12735   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12736   struct TransformedInitCapture {
12737     // The location of the ... if the result is retaining a pack expansion.
12738     SourceLocation EllipsisLoc;
12739     // Zero or more expansions of the init-capture.
12740     SmallVector<InitCaptureInfoTy, 4> Expansions;
12741   };
12742   SmallVector<TransformedInitCapture, 4> InitCaptures;
12743   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12744   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12745                                     CEnd = E->capture_end();
12746        C != CEnd; ++C) {
12747     if (!E->isInitCapture(C))
12748       continue;
12749 
12750     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12751     VarDecl *OldVD = C->getCapturedVar();
12752 
12753     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12754                                 Optional<unsigned> NumExpansions) {
12755       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12756           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12757 
12758       if (NewExprInitResult.isInvalid()) {
12759         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12760         return;
12761       }
12762       Expr *NewExprInit = NewExprInitResult.get();
12763 
12764       QualType NewInitCaptureType =
12765           getSema().buildLambdaInitCaptureInitialization(
12766               C->getLocation(), OldVD->getType()->isReferenceType(),
12767               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12768               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12769               NewExprInit);
12770       Result.Expansions.push_back(
12771           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12772     };
12773 
12774     // If this is an init-capture pack, consider expanding the pack now.
12775     if (OldVD->isParameterPack()) {
12776       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12777                                              ->getTypeLoc()
12778                                              .castAs<PackExpansionTypeLoc>();
12779       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12780       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12781 
12782       // Determine whether the set of unexpanded parameter packs can and should
12783       // be expanded.
12784       bool Expand = true;
12785       bool RetainExpansion = false;
12786       Optional<unsigned> OrigNumExpansions =
12787           ExpansionTL.getTypePtr()->getNumExpansions();
12788       Optional<unsigned> NumExpansions = OrigNumExpansions;
12789       if (getDerived().TryExpandParameterPacks(
12790               ExpansionTL.getEllipsisLoc(),
12791               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12792               RetainExpansion, NumExpansions))
12793         return ExprError();
12794       if (Expand) {
12795         for (unsigned I = 0; I != *NumExpansions; ++I) {
12796           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12797           SubstInitCapture(SourceLocation(), None);
12798         }
12799       }
12800       if (!Expand || RetainExpansion) {
12801         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12802         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12803         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12804       }
12805     } else {
12806       SubstInitCapture(SourceLocation(), None);
12807     }
12808   }
12809 
12810   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12811   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12812 
12813   // Transform the template parameters, and add them to the current
12814   // instantiation scope. The null case is handled correctly.
12815   auto TPL = getDerived().TransformTemplateParameterList(
12816       E->getTemplateParameterList());
12817   LSI->GLTemplateParameterList = TPL;
12818 
12819   // Transform the type of the original lambda's call operator.
12820   // The transformation MUST be done in the CurrentInstantiationScope since
12821   // it introduces a mapping of the original to the newly created
12822   // transformed parameters.
12823   TypeSourceInfo *NewCallOpTSI = nullptr;
12824   {
12825     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12826     FunctionProtoTypeLoc OldCallOpFPTL =
12827         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12828 
12829     TypeLocBuilder NewCallOpTLBuilder;
12830     SmallVector<QualType, 4> ExceptionStorage;
12831     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12832     QualType NewCallOpType = TransformFunctionProtoType(
12833         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12834         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12835           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12836                                               ExceptionStorage, Changed);
12837         });
12838     if (NewCallOpType.isNull())
12839       return ExprError();
12840     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12841                                                         NewCallOpType);
12842   }
12843 
12844   // Transform the trailing requires clause
12845   ExprResult NewTrailingRequiresClause;
12846   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12847     // FIXME: Concepts: Substitution into requires clause should only happen
12848     //                  when checking satisfaction.
12849     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12850 
12851   // Create the local class that will describe the lambda.
12852   // FIXME: KnownDependent below is wrong when substituting inside a templated
12853   // context that isn't a DeclContext (such as a variable template).
12854   CXXRecordDecl *OldClass = E->getLambdaClass();
12855   CXXRecordDecl *Class
12856     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12857                                         NewCallOpTSI,
12858                                         /*KnownDependent=*/false,
12859                                         E->getCaptureDefault());
12860   getDerived().transformedLocalDecl(OldClass, {Class});
12861 
12862   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12863   if (getDerived().ReplacingOriginal())
12864     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12865                                OldClass->getLambdaManglingNumber(),
12866                                OldClass->getDeviceLambdaManglingNumber(),
12867                                OldClass->getLambdaContextDecl());
12868 
12869   // Build the call operator.
12870   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12871       Class, E->getIntroducerRange(), NewCallOpTSI,
12872       E->getCallOperator()->getEndLoc(),
12873       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12874       E->getCallOperator()->getConstexprKind(),
12875       NewTrailingRequiresClause.get());
12876 
12877   LSI->CallOperator = NewCallOperator;
12878 
12879   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12880   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12881 
12882   // Number the lambda for linkage purposes if necessary.
12883   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12884 
12885   // Introduce the context of the call operator.
12886   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12887                                  /*NewThisContext*/false);
12888 
12889   // Enter the scope of the lambda.
12890   getSema().buildLambdaScope(LSI, NewCallOperator,
12891                              E->getIntroducerRange(),
12892                              E->getCaptureDefault(),
12893                              E->getCaptureDefaultLoc(),
12894                              E->hasExplicitParameters(),
12895                              E->hasExplicitResultType(),
12896                              E->isMutable());
12897 
12898   bool Invalid = false;
12899 
12900   // Transform captures.
12901   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12902                                  CEnd = E->capture_end();
12903        C != CEnd; ++C) {
12904     // When we hit the first implicit capture, tell Sema that we've finished
12905     // the list of explicit captures.
12906     if (C->isImplicit())
12907       break;
12908 
12909     // Capturing 'this' is trivial.
12910     if (C->capturesThis()) {
12911       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12912                                     /*BuildAndDiagnose*/ true, nullptr,
12913                                     C->getCaptureKind() == LCK_StarThis);
12914       continue;
12915     }
12916     // Captured expression will be recaptured during captured variables
12917     // rebuilding.
12918     if (C->capturesVLAType())
12919       continue;
12920 
12921     // Rebuild init-captures, including the implied field declaration.
12922     if (E->isInitCapture(C)) {
12923       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12924 
12925       VarDecl *OldVD = C->getCapturedVar();
12926       llvm::SmallVector<Decl*, 4> NewVDs;
12927 
12928       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12929         ExprResult Init = Info.first;
12930         QualType InitQualType = Info.second;
12931         if (Init.isInvalid() || InitQualType.isNull()) {
12932           Invalid = true;
12933           break;
12934         }
12935         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12936             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12937             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12938         if (!NewVD) {
12939           Invalid = true;
12940           break;
12941         }
12942         NewVDs.push_back(NewVD);
12943         getSema().addInitCapture(LSI, NewVD);
12944       }
12945 
12946       if (Invalid)
12947         break;
12948 
12949       getDerived().transformedLocalDecl(OldVD, NewVDs);
12950       continue;
12951     }
12952 
12953     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12954 
12955     // Determine the capture kind for Sema.
12956     Sema::TryCaptureKind Kind
12957       = C->isImplicit()? Sema::TryCapture_Implicit
12958                        : C->getCaptureKind() == LCK_ByCopy
12959                            ? Sema::TryCapture_ExplicitByVal
12960                            : Sema::TryCapture_ExplicitByRef;
12961     SourceLocation EllipsisLoc;
12962     if (C->isPackExpansion()) {
12963       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12964       bool ShouldExpand = false;
12965       bool RetainExpansion = false;
12966       Optional<unsigned> NumExpansions;
12967       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12968                                                C->getLocation(),
12969                                                Unexpanded,
12970                                                ShouldExpand, RetainExpansion,
12971                                                NumExpansions)) {
12972         Invalid = true;
12973         continue;
12974       }
12975 
12976       if (ShouldExpand) {
12977         // The transform has determined that we should perform an expansion;
12978         // transform and capture each of the arguments.
12979         // expansion of the pattern. Do so.
12980         VarDecl *Pack = C->getCapturedVar();
12981         for (unsigned I = 0; I != *NumExpansions; ++I) {
12982           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12983           VarDecl *CapturedVar
12984             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12985                                                                Pack));
12986           if (!CapturedVar) {
12987             Invalid = true;
12988             continue;
12989           }
12990 
12991           // Capture the transformed variable.
12992           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12993         }
12994 
12995         // FIXME: Retain a pack expansion if RetainExpansion is true.
12996 
12997         continue;
12998       }
12999 
13000       EllipsisLoc = C->getEllipsisLoc();
13001     }
13002 
13003     // Transform the captured variable.
13004     VarDecl *CapturedVar
13005       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
13006                                                          C->getCapturedVar()));
13007     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
13008       Invalid = true;
13009       continue;
13010     }
13011 
13012     // Capture the transformed variable.
13013     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
13014                                  EllipsisLoc);
13015   }
13016   getSema().finishLambdaExplicitCaptures(LSI);
13017 
13018   // FIXME: Sema's lambda-building mechanism expects us to push an expression
13019   // evaluation context even if we're not transforming the function body.
13020   getSema().PushExpressionEvaluationContext(
13021       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
13022 
13023   // Instantiate the body of the lambda expression.
13024   StmtResult Body =
13025       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
13026 
13027   // ActOnLambda* will pop the function scope for us.
13028   FuncScopeCleanup.disable();
13029 
13030   if (Body.isInvalid()) {
13031     SavedContext.pop();
13032     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
13033                                /*IsInstantiation=*/true);
13034     return ExprError();
13035   }
13036 
13037   // Copy the LSI before ActOnFinishFunctionBody removes it.
13038   // FIXME: This is dumb. Store the lambda information somewhere that outlives
13039   // the call operator.
13040   auto LSICopy = *LSI;
13041   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
13042                                     /*IsInstantiation*/ true);
13043   SavedContext.pop();
13044 
13045   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
13046                                    &LSICopy);
13047 }
13048 
13049 template<typename Derived>
13050 StmtResult
13051 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
13052   return TransformStmt(S);
13053 }
13054 
13055 template<typename Derived>
13056 StmtResult
13057 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
13058   // Transform captures.
13059   for (LambdaExpr::capture_iterator C = E->capture_begin(),
13060                                  CEnd = E->capture_end();
13061        C != CEnd; ++C) {
13062     // When we hit the first implicit capture, tell Sema that we've finished
13063     // the list of explicit captures.
13064     if (!C->isImplicit())
13065       continue;
13066 
13067     // Capturing 'this' is trivial.
13068     if (C->capturesThis()) {
13069       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
13070                                     /*BuildAndDiagnose*/ true, nullptr,
13071                                     C->getCaptureKind() == LCK_StarThis);
13072       continue;
13073     }
13074     // Captured expression will be recaptured during captured variables
13075     // rebuilding.
13076     if (C->capturesVLAType())
13077       continue;
13078 
13079     assert(C->capturesVariable() && "unexpected kind of lambda capture");
13080     assert(!E->isInitCapture(C) && "implicit init-capture?");
13081 
13082     // Transform the captured variable.
13083     VarDecl *CapturedVar = cast_or_null<VarDecl>(
13084         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
13085     if (!CapturedVar || CapturedVar->isInvalidDecl())
13086       return StmtError();
13087 
13088     // Capture the transformed variable.
13089     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13090   }
13091 
13092   return S;
13093 }
13094 
13095 template<typename Derived>
13096 ExprResult
13097 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13098                                                   CXXUnresolvedConstructExpr *E) {
13099   TypeSourceInfo *T =
13100       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13101   if (!T)
13102     return ExprError();
13103 
13104   bool ArgumentChanged = false;
13105   SmallVector<Expr*, 8> Args;
13106   Args.reserve(E->getNumArgs());
13107   {
13108     EnterExpressionEvaluationContext Context(
13109         getSema(), EnterExpressionEvaluationContext::InitList,
13110         E->isListInitialization());
13111     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13112                                     &ArgumentChanged))
13113       return ExprError();
13114   }
13115 
13116   if (!getDerived().AlwaysRebuild() &&
13117       T == E->getTypeSourceInfo() &&
13118       !ArgumentChanged)
13119     return E;
13120 
13121   // FIXME: we're faking the locations of the commas
13122   return getDerived().RebuildCXXUnresolvedConstructExpr(
13123       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13124 }
13125 
13126 template<typename Derived>
13127 ExprResult
13128 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13129                                              CXXDependentScopeMemberExpr *E) {
13130   // Transform the base of the expression.
13131   ExprResult Base((Expr*) nullptr);
13132   Expr *OldBase;
13133   QualType BaseType;
13134   QualType ObjectType;
13135   if (!E->isImplicitAccess()) {
13136     OldBase = E->getBase();
13137     Base = getDerived().TransformExpr(OldBase);
13138     if (Base.isInvalid())
13139       return ExprError();
13140 
13141     // Start the member reference and compute the object's type.
13142     ParsedType ObjectTy;
13143     bool MayBePseudoDestructor = false;
13144     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13145                                                 E->getOperatorLoc(),
13146                                       E->isArrow()? tok::arrow : tok::period,
13147                                                 ObjectTy,
13148                                                 MayBePseudoDestructor);
13149     if (Base.isInvalid())
13150       return ExprError();
13151 
13152     ObjectType = ObjectTy.get();
13153     BaseType = ((Expr*) Base.get())->getType();
13154   } else {
13155     OldBase = nullptr;
13156     BaseType = getDerived().TransformType(E->getBaseType());
13157     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13158   }
13159 
13160   // Transform the first part of the nested-name-specifier that qualifies
13161   // the member name.
13162   NamedDecl *FirstQualifierInScope
13163     = getDerived().TransformFirstQualifierInScope(
13164                                             E->getFirstQualifierFoundInScope(),
13165                                             E->getQualifierLoc().getBeginLoc());
13166 
13167   NestedNameSpecifierLoc QualifierLoc;
13168   if (E->getQualifier()) {
13169     QualifierLoc
13170       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13171                                                      ObjectType,
13172                                                      FirstQualifierInScope);
13173     if (!QualifierLoc)
13174       return ExprError();
13175   }
13176 
13177   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13178 
13179   // TODO: If this is a conversion-function-id, verify that the
13180   // destination type name (if present) resolves the same way after
13181   // instantiation as it did in the local scope.
13182 
13183   DeclarationNameInfo NameInfo
13184     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13185   if (!NameInfo.getName())
13186     return ExprError();
13187 
13188   if (!E->hasExplicitTemplateArgs()) {
13189     // This is a reference to a member without an explicitly-specified
13190     // template argument list. Optimize for this common case.
13191     if (!getDerived().AlwaysRebuild() &&
13192         Base.get() == OldBase &&
13193         BaseType == E->getBaseType() &&
13194         QualifierLoc == E->getQualifierLoc() &&
13195         NameInfo.getName() == E->getMember() &&
13196         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13197       return E;
13198 
13199     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13200                                                        BaseType,
13201                                                        E->isArrow(),
13202                                                        E->getOperatorLoc(),
13203                                                        QualifierLoc,
13204                                                        TemplateKWLoc,
13205                                                        FirstQualifierInScope,
13206                                                        NameInfo,
13207                                                        /*TemplateArgs*/nullptr);
13208   }
13209 
13210   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13211   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13212                                               E->getNumTemplateArgs(),
13213                                               TransArgs))
13214     return ExprError();
13215 
13216   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13217                                                      BaseType,
13218                                                      E->isArrow(),
13219                                                      E->getOperatorLoc(),
13220                                                      QualifierLoc,
13221                                                      TemplateKWLoc,
13222                                                      FirstQualifierInScope,
13223                                                      NameInfo,
13224                                                      &TransArgs);
13225 }
13226 
13227 template <typename Derived>
13228 ExprResult TreeTransform<Derived>::TransformUnresolvedMemberExpr(
13229     UnresolvedMemberExpr *Old) {
13230   // Transform the base of the expression.
13231   ExprResult Base((Expr *)nullptr);
13232   QualType BaseType;
13233   if (!Old->isImplicitAccess()) {
13234     Base = getDerived().TransformExpr(Old->getBase());
13235     if (Base.isInvalid())
13236       return ExprError();
13237     Base =
13238         getSema().PerformMemberExprBaseConversion(Base.get(), Old->isArrow());
13239     if (Base.isInvalid())
13240       return ExprError();
13241     BaseType = Base.get()->getType();
13242   } else {
13243     BaseType = getDerived().TransformType(Old->getBaseType());
13244   }
13245 
13246   NestedNameSpecifierLoc QualifierLoc;
13247   if (Old->getQualifierLoc()) {
13248     QualifierLoc =
13249         getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13250     if (!QualifierLoc)
13251       return ExprError();
13252   }
13253 
13254   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13255 
13256   LookupResult R(SemaRef, Old->getMemberNameInfo(), Sema::LookupOrdinaryName);
13257 
13258   // Transform the declaration set.
13259   if (TransformOverloadExprDecls(Old, /*RequiresADL*/ false, R))
13260     return ExprError();
13261 
13262   // Determine the naming class.
13263   if (Old->getNamingClass()) {
13264     CXXRecordDecl *NamingClass = cast_or_null<CXXRecordDecl>(
13265         getDerived().TransformDecl(Old->getMemberLoc(), Old->getNamingClass()));
13266     if (!NamingClass)
13267       return ExprError();
13268 
13269     R.setNamingClass(NamingClass);
13270   }
13271 
13272   TemplateArgumentListInfo TransArgs;
13273   if (Old->hasExplicitTemplateArgs()) {
13274     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13275     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13276     if (getDerived().TransformTemplateArguments(
13277             Old->getTemplateArgs(), Old->getNumTemplateArgs(), TransArgs))
13278       return ExprError();
13279   }
13280 
13281   // FIXME: to do this check properly, we will need to preserve the
13282   // first-qualifier-in-scope here, just in case we had a dependent
13283   // base (and therefore couldn't do the check) and a
13284   // nested-name-qualifier (and therefore could do the lookup).
13285   NamedDecl *FirstQualifierInScope = nullptr;
13286 
13287   return getDerived().RebuildUnresolvedMemberExpr(
13288       Base.get(), BaseType, Old->getOperatorLoc(), Old->isArrow(), QualifierLoc,
13289       TemplateKWLoc, FirstQualifierInScope, R,
13290       (Old->hasExplicitTemplateArgs() ? &TransArgs : nullptr));
13291 }
13292 
13293 template<typename Derived>
13294 ExprResult
13295 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13296   EnterExpressionEvaluationContext Unevaluated(
13297       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13298   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13299   if (SubExpr.isInvalid())
13300     return ExprError();
13301 
13302   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13303     return E;
13304 
13305   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13306 }
13307 
13308 template<typename Derived>
13309 ExprResult
13310 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13311   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13312   if (Pattern.isInvalid())
13313     return ExprError();
13314 
13315   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13316     return E;
13317 
13318   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13319                                            E->getNumExpansions());
13320 }
13321 
13322 template<typename Derived>
13323 ExprResult
13324 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13325   // If E is not value-dependent, then nothing will change when we transform it.
13326   // Note: This is an instantiation-centric view.
13327   if (!E->isValueDependent())
13328     return E;
13329 
13330   EnterExpressionEvaluationContext Unevaluated(
13331       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13332 
13333   ArrayRef<TemplateArgument> PackArgs;
13334   TemplateArgument ArgStorage;
13335 
13336   // Find the argument list to transform.
13337   if (E->isPartiallySubstituted()) {
13338     PackArgs = E->getPartialArguments();
13339   } else if (E->isValueDependent()) {
13340     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13341     bool ShouldExpand = false;
13342     bool RetainExpansion = false;
13343     Optional<unsigned> NumExpansions;
13344     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13345                                              Unexpanded,
13346                                              ShouldExpand, RetainExpansion,
13347                                              NumExpansions))
13348       return ExprError();
13349 
13350     // If we need to expand the pack, build a template argument from it and
13351     // expand that.
13352     if (ShouldExpand) {
13353       auto *Pack = E->getPack();
13354       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13355         ArgStorage = getSema().Context.getPackExpansionType(
13356             getSema().Context.getTypeDeclType(TTPD), None);
13357       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13358         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13359       } else {
13360         auto *VD = cast<ValueDecl>(Pack);
13361         ExprResult DRE = getSema().BuildDeclRefExpr(
13362             VD, VD->getType().getNonLValueExprType(getSema().Context),
13363             VD->getType()->isReferenceType() ? VK_LValue : VK_PRValue,
13364             E->getPackLoc());
13365         if (DRE.isInvalid())
13366           return ExprError();
13367         ArgStorage = new (getSema().Context) PackExpansionExpr(
13368             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13369       }
13370       PackArgs = ArgStorage;
13371     }
13372   }
13373 
13374   // If we're not expanding the pack, just transform the decl.
13375   if (!PackArgs.size()) {
13376     auto *Pack = cast_or_null<NamedDecl>(
13377         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13378     if (!Pack)
13379       return ExprError();
13380     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13381                                               E->getPackLoc(),
13382                                               E->getRParenLoc(), None, None);
13383   }
13384 
13385   // Try to compute the result without performing a partial substitution.
13386   Optional<unsigned> Result = 0;
13387   for (const TemplateArgument &Arg : PackArgs) {
13388     if (!Arg.isPackExpansion()) {
13389       Result = *Result + 1;
13390       continue;
13391     }
13392 
13393     TemplateArgumentLoc ArgLoc;
13394     InventTemplateArgumentLoc(Arg, ArgLoc);
13395 
13396     // Find the pattern of the pack expansion.
13397     SourceLocation Ellipsis;
13398     Optional<unsigned> OrigNumExpansions;
13399     TemplateArgumentLoc Pattern =
13400         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13401                                                           OrigNumExpansions);
13402 
13403     // Substitute under the pack expansion. Do not expand the pack (yet).
13404     TemplateArgumentLoc OutPattern;
13405     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13406     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13407                                                /*Uneval*/ true))
13408       return true;
13409 
13410     // See if we can determine the number of arguments from the result.
13411     Optional<unsigned> NumExpansions =
13412         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13413     if (!NumExpansions) {
13414       // No: we must be in an alias template expansion, and we're going to need
13415       // to actually expand the packs.
13416       Result = None;
13417       break;
13418     }
13419 
13420     Result = *Result + *NumExpansions;
13421   }
13422 
13423   // Common case: we could determine the number of expansions without
13424   // substituting.
13425   if (Result)
13426     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13427                                               E->getPackLoc(),
13428                                               E->getRParenLoc(), *Result, None);
13429 
13430   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13431                                                E->getPackLoc());
13432   {
13433     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13434     typedef TemplateArgumentLocInventIterator<
13435         Derived, const TemplateArgument*> PackLocIterator;
13436     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13437                                    PackLocIterator(*this, PackArgs.end()),
13438                                    TransformedPackArgs, /*Uneval*/true))
13439       return ExprError();
13440   }
13441 
13442   // Check whether we managed to fully-expand the pack.
13443   // FIXME: Is it possible for us to do so and not hit the early exit path?
13444   SmallVector<TemplateArgument, 8> Args;
13445   bool PartialSubstitution = false;
13446   for (auto &Loc : TransformedPackArgs.arguments()) {
13447     Args.push_back(Loc.getArgument());
13448     if (Loc.getArgument().isPackExpansion())
13449       PartialSubstitution = true;
13450   }
13451 
13452   if (PartialSubstitution)
13453     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13454                                               E->getPackLoc(),
13455                                               E->getRParenLoc(), None, Args);
13456 
13457   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13458                                             E->getPackLoc(), E->getRParenLoc(),
13459                                             Args.size(), None);
13460 }
13461 
13462 template<typename Derived>
13463 ExprResult
13464 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13465                                           SubstNonTypeTemplateParmPackExpr *E) {
13466   // Default behavior is to do nothing with this transformation.
13467   return E;
13468 }
13469 
13470 template<typename Derived>
13471 ExprResult
13472 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13473                                           SubstNonTypeTemplateParmExpr *E) {
13474   // Default behavior is to do nothing with this transformation.
13475   return E;
13476 }
13477 
13478 template<typename Derived>
13479 ExprResult
13480 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13481   // Default behavior is to do nothing with this transformation.
13482   return E;
13483 }
13484 
13485 template<typename Derived>
13486 ExprResult
13487 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13488                                                   MaterializeTemporaryExpr *E) {
13489   return getDerived().TransformExpr(E->getSubExpr());
13490 }
13491 
13492 template<typename Derived>
13493 ExprResult
13494 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13495   UnresolvedLookupExpr *Callee = nullptr;
13496   if (Expr *OldCallee = E->getCallee()) {
13497     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13498     if (CalleeResult.isInvalid())
13499       return ExprError();
13500     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13501   }
13502 
13503   Expr *Pattern = E->getPattern();
13504 
13505   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13506   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13507   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13508 
13509   // Determine whether the set of unexpanded parameter packs can and should
13510   // be expanded.
13511   bool Expand = true;
13512   bool RetainExpansion = false;
13513   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13514                      NumExpansions = OrigNumExpansions;
13515   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13516                                            Pattern->getSourceRange(),
13517                                            Unexpanded,
13518                                            Expand, RetainExpansion,
13519                                            NumExpansions))
13520     return true;
13521 
13522   if (!Expand) {
13523     // Do not expand any packs here, just transform and rebuild a fold
13524     // expression.
13525     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13526 
13527     ExprResult LHS =
13528         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13529     if (LHS.isInvalid())
13530       return true;
13531 
13532     ExprResult RHS =
13533         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13534     if (RHS.isInvalid())
13535       return true;
13536 
13537     if (!getDerived().AlwaysRebuild() &&
13538         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13539       return E;
13540 
13541     return getDerived().RebuildCXXFoldExpr(
13542         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13543         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13544   }
13545 
13546   // Formally a fold expression expands to nested parenthesized expressions.
13547   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13548   // them.
13549   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13550     SemaRef.Diag(E->getEllipsisLoc(),
13551                  clang::diag::err_fold_expression_limit_exceeded)
13552         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13553         << E->getSourceRange();
13554     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13555     return ExprError();
13556   }
13557 
13558   // The transform has determined that we should perform an elementwise
13559   // expansion of the pattern. Do so.
13560   ExprResult Result = getDerived().TransformExpr(E->getInit());
13561   if (Result.isInvalid())
13562     return true;
13563   bool LeftFold = E->isLeftFold();
13564 
13565   // If we're retaining an expansion for a right fold, it is the innermost
13566   // component and takes the init (if any).
13567   if (!LeftFold && RetainExpansion) {
13568     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13569 
13570     ExprResult Out = getDerived().TransformExpr(Pattern);
13571     if (Out.isInvalid())
13572       return true;
13573 
13574     Result = getDerived().RebuildCXXFoldExpr(
13575         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13576         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13577     if (Result.isInvalid())
13578       return true;
13579   }
13580 
13581   for (unsigned I = 0; I != *NumExpansions; ++I) {
13582     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13583         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13584     ExprResult Out = getDerived().TransformExpr(Pattern);
13585     if (Out.isInvalid())
13586       return true;
13587 
13588     if (Out.get()->containsUnexpandedParameterPack()) {
13589       // We still have a pack; retain a pack expansion for this slice.
13590       Result = getDerived().RebuildCXXFoldExpr(
13591           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13592           E->getOperator(), E->getEllipsisLoc(),
13593           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13594           OrigNumExpansions);
13595     } else if (Result.isUsable()) {
13596       // We've got down to a single element; build a binary operator.
13597       Expr *LHS = LeftFold ? Result.get() : Out.get();
13598       Expr *RHS = LeftFold ? Out.get() : Result.get();
13599       if (Callee)
13600         Result = getDerived().RebuildCXXOperatorCallExpr(
13601             BinaryOperator::getOverloadedOperator(E->getOperator()),
13602             E->getEllipsisLoc(), Callee, LHS, RHS);
13603       else
13604         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13605                                                     E->getOperator(), LHS, RHS);
13606     } else
13607       Result = Out;
13608 
13609     if (Result.isInvalid())
13610       return true;
13611   }
13612 
13613   // If we're retaining an expansion for a left fold, it is the outermost
13614   // component and takes the complete expansion so far as its init (if any).
13615   if (LeftFold && RetainExpansion) {
13616     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13617 
13618     ExprResult Out = getDerived().TransformExpr(Pattern);
13619     if (Out.isInvalid())
13620       return true;
13621 
13622     Result = getDerived().RebuildCXXFoldExpr(
13623         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13624         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13625     if (Result.isInvalid())
13626       return true;
13627   }
13628 
13629   // If we had no init and an empty pack, and we're not retaining an expansion,
13630   // then produce a fallback value or error.
13631   if (Result.isUnset())
13632     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13633                                                 E->getOperator());
13634 
13635   return Result;
13636 }
13637 
13638 template<typename Derived>
13639 ExprResult
13640 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13641     CXXStdInitializerListExpr *E) {
13642   return getDerived().TransformExpr(E->getSubExpr());
13643 }
13644 
13645 template<typename Derived>
13646 ExprResult
13647 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13648   return SemaRef.MaybeBindToTemporary(E);
13649 }
13650 
13651 template<typename Derived>
13652 ExprResult
13653 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13654   return E;
13655 }
13656 
13657 template<typename Derived>
13658 ExprResult
13659 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13660   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13661   if (SubExpr.isInvalid())
13662     return ExprError();
13663 
13664   if (!getDerived().AlwaysRebuild() &&
13665       SubExpr.get() == E->getSubExpr())
13666     return E;
13667 
13668   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13669 }
13670 
13671 template<typename Derived>
13672 ExprResult
13673 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13674   // Transform each of the elements.
13675   SmallVector<Expr *, 8> Elements;
13676   bool ArgChanged = false;
13677   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13678                                   /*IsCall=*/false, Elements, &ArgChanged))
13679     return ExprError();
13680 
13681   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13682     return SemaRef.MaybeBindToTemporary(E);
13683 
13684   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13685                                               Elements.data(),
13686                                               Elements.size());
13687 }
13688 
13689 template<typename Derived>
13690 ExprResult
13691 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13692                                                     ObjCDictionaryLiteral *E) {
13693   // Transform each of the elements.
13694   SmallVector<ObjCDictionaryElement, 8> Elements;
13695   bool ArgChanged = false;
13696   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13697     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13698 
13699     if (OrigElement.isPackExpansion()) {
13700       // This key/value element is a pack expansion.
13701       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13702       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13703       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13704       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13705 
13706       // Determine whether the set of unexpanded parameter packs can
13707       // and should be expanded.
13708       bool Expand = true;
13709       bool RetainExpansion = false;
13710       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13711       Optional<unsigned> NumExpansions = OrigNumExpansions;
13712       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13713                                OrigElement.Value->getEndLoc());
13714       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13715                                                PatternRange, Unexpanded, Expand,
13716                                                RetainExpansion, NumExpansions))
13717         return ExprError();
13718 
13719       if (!Expand) {
13720         // The transform has determined that we should perform a simple
13721         // transformation on the pack expansion, producing another pack
13722         // expansion.
13723         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13724         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13725         if (Key.isInvalid())
13726           return ExprError();
13727 
13728         if (Key.get() != OrigElement.Key)
13729           ArgChanged = true;
13730 
13731         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13732         if (Value.isInvalid())
13733           return ExprError();
13734 
13735         if (Value.get() != OrigElement.Value)
13736           ArgChanged = true;
13737 
13738         ObjCDictionaryElement Expansion = {
13739           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13740         };
13741         Elements.push_back(Expansion);
13742         continue;
13743       }
13744 
13745       // Record right away that the argument was changed.  This needs
13746       // to happen even if the array expands to nothing.
13747       ArgChanged = true;
13748 
13749       // The transform has determined that we should perform an elementwise
13750       // expansion of the pattern. Do so.
13751       for (unsigned I = 0; I != *NumExpansions; ++I) {
13752         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13753         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13754         if (Key.isInvalid())
13755           return ExprError();
13756 
13757         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13758         if (Value.isInvalid())
13759           return ExprError();
13760 
13761         ObjCDictionaryElement Element = {
13762           Key.get(), Value.get(), SourceLocation(), NumExpansions
13763         };
13764 
13765         // If any unexpanded parameter packs remain, we still have a
13766         // pack expansion.
13767         // FIXME: Can this really happen?
13768         if (Key.get()->containsUnexpandedParameterPack() ||
13769             Value.get()->containsUnexpandedParameterPack())
13770           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13771 
13772         Elements.push_back(Element);
13773       }
13774 
13775       // FIXME: Retain a pack expansion if RetainExpansion is true.
13776 
13777       // We've finished with this pack expansion.
13778       continue;
13779     }
13780 
13781     // Transform and check key.
13782     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13783     if (Key.isInvalid())
13784       return ExprError();
13785 
13786     if (Key.get() != OrigElement.Key)
13787       ArgChanged = true;
13788 
13789     // Transform and check value.
13790     ExprResult Value
13791       = getDerived().TransformExpr(OrigElement.Value);
13792     if (Value.isInvalid())
13793       return ExprError();
13794 
13795     if (Value.get() != OrigElement.Value)
13796       ArgChanged = true;
13797 
13798     ObjCDictionaryElement Element = {
13799       Key.get(), Value.get(), SourceLocation(), None
13800     };
13801     Elements.push_back(Element);
13802   }
13803 
13804   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13805     return SemaRef.MaybeBindToTemporary(E);
13806 
13807   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13808                                                    Elements);
13809 }
13810 
13811 template<typename Derived>
13812 ExprResult
13813 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13814   TypeSourceInfo *EncodedTypeInfo
13815     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13816   if (!EncodedTypeInfo)
13817     return ExprError();
13818 
13819   if (!getDerived().AlwaysRebuild() &&
13820       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13821     return E;
13822 
13823   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13824                                             EncodedTypeInfo,
13825                                             E->getRParenLoc());
13826 }
13827 
13828 template<typename Derived>
13829 ExprResult TreeTransform<Derived>::
13830 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13831   // This is a kind of implicit conversion, and it needs to get dropped
13832   // and recomputed for the same general reasons that ImplicitCastExprs
13833   // do, as well a more specific one: this expression is only valid when
13834   // it appears *immediately* as an argument expression.
13835   return getDerived().TransformExpr(E->getSubExpr());
13836 }
13837 
13838 template<typename Derived>
13839 ExprResult TreeTransform<Derived>::
13840 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13841   TypeSourceInfo *TSInfo
13842     = getDerived().TransformType(E->getTypeInfoAsWritten());
13843   if (!TSInfo)
13844     return ExprError();
13845 
13846   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13847   if (Result.isInvalid())
13848     return ExprError();
13849 
13850   if (!getDerived().AlwaysRebuild() &&
13851       TSInfo == E->getTypeInfoAsWritten() &&
13852       Result.get() == E->getSubExpr())
13853     return E;
13854 
13855   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13856                                       E->getBridgeKeywordLoc(), TSInfo,
13857                                       Result.get());
13858 }
13859 
13860 template <typename Derived>
13861 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13862     ObjCAvailabilityCheckExpr *E) {
13863   return E;
13864 }
13865 
13866 template<typename Derived>
13867 ExprResult
13868 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13869   // Transform arguments.
13870   bool ArgChanged = false;
13871   SmallVector<Expr*, 8> Args;
13872   Args.reserve(E->getNumArgs());
13873   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13874                                   &ArgChanged))
13875     return ExprError();
13876 
13877   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13878     // Class message: transform the receiver type.
13879     TypeSourceInfo *ReceiverTypeInfo
13880       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13881     if (!ReceiverTypeInfo)
13882       return ExprError();
13883 
13884     // If nothing changed, just retain the existing message send.
13885     if (!getDerived().AlwaysRebuild() &&
13886         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13887       return SemaRef.MaybeBindToTemporary(E);
13888 
13889     // Build a new class message send.
13890     SmallVector<SourceLocation, 16> SelLocs;
13891     E->getSelectorLocs(SelLocs);
13892     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13893                                                E->getSelector(),
13894                                                SelLocs,
13895                                                E->getMethodDecl(),
13896                                                E->getLeftLoc(),
13897                                                Args,
13898                                                E->getRightLoc());
13899   }
13900   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13901            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13902     if (!E->getMethodDecl())
13903       return ExprError();
13904 
13905     // Build a new class message send to 'super'.
13906     SmallVector<SourceLocation, 16> SelLocs;
13907     E->getSelectorLocs(SelLocs);
13908     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13909                                                E->getSelector(),
13910                                                SelLocs,
13911                                                E->getReceiverType(),
13912                                                E->getMethodDecl(),
13913                                                E->getLeftLoc(),
13914                                                Args,
13915                                                E->getRightLoc());
13916   }
13917 
13918   // Instance message: transform the receiver
13919   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13920          "Only class and instance messages may be instantiated");
13921   ExprResult Receiver
13922     = getDerived().TransformExpr(E->getInstanceReceiver());
13923   if (Receiver.isInvalid())
13924     return ExprError();
13925 
13926   // If nothing changed, just retain the existing message send.
13927   if (!getDerived().AlwaysRebuild() &&
13928       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13929     return SemaRef.MaybeBindToTemporary(E);
13930 
13931   // Build a new instance message send.
13932   SmallVector<SourceLocation, 16> SelLocs;
13933   E->getSelectorLocs(SelLocs);
13934   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13935                                              E->getSelector(),
13936                                              SelLocs,
13937                                              E->getMethodDecl(),
13938                                              E->getLeftLoc(),
13939                                              Args,
13940                                              E->getRightLoc());
13941 }
13942 
13943 template<typename Derived>
13944 ExprResult
13945 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13946   return E;
13947 }
13948 
13949 template<typename Derived>
13950 ExprResult
13951 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13952   return E;
13953 }
13954 
13955 template<typename Derived>
13956 ExprResult
13957 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13958   // Transform the base expression.
13959   ExprResult Base = getDerived().TransformExpr(E->getBase());
13960   if (Base.isInvalid())
13961     return ExprError();
13962 
13963   // We don't need to transform the ivar; it will never change.
13964 
13965   // If nothing changed, just retain the existing expression.
13966   if (!getDerived().AlwaysRebuild() &&
13967       Base.get() == E->getBase())
13968     return E;
13969 
13970   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13971                                              E->getLocation(),
13972                                              E->isArrow(), E->isFreeIvar());
13973 }
13974 
13975 template<typename Derived>
13976 ExprResult
13977 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13978   // 'super' and types never change. Property never changes. Just
13979   // retain the existing expression.
13980   if (!E->isObjectReceiver())
13981     return E;
13982 
13983   // Transform the base expression.
13984   ExprResult Base = getDerived().TransformExpr(E->getBase());
13985   if (Base.isInvalid())
13986     return ExprError();
13987 
13988   // We don't need to transform the property; it will never change.
13989 
13990   // If nothing changed, just retain the existing expression.
13991   if (!getDerived().AlwaysRebuild() &&
13992       Base.get() == E->getBase())
13993     return E;
13994 
13995   if (E->isExplicitProperty())
13996     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13997                                                    E->getExplicitProperty(),
13998                                                    E->getLocation());
13999 
14000   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
14001                                                  SemaRef.Context.PseudoObjectTy,
14002                                                  E->getImplicitPropertyGetter(),
14003                                                  E->getImplicitPropertySetter(),
14004                                                  E->getLocation());
14005 }
14006 
14007 template<typename Derived>
14008 ExprResult
14009 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
14010   // Transform the base expression.
14011   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
14012   if (Base.isInvalid())
14013     return ExprError();
14014 
14015   // Transform the key expression.
14016   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
14017   if (Key.isInvalid())
14018     return ExprError();
14019 
14020   // If nothing changed, just retain the existing expression.
14021   if (!getDerived().AlwaysRebuild() &&
14022       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
14023     return E;
14024 
14025   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
14026                                                   Base.get(), Key.get(),
14027                                                   E->getAtIndexMethodDecl(),
14028                                                   E->setAtIndexMethodDecl());
14029 }
14030 
14031 template<typename Derived>
14032 ExprResult
14033 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
14034   // Transform the base expression.
14035   ExprResult Base = getDerived().TransformExpr(E->getBase());
14036   if (Base.isInvalid())
14037     return ExprError();
14038 
14039   // If nothing changed, just retain the existing expression.
14040   if (!getDerived().AlwaysRebuild() &&
14041       Base.get() == E->getBase())
14042     return E;
14043 
14044   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
14045                                          E->getOpLoc(),
14046                                          E->isArrow());
14047 }
14048 
14049 template<typename Derived>
14050 ExprResult
14051 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
14052   bool ArgumentChanged = false;
14053   SmallVector<Expr*, 8> SubExprs;
14054   SubExprs.reserve(E->getNumSubExprs());
14055   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14056                                   SubExprs, &ArgumentChanged))
14057     return ExprError();
14058 
14059   if (!getDerived().AlwaysRebuild() &&
14060       !ArgumentChanged)
14061     return E;
14062 
14063   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
14064                                                SubExprs,
14065                                                E->getRParenLoc());
14066 }
14067 
14068 template<typename Derived>
14069 ExprResult
14070 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
14071   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14072   if (SrcExpr.isInvalid())
14073     return ExprError();
14074 
14075   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
14076   if (!Type)
14077     return ExprError();
14078 
14079   if (!getDerived().AlwaysRebuild() &&
14080       Type == E->getTypeSourceInfo() &&
14081       SrcExpr.get() == E->getSrcExpr())
14082     return E;
14083 
14084   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14085                                                SrcExpr.get(), Type,
14086                                                E->getRParenLoc());
14087 }
14088 
14089 template<typename Derived>
14090 ExprResult
14091 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14092   BlockDecl *oldBlock = E->getBlockDecl();
14093 
14094   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14095   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14096 
14097   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14098   blockScope->TheDecl->setBlockMissingReturnType(
14099                          oldBlock->blockMissingReturnType());
14100 
14101   SmallVector<ParmVarDecl*, 4> params;
14102   SmallVector<QualType, 4> paramTypes;
14103 
14104   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14105 
14106   // Parameter substitution.
14107   Sema::ExtParameterInfoBuilder extParamInfos;
14108   if (getDerived().TransformFunctionTypeParams(
14109           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14110           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14111           extParamInfos)) {
14112     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14113     return ExprError();
14114   }
14115 
14116   QualType exprResultType =
14117       getDerived().TransformType(exprFunctionType->getReturnType());
14118 
14119   auto epi = exprFunctionType->getExtProtoInfo();
14120   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14121 
14122   QualType functionType =
14123     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14124   blockScope->FunctionType = functionType;
14125 
14126   // Set the parameters on the block decl.
14127   if (!params.empty())
14128     blockScope->TheDecl->setParams(params);
14129 
14130   if (!oldBlock->blockMissingReturnType()) {
14131     blockScope->HasImplicitReturnType = false;
14132     blockScope->ReturnType = exprResultType;
14133   }
14134 
14135   // Transform the body
14136   StmtResult body = getDerived().TransformStmt(E->getBody());
14137   if (body.isInvalid()) {
14138     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14139     return ExprError();
14140   }
14141 
14142 #ifndef NDEBUG
14143   // In builds with assertions, make sure that we captured everything we
14144   // captured before.
14145   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14146     for (const auto &I : oldBlock->captures()) {
14147       VarDecl *oldCapture = I.getVariable();
14148 
14149       // Ignore parameter packs.
14150       if (oldCapture->isParameterPack())
14151         continue;
14152 
14153       VarDecl *newCapture =
14154         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14155                                                  oldCapture));
14156       assert(blockScope->CaptureMap.count(newCapture));
14157     }
14158     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14159   }
14160 #endif
14161 
14162   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14163                                     /*Scope=*/nullptr);
14164 }
14165 
14166 template<typename Derived>
14167 ExprResult
14168 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14169   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14170   if (SrcExpr.isInvalid())
14171     return ExprError();
14172 
14173   QualType Type = getDerived().TransformType(E->getType());
14174 
14175   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14176                                  E->getRParenLoc());
14177 }
14178 
14179 template<typename Derived>
14180 ExprResult
14181 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14182   bool ArgumentChanged = false;
14183   SmallVector<Expr*, 8> SubExprs;
14184   SubExprs.reserve(E->getNumSubExprs());
14185   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14186                                   SubExprs, &ArgumentChanged))
14187     return ExprError();
14188 
14189   if (!getDerived().AlwaysRebuild() &&
14190       !ArgumentChanged)
14191     return E;
14192 
14193   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14194                                         E->getOp(), E->getRParenLoc());
14195 }
14196 
14197 //===----------------------------------------------------------------------===//
14198 // Type reconstruction
14199 //===----------------------------------------------------------------------===//
14200 
14201 template<typename Derived>
14202 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14203                                                     SourceLocation Star) {
14204   return SemaRef.BuildPointerType(PointeeType, Star,
14205                                   getDerived().getBaseEntity());
14206 }
14207 
14208 template<typename Derived>
14209 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14210                                                          SourceLocation Star) {
14211   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14212                                        getDerived().getBaseEntity());
14213 }
14214 
14215 template<typename Derived>
14216 QualType
14217 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14218                                              bool WrittenAsLValue,
14219                                              SourceLocation Sigil) {
14220   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14221                                     Sigil, getDerived().getBaseEntity());
14222 }
14223 
14224 template<typename Derived>
14225 QualType
14226 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14227                                                  QualType ClassType,
14228                                                  SourceLocation Sigil) {
14229   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14230                                         getDerived().getBaseEntity());
14231 }
14232 
14233 template<typename Derived>
14234 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14235            const ObjCTypeParamDecl *Decl,
14236            SourceLocation ProtocolLAngleLoc,
14237            ArrayRef<ObjCProtocolDecl *> Protocols,
14238            ArrayRef<SourceLocation> ProtocolLocs,
14239            SourceLocation ProtocolRAngleLoc) {
14240   return SemaRef.BuildObjCTypeParamType(Decl,
14241                                         ProtocolLAngleLoc, Protocols,
14242                                         ProtocolLocs, ProtocolRAngleLoc,
14243                                         /*FailOnError=*/true);
14244 }
14245 
14246 template<typename Derived>
14247 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14248            QualType BaseType,
14249            SourceLocation Loc,
14250            SourceLocation TypeArgsLAngleLoc,
14251            ArrayRef<TypeSourceInfo *> TypeArgs,
14252            SourceLocation TypeArgsRAngleLoc,
14253            SourceLocation ProtocolLAngleLoc,
14254            ArrayRef<ObjCProtocolDecl *> Protocols,
14255            ArrayRef<SourceLocation> ProtocolLocs,
14256            SourceLocation ProtocolRAngleLoc) {
14257   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14258                                      TypeArgs, TypeArgsRAngleLoc,
14259                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14260                                      ProtocolRAngleLoc,
14261                                      /*FailOnError=*/true);
14262 }
14263 
14264 template<typename Derived>
14265 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14266            QualType PointeeType,
14267            SourceLocation Star) {
14268   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14269 }
14270 
14271 template<typename Derived>
14272 QualType
14273 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14274                                          ArrayType::ArraySizeModifier SizeMod,
14275                                          const llvm::APInt *Size,
14276                                          Expr *SizeExpr,
14277                                          unsigned IndexTypeQuals,
14278                                          SourceRange BracketsRange) {
14279   if (SizeExpr || !Size)
14280     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14281                                   IndexTypeQuals, BracketsRange,
14282                                   getDerived().getBaseEntity());
14283 
14284   QualType Types[] = {
14285     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14286     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14287     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14288   };
14289   const unsigned NumTypes = llvm::array_lengthof(Types);
14290   QualType SizeType;
14291   for (unsigned I = 0; I != NumTypes; ++I)
14292     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14293       SizeType = Types[I];
14294       break;
14295     }
14296 
14297   // Note that we can return a VariableArrayType here in the case where
14298   // the element type was a dependent VariableArrayType.
14299   IntegerLiteral *ArraySize
14300       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14301                                /*FIXME*/BracketsRange.getBegin());
14302   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14303                                 IndexTypeQuals, BracketsRange,
14304                                 getDerived().getBaseEntity());
14305 }
14306 
14307 template<typename Derived>
14308 QualType
14309 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14310                                                  ArrayType::ArraySizeModifier SizeMod,
14311                                                  const llvm::APInt &Size,
14312                                                  Expr *SizeExpr,
14313                                                  unsigned IndexTypeQuals,
14314                                                  SourceRange BracketsRange) {
14315   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14316                                         IndexTypeQuals, BracketsRange);
14317 }
14318 
14319 template<typename Derived>
14320 QualType
14321 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14322                                           ArrayType::ArraySizeModifier SizeMod,
14323                                                  unsigned IndexTypeQuals,
14324                                                    SourceRange BracketsRange) {
14325   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14326                                        IndexTypeQuals, BracketsRange);
14327 }
14328 
14329 template<typename Derived>
14330 QualType
14331 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14332                                           ArrayType::ArraySizeModifier SizeMod,
14333                                                  Expr *SizeExpr,
14334                                                  unsigned IndexTypeQuals,
14335                                                  SourceRange BracketsRange) {
14336   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14337                                        SizeExpr,
14338                                        IndexTypeQuals, BracketsRange);
14339 }
14340 
14341 template<typename Derived>
14342 QualType
14343 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14344                                           ArrayType::ArraySizeModifier SizeMod,
14345                                                        Expr *SizeExpr,
14346                                                        unsigned IndexTypeQuals,
14347                                                    SourceRange BracketsRange) {
14348   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14349                                        SizeExpr,
14350                                        IndexTypeQuals, BracketsRange);
14351 }
14352 
14353 template <typename Derived>
14354 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14355     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14356   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14357                                           AttributeLoc);
14358 }
14359 
14360 template <typename Derived>
14361 QualType
14362 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14363                                           unsigned NumElements,
14364                                           VectorType::VectorKind VecKind) {
14365   // FIXME: semantic checking!
14366   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14367 }
14368 
14369 template <typename Derived>
14370 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14371     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14372     VectorType::VectorKind VecKind) {
14373   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14374 }
14375 
14376 template<typename Derived>
14377 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14378                                                       unsigned NumElements,
14379                                                  SourceLocation AttributeLoc) {
14380   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14381                           NumElements, true);
14382   IntegerLiteral *VectorSize
14383     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14384                              AttributeLoc);
14385   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14386 }
14387 
14388 template<typename Derived>
14389 QualType
14390 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14391                                                            Expr *SizeExpr,
14392                                                   SourceLocation AttributeLoc) {
14393   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14394 }
14395 
14396 template <typename Derived>
14397 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14398     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14399   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14400                                                NumColumns);
14401 }
14402 
14403 template <typename Derived>
14404 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14405     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14406     SourceLocation AttributeLoc) {
14407   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14408                                  AttributeLoc);
14409 }
14410 
14411 template<typename Derived>
14412 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14413     QualType T,
14414     MutableArrayRef<QualType> ParamTypes,
14415     const FunctionProtoType::ExtProtoInfo &EPI) {
14416   return SemaRef.BuildFunctionType(T, ParamTypes,
14417                                    getDerived().getBaseLocation(),
14418                                    getDerived().getBaseEntity(),
14419                                    EPI);
14420 }
14421 
14422 template<typename Derived>
14423 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14424   return SemaRef.Context.getFunctionNoProtoType(T);
14425 }
14426 
14427 template<typename Derived>
14428 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14429                                                             Decl *D) {
14430   assert(D && "no decl found");
14431   if (D->isInvalidDecl()) return QualType();
14432 
14433   // FIXME: Doesn't account for ObjCInterfaceDecl!
14434   TypeDecl *Ty;
14435   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14436     // A valid resolved using typename pack expansion decl can have multiple
14437     // UsingDecls, but they must each have exactly one type, and it must be
14438     // the same type in every case. But we must have at least one expansion!
14439     if (UPD->expansions().empty()) {
14440       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14441           << UPD->isCXXClassMember() << UPD;
14442       return QualType();
14443     }
14444 
14445     // We might still have some unresolved types. Try to pick a resolved type
14446     // if we can. The final instantiation will check that the remaining
14447     // unresolved types instantiate to the type we pick.
14448     QualType FallbackT;
14449     QualType T;
14450     for (auto *E : UPD->expansions()) {
14451       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14452       if (ThisT.isNull())
14453         continue;
14454       else if (ThisT->getAs<UnresolvedUsingType>())
14455         FallbackT = ThisT;
14456       else if (T.isNull())
14457         T = ThisT;
14458       else
14459         assert(getSema().Context.hasSameType(ThisT, T) &&
14460                "mismatched resolved types in using pack expansion");
14461     }
14462     return T.isNull() ? FallbackT : T;
14463   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14464     assert(Using->hasTypename() &&
14465            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14466 
14467     // A valid resolved using typename decl points to exactly one type decl.
14468     assert(++Using->shadow_begin() == Using->shadow_end());
14469 
14470     NamedDecl *Target = Using->shadow_begin()->getTargetDecl();
14471     if (SemaRef.DiagnoseUseOfDecl(Target, Loc))
14472       return QualType();
14473     Ty = cast<TypeDecl>(Target);
14474   } else {
14475     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14476            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14477     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14478   }
14479 
14480   return SemaRef.Context.getTypeDeclType(Ty);
14481 }
14482 
14483 template<typename Derived>
14484 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14485                                                        SourceLocation Loc) {
14486   return SemaRef.BuildTypeofExprType(E, Loc);
14487 }
14488 
14489 template<typename Derived>
14490 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14491   return SemaRef.Context.getTypeOfType(Underlying);
14492 }
14493 
14494 template<typename Derived>
14495 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14496                                                      SourceLocation Loc) {
14497   return SemaRef.BuildDecltypeType(E, Loc);
14498 }
14499 
14500 template<typename Derived>
14501 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14502                                             UnaryTransformType::UTTKind UKind,
14503                                             SourceLocation Loc) {
14504   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14505 }
14506 
14507 template<typename Derived>
14508 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14509                                                       TemplateName Template,
14510                                              SourceLocation TemplateNameLoc,
14511                                      TemplateArgumentListInfo &TemplateArgs) {
14512   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14513 }
14514 
14515 template<typename Derived>
14516 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14517                                                    SourceLocation KWLoc) {
14518   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14519 }
14520 
14521 template<typename Derived>
14522 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14523                                                  SourceLocation KWLoc,
14524                                                  bool isReadPipe) {
14525   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14526                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14527 }
14528 
14529 template <typename Derived>
14530 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14531                                                    unsigned NumBits,
14532                                                    SourceLocation Loc) {
14533   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14534                         NumBits, true);
14535   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14536                                                 SemaRef.Context.IntTy, Loc);
14537   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14538 }
14539 
14540 template <typename Derived>
14541 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14542     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14543   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14544 }
14545 
14546 template<typename Derived>
14547 TemplateName
14548 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14549                                             bool TemplateKW,
14550                                             TemplateDecl *Template) {
14551   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14552                                                   Template);
14553 }
14554 
14555 template<typename Derived>
14556 TemplateName
14557 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14558                                             SourceLocation TemplateKWLoc,
14559                                             const IdentifierInfo &Name,
14560                                             SourceLocation NameLoc,
14561                                             QualType ObjectType,
14562                                             NamedDecl *FirstQualifierInScope,
14563                                             bool AllowInjectedClassName) {
14564   UnqualifiedId TemplateName;
14565   TemplateName.setIdentifier(&Name, NameLoc);
14566   Sema::TemplateTy Template;
14567   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14568                               TemplateName, ParsedType::make(ObjectType),
14569                               /*EnteringContext=*/false, Template,
14570                               AllowInjectedClassName);
14571   return Template.get();
14572 }
14573 
14574 template<typename Derived>
14575 TemplateName
14576 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14577                                             SourceLocation TemplateKWLoc,
14578                                             OverloadedOperatorKind Operator,
14579                                             SourceLocation NameLoc,
14580                                             QualType ObjectType,
14581                                             bool AllowInjectedClassName) {
14582   UnqualifiedId Name;
14583   // FIXME: Bogus location information.
14584   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14585   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14586   Sema::TemplateTy Template;
14587   getSema().ActOnTemplateName(
14588       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14589       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14590   return Template.get();
14591 }
14592 
14593 template<typename Derived>
14594 ExprResult
14595 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14596                                                    SourceLocation OpLoc,
14597                                                    Expr *OrigCallee,
14598                                                    Expr *First,
14599                                                    Expr *Second) {
14600   Expr *Callee = OrigCallee->IgnoreParenCasts();
14601   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14602 
14603   if (First->getObjectKind() == OK_ObjCProperty) {
14604     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14605     if (BinaryOperator::isAssignmentOp(Opc))
14606       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14607                                                  First, Second);
14608     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14609     if (Result.isInvalid())
14610       return ExprError();
14611     First = Result.get();
14612   }
14613 
14614   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14615     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14616     if (Result.isInvalid())
14617       return ExprError();
14618     Second = Result.get();
14619   }
14620 
14621   // Determine whether this should be a builtin operation.
14622   if (Op == OO_Subscript) {
14623     if (!First->getType()->isOverloadableType() &&
14624         !Second->getType()->isOverloadableType())
14625       return getSema().CreateBuiltinArraySubscriptExpr(
14626           First, Callee->getBeginLoc(), Second, OpLoc);
14627   } else if (Op == OO_Arrow) {
14628     // -> is never a builtin operation.
14629     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14630   } else if (Second == nullptr || isPostIncDec) {
14631     if (!First->getType()->isOverloadableType() ||
14632         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14633       // The argument is not of overloadable type, or this is an expression
14634       // of the form &Class::member, so try to create a built-in unary
14635       // operation.
14636       UnaryOperatorKind Opc
14637         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14638 
14639       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14640     }
14641   } else {
14642     if (!First->getType()->isOverloadableType() &&
14643         !Second->getType()->isOverloadableType()) {
14644       // Neither of the arguments is an overloadable type, so try to
14645       // create a built-in binary operation.
14646       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14647       ExprResult Result
14648         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14649       if (Result.isInvalid())
14650         return ExprError();
14651 
14652       return Result;
14653     }
14654   }
14655 
14656   // Compute the transformed set of functions (and function templates) to be
14657   // used during overload resolution.
14658   UnresolvedSet<16> Functions;
14659   bool RequiresADL;
14660 
14661   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14662     Functions.append(ULE->decls_begin(), ULE->decls_end());
14663     // If the overload could not be resolved in the template definition
14664     // (because we had a dependent argument), ADL is performed as part of
14665     // template instantiation.
14666     RequiresADL = ULE->requiresADL();
14667   } else {
14668     // If we've resolved this to a particular non-member function, just call
14669     // that function. If we resolved it to a member function,
14670     // CreateOverloaded* will find that function for us.
14671     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14672     if (!isa<CXXMethodDecl>(ND))
14673       Functions.addDecl(ND);
14674     RequiresADL = false;
14675   }
14676 
14677   // Add any functions found via argument-dependent lookup.
14678   Expr *Args[2] = { First, Second };
14679   unsigned NumArgs = 1 + (Second != nullptr);
14680 
14681   // Create the overloaded operator invocation for unary operators.
14682   if (NumArgs == 1 || isPostIncDec) {
14683     UnaryOperatorKind Opc
14684       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14685     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14686                                            RequiresADL);
14687   }
14688 
14689   if (Op == OO_Subscript) {
14690     SourceLocation LBrace;
14691     SourceLocation RBrace;
14692 
14693     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14694       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14695       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14696       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14697     } else {
14698       LBrace = Callee->getBeginLoc();
14699       RBrace = OpLoc;
14700     }
14701 
14702     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14703                                                       First, Second);
14704   }
14705 
14706   // Create the overloaded operator invocation for binary operators.
14707   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14708   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14709       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14710   if (Result.isInvalid())
14711     return ExprError();
14712 
14713   return Result;
14714 }
14715 
14716 template<typename Derived>
14717 ExprResult
14718 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14719                                                      SourceLocation OperatorLoc,
14720                                                        bool isArrow,
14721                                                        CXXScopeSpec &SS,
14722                                                      TypeSourceInfo *ScopeType,
14723                                                        SourceLocation CCLoc,
14724                                                        SourceLocation TildeLoc,
14725                                         PseudoDestructorTypeStorage Destroyed) {
14726   QualType BaseType = Base->getType();
14727   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14728       (!isArrow && !BaseType->getAs<RecordType>()) ||
14729       (isArrow && BaseType->getAs<PointerType>() &&
14730        !BaseType->castAs<PointerType>()->getPointeeType()
14731                                               ->template getAs<RecordType>())){
14732     // This pseudo-destructor expression is still a pseudo-destructor.
14733     return SemaRef.BuildPseudoDestructorExpr(
14734         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14735         CCLoc, TildeLoc, Destroyed);
14736   }
14737 
14738   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14739   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14740                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14741   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14742   NameInfo.setNamedTypeInfo(DestroyedType);
14743 
14744   // The scope type is now known to be a valid nested name specifier
14745   // component. Tack it on to the end of the nested name specifier.
14746   if (ScopeType) {
14747     if (!ScopeType->getType()->getAs<TagType>()) {
14748       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14749                      diag::err_expected_class_or_namespace)
14750           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14751       return ExprError();
14752     }
14753     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14754               CCLoc);
14755   }
14756 
14757   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14758   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14759                                             OperatorLoc, isArrow,
14760                                             SS, TemplateKWLoc,
14761                                             /*FIXME: FirstQualifier*/ nullptr,
14762                                             NameInfo,
14763                                             /*TemplateArgs*/ nullptr,
14764                                             /*S*/nullptr);
14765 }
14766 
14767 template<typename Derived>
14768 StmtResult
14769 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14770   SourceLocation Loc = S->getBeginLoc();
14771   CapturedDecl *CD = S->getCapturedDecl();
14772   unsigned NumParams = CD->getNumParams();
14773   unsigned ContextParamPos = CD->getContextParamPosition();
14774   SmallVector<Sema::CapturedParamNameType, 4> Params;
14775   for (unsigned I = 0; I < NumParams; ++I) {
14776     if (I != ContextParamPos) {
14777       Params.push_back(
14778              std::make_pair(
14779                   CD->getParam(I)->getName(),
14780                   getDerived().TransformType(CD->getParam(I)->getType())));
14781     } else {
14782       Params.push_back(std::make_pair(StringRef(), QualType()));
14783     }
14784   }
14785   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14786                                      S->getCapturedRegionKind(), Params);
14787   StmtResult Body;
14788   {
14789     Sema::CompoundScopeRAII CompoundScope(getSema());
14790     Body = getDerived().TransformStmt(S->getCapturedStmt());
14791   }
14792 
14793   if (Body.isInvalid()) {
14794     getSema().ActOnCapturedRegionError();
14795     return StmtError();
14796   }
14797 
14798   return getSema().ActOnCapturedRegionEnd(Body.get());
14799 }
14800 
14801 } // end namespace clang
14802 
14803 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14804