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/OpenMPKinds.h"
32 #include "clang/Sema/Designator.h"
33 #include "clang/Sema/Lookup.h"
34 #include "clang/Sema/Ownership.h"
35 #include "clang/Sema/ParsedTemplate.h"
36 #include "clang/Sema/ScopeInfo.h"
37 #include "clang/Sema/SemaDiagnostic.h"
38 #include "clang/Sema/SemaInternal.h"
39 #include "llvm/ADT/ArrayRef.h"
40 #include "llvm/Support/ErrorHandling.h"
41 #include <algorithm>
42 
43 using namespace llvm::omp;
44 
45 namespace clang {
46 using namespace sema;
47 
48 /// A semantic tree transformation that allows one to transform one
49 /// abstract syntax tree into another.
50 ///
51 /// A new tree transformation is defined by creating a new subclass \c X of
52 /// \c TreeTransform<X> and then overriding certain operations to provide
53 /// behavior specific to that transformation. For example, template
54 /// instantiation is implemented as a tree transformation where the
55 /// transformation of TemplateTypeParmType nodes involves substituting the
56 /// template arguments for their corresponding template parameters; a similar
57 /// transformation is performed for non-type template parameters and
58 /// template template parameters.
59 ///
60 /// This tree-transformation template uses static polymorphism to allow
61 /// subclasses to customize any of its operations. Thus, a subclass can
62 /// override any of the transformation or rebuild operators by providing an
63 /// operation with the same signature as the default implementation. The
64 /// overriding function should not be virtual.
65 ///
66 /// Semantic tree transformations are split into two stages, either of which
67 /// can be replaced by a subclass. The "transform" step transforms an AST node
68 /// or the parts of an AST node using the various transformation functions,
69 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
70 /// node of the appropriate kind from the pieces. The default transformation
71 /// routines recursively transform the operands to composite AST nodes (e.g.,
72 /// the pointee type of a PointerType node) and, if any of those operand nodes
73 /// were changed by the transformation, invokes the rebuild operation to create
74 /// a new AST node.
75 ///
76 /// Subclasses can customize the transformation at various levels. The
77 /// most coarse-grained transformations involve replacing TransformType(),
78 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
79 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
80 /// new implementations.
81 ///
82 /// For more fine-grained transformations, subclasses can replace any of the
83 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
84 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
85 /// replacing TransformTemplateTypeParmType() allows template instantiation
86 /// to substitute template arguments for their corresponding template
87 /// parameters. Additionally, subclasses can override the \c RebuildXXX
88 /// functions to control how AST nodes are rebuilt when their operands change.
89 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
90 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
91 /// be able to use more efficient rebuild steps.
92 ///
93 /// There are a handful of other functions that can be overridden, allowing one
94 /// to avoid traversing nodes that don't need any transformation
95 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
96 /// operands have not changed (\c AlwaysRebuild()), and customize the
97 /// default locations and entity names used for type-checking
98 /// (\c getBaseLocation(), \c getBaseEntity()).
99 template<typename Derived>
100 class TreeTransform {
101   /// Private RAII object that helps us forget and then re-remember
102   /// the template argument corresponding to a partially-substituted parameter
103   /// pack.
104   class ForgetPartiallySubstitutedPackRAII {
105     Derived &Self;
106     TemplateArgument Old;
107 
108   public:
109     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
110       Old = Self.ForgetPartiallySubstitutedPack();
111     }
112 
113     ~ForgetPartiallySubstitutedPackRAII() {
114       Self.RememberPartiallySubstitutedPack(Old);
115     }
116   };
117 
118 protected:
119   Sema &SemaRef;
120 
121   /// The set of local declarations that have been transformed, for
122   /// cases where we are forced to build new declarations within the transformer
123   /// rather than in the subclass (e.g., lambda closure types).
124   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
125 
126 public:
127   /// Initializes a new tree transformer.
128   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
129 
130   /// Retrieves a reference to the derived class.
131   Derived &getDerived() { return static_cast<Derived&>(*this); }
132 
133   /// Retrieves a reference to the derived class.
134   const Derived &getDerived() const {
135     return static_cast<const Derived&>(*this);
136   }
137 
138   static inline ExprResult Owned(Expr *E) { return E; }
139   static inline StmtResult Owned(Stmt *S) { return S; }
140 
141   /// Retrieves a reference to the semantic analysis object used for
142   /// this tree transform.
143   Sema &getSema() const { return SemaRef; }
144 
145   /// Whether the transformation should always rebuild AST nodes, even
146   /// if none of the children have changed.
147   ///
148   /// Subclasses may override this function to specify when the transformation
149   /// should rebuild all AST nodes.
150   ///
151   /// We must always rebuild all AST nodes when performing variadic template
152   /// pack expansion, in order to avoid violating the AST invariant that each
153   /// statement node appears at most once in its containing declaration.
154   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
155 
156   /// Whether the transformation is forming an expression or statement that
157   /// replaces the original. In this case, we'll reuse mangling numbers from
158   /// existing lambdas.
159   bool ReplacingOriginal() { return false; }
160 
161   /// Wether CXXConstructExpr can be skipped when they are implicit.
162   /// They will be reconstructed when used if needed.
163   /// This is usefull when the user that cause rebuilding of the
164   /// CXXConstructExpr is outside of the expression at which the TreeTransform
165   /// started.
166   bool AllowSkippingCXXConstructExpr() { return true; }
167 
168   /// Returns the location of the entity being transformed, if that
169   /// information was not available elsewhere in the AST.
170   ///
171   /// By default, returns no source-location information. Subclasses can
172   /// provide an alternative implementation that provides better location
173   /// information.
174   SourceLocation getBaseLocation() { return SourceLocation(); }
175 
176   /// Returns the name of the entity being transformed, if that
177   /// information was not available elsewhere in the AST.
178   ///
179   /// By default, returns an empty name. Subclasses can provide an alternative
180   /// implementation with a more precise name.
181   DeclarationName getBaseEntity() { return DeclarationName(); }
182 
183   /// Sets the "base" location and entity when that
184   /// information is known based on another transformation.
185   ///
186   /// By default, the source location and entity are ignored. Subclasses can
187   /// override this function to provide a customized implementation.
188   void setBase(SourceLocation Loc, DeclarationName Entity) { }
189 
190   /// RAII object that temporarily sets the base location and entity
191   /// used for reporting diagnostics in types.
192   class TemporaryBase {
193     TreeTransform &Self;
194     SourceLocation OldLocation;
195     DeclarationName OldEntity;
196 
197   public:
198     TemporaryBase(TreeTransform &Self, SourceLocation Location,
199                   DeclarationName Entity) : Self(Self) {
200       OldLocation = Self.getDerived().getBaseLocation();
201       OldEntity = Self.getDerived().getBaseEntity();
202 
203       if (Location.isValid())
204         Self.getDerived().setBase(Location, Entity);
205     }
206 
207     ~TemporaryBase() {
208       Self.getDerived().setBase(OldLocation, OldEntity);
209     }
210   };
211 
212   /// Determine whether the given type \p T has already been
213   /// transformed.
214   ///
215   /// Subclasses can provide an alternative implementation of this routine
216   /// to short-circuit evaluation when it is known that a given type will
217   /// not change. For example, template instantiation need not traverse
218   /// non-dependent types.
219   bool AlreadyTransformed(QualType T) {
220     return T.isNull();
221   }
222 
223   /// Transform a template parameter depth level.
224   ///
225   /// During a transformation that transforms template parameters, this maps
226   /// an old template parameter depth to a new depth.
227   unsigned TransformTemplateDepth(unsigned Depth) {
228     return Depth;
229   }
230 
231   /// Determine whether the given call argument should be dropped, e.g.,
232   /// because it is a default argument.
233   ///
234   /// Subclasses can provide an alternative implementation of this routine to
235   /// determine which kinds of call arguments get dropped. By default,
236   /// CXXDefaultArgument nodes are dropped (prior to transformation).
237   bool DropCallArgument(Expr *E) {
238     return E->isDefaultArgument();
239   }
240 
241   /// Determine whether we should expand a pack expansion with the
242   /// given set of parameter packs into separate arguments by repeatedly
243   /// transforming the pattern.
244   ///
245   /// By default, the transformer never tries to expand pack expansions.
246   /// Subclasses can override this routine to provide different behavior.
247   ///
248   /// \param EllipsisLoc The location of the ellipsis that identifies the
249   /// pack expansion.
250   ///
251   /// \param PatternRange The source range that covers the entire pattern of
252   /// the pack expansion.
253   ///
254   /// \param Unexpanded The set of unexpanded parameter packs within the
255   /// pattern.
256   ///
257   /// \param ShouldExpand Will be set to \c true if the transformer should
258   /// expand the corresponding pack expansions into separate arguments. When
259   /// set, \c NumExpansions must also be set.
260   ///
261   /// \param RetainExpansion Whether the caller should add an unexpanded
262   /// pack expansion after all of the expanded arguments. This is used
263   /// when extending explicitly-specified template argument packs per
264   /// C++0x [temp.arg.explicit]p9.
265   ///
266   /// \param NumExpansions The number of separate arguments that will be in
267   /// the expanded form of the corresponding pack expansion. This is both an
268   /// input and an output parameter, which can be set by the caller if the
269   /// number of expansions is known a priori (e.g., due to a prior substitution)
270   /// and will be set by the callee when the number of expansions is known.
271   /// The callee must set this value when \c ShouldExpand is \c true; it may
272   /// set this value in other cases.
273   ///
274   /// \returns true if an error occurred (e.g., because the parameter packs
275   /// are to be instantiated with arguments of different lengths), false
276   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
277   /// must be set.
278   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
279                                SourceRange PatternRange,
280                                ArrayRef<UnexpandedParameterPack> Unexpanded,
281                                bool &ShouldExpand,
282                                bool &RetainExpansion,
283                                Optional<unsigned> &NumExpansions) {
284     ShouldExpand = false;
285     return false;
286   }
287 
288   /// "Forget" about the partially-substituted pack template argument,
289   /// when performing an instantiation that must preserve the parameter pack
290   /// use.
291   ///
292   /// This routine is meant to be overridden by the template instantiator.
293   TemplateArgument ForgetPartiallySubstitutedPack() {
294     return TemplateArgument();
295   }
296 
297   /// "Remember" the partially-substituted pack template argument
298   /// after performing an instantiation that must preserve the parameter pack
299   /// use.
300   ///
301   /// This routine is meant to be overridden by the template instantiator.
302   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
303 
304   /// Note to the derived class when a function parameter pack is
305   /// being expanded.
306   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
307 
308   /// Transforms the given type into another type.
309   ///
310   /// By default, this routine transforms a type by creating a
311   /// TypeSourceInfo for it and delegating to the appropriate
312   /// function.  This is expensive, but we don't mind, because
313   /// this method is deprecated anyway;  all users should be
314   /// switched to storing TypeSourceInfos.
315   ///
316   /// \returns the transformed type.
317   QualType TransformType(QualType T);
318 
319   /// Transforms the given type-with-location into a new
320   /// type-with-location.
321   ///
322   /// By default, this routine transforms a type by delegating to the
323   /// appropriate TransformXXXType to build a new type.  Subclasses
324   /// may override this function (to take over all type
325   /// transformations) or some set of the TransformXXXType functions
326   /// to alter the transformation.
327   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
328 
329   /// Transform the given type-with-location into a new
330   /// type, collecting location information in the given builder
331   /// as necessary.
332   ///
333   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
334 
335   /// Transform a type that is permitted to produce a
336   /// DeducedTemplateSpecializationType.
337   ///
338   /// This is used in the (relatively rare) contexts where it is acceptable
339   /// for transformation to produce a class template type with deduced
340   /// template arguments.
341   /// @{
342   QualType TransformTypeWithDeducedTST(QualType T);
343   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
344   /// @}
345 
346   /// The reason why the value of a statement is not discarded, if any.
347   enum StmtDiscardKind {
348     SDK_Discarded,
349     SDK_NotDiscarded,
350     SDK_StmtExprResult,
351   };
352 
353   /// Transform the given statement.
354   ///
355   /// By default, this routine transforms a statement by delegating to the
356   /// appropriate TransformXXXStmt function to transform a specific kind of
357   /// statement or the TransformExpr() function to transform an expression.
358   /// Subclasses may override this function to transform statements using some
359   /// other mechanism.
360   ///
361   /// \returns the transformed statement.
362   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
363 
364   /// Transform the given statement.
365   ///
366   /// By default, this routine transforms a statement by delegating to the
367   /// appropriate TransformOMPXXXClause function to transform a specific kind
368   /// of clause. Subclasses may override this function to transform statements
369   /// using some other mechanism.
370   ///
371   /// \returns the transformed OpenMP clause.
372   OMPClause *TransformOMPClause(OMPClause *S);
373 
374   /// Transform the given attribute.
375   ///
376   /// By default, this routine transforms a statement by delegating to the
377   /// appropriate TransformXXXAttr function to transform a specific kind
378   /// of attribute. Subclasses may override this function to transform
379   /// attributed statements using some other mechanism.
380   ///
381   /// \returns the transformed attribute
382   const Attr *TransformAttr(const Attr *S);
383 
384 /// Transform the specified attribute.
385 ///
386 /// Subclasses should override the transformation of attributes with a pragma
387 /// spelling to transform expressions stored within the attribute.
388 ///
389 /// \returns the transformed attribute.
390 #define ATTR(X)
391 #define PRAGMA_SPELLING_ATTR(X)                                                \
392   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
393 #include "clang/Basic/AttrList.inc"
394 
395   /// Transform the given expression.
396   ///
397   /// By default, this routine transforms an expression by delegating to the
398   /// appropriate TransformXXXExpr function to build a new expression.
399   /// Subclasses may override this function to transform expressions using some
400   /// other mechanism.
401   ///
402   /// \returns the transformed expression.
403   ExprResult TransformExpr(Expr *E);
404 
405   /// Transform the given initializer.
406   ///
407   /// By default, this routine transforms an initializer by stripping off the
408   /// semantic nodes added by initialization, then passing the result to
409   /// TransformExpr or TransformExprs.
410   ///
411   /// \returns the transformed initializer.
412   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
413 
414   /// Transform the given list of expressions.
415   ///
416   /// This routine transforms a list of expressions by invoking
417   /// \c TransformExpr() for each subexpression. However, it also provides
418   /// support for variadic templates by expanding any pack expansions (if the
419   /// derived class permits such expansion) along the way. When pack expansions
420   /// are present, the number of outputs may not equal the number of inputs.
421   ///
422   /// \param Inputs The set of expressions to be transformed.
423   ///
424   /// \param NumInputs The number of expressions in \c Inputs.
425   ///
426   /// \param IsCall If \c true, then this transform is being performed on
427   /// function-call arguments, and any arguments that should be dropped, will
428   /// be.
429   ///
430   /// \param Outputs The transformed input expressions will be added to this
431   /// vector.
432   ///
433   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
434   /// due to transformation.
435   ///
436   /// \returns true if an error occurred, false otherwise.
437   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
438                       SmallVectorImpl<Expr *> &Outputs,
439                       bool *ArgChanged = nullptr);
440 
441   /// Transform the given declaration, which is referenced from a type
442   /// or expression.
443   ///
444   /// By default, acts as the identity function on declarations, unless the
445   /// transformer has had to transform the declaration itself. Subclasses
446   /// may override this function to provide alternate behavior.
447   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
448     llvm::DenseMap<Decl *, Decl *>::iterator Known
449       = TransformedLocalDecls.find(D);
450     if (Known != TransformedLocalDecls.end())
451       return Known->second;
452 
453     return D;
454   }
455 
456   /// Transform the specified condition.
457   ///
458   /// By default, this transforms the variable and expression and rebuilds
459   /// the condition.
460   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
461                                            Expr *Expr,
462                                            Sema::ConditionKind Kind);
463 
464   /// Transform the attributes associated with the given declaration and
465   /// place them on the new declaration.
466   ///
467   /// By default, this operation does nothing. Subclasses may override this
468   /// behavior to transform attributes.
469   void transformAttrs(Decl *Old, Decl *New) { }
470 
471   /// Note that a local declaration has been transformed by this
472   /// transformer.
473   ///
474   /// Local declarations are typically transformed via a call to
475   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
476   /// the transformer itself has to transform the declarations. This routine
477   /// can be overridden by a subclass that keeps track of such mappings.
478   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
479     assert(New.size() == 1 &&
480            "must override transformedLocalDecl if performing pack expansion");
481     TransformedLocalDecls[Old] = New.front();
482   }
483 
484   /// Transform the definition of the given declaration.
485   ///
486   /// By default, invokes TransformDecl() to transform the declaration.
487   /// Subclasses may override this function to provide alternate behavior.
488   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
489     return getDerived().TransformDecl(Loc, D);
490   }
491 
492   /// Transform the given declaration, which was the first part of a
493   /// nested-name-specifier in a member access expression.
494   ///
495   /// This specific declaration transformation only applies to the first
496   /// identifier in a nested-name-specifier of a member access expression, e.g.,
497   /// the \c T in \c x->T::member
498   ///
499   /// By default, invokes TransformDecl() to transform the declaration.
500   /// Subclasses may override this function to provide alternate behavior.
501   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
502     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
503   }
504 
505   /// Transform the set of declarations in an OverloadExpr.
506   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
507                                   LookupResult &R);
508 
509   /// Transform the given nested-name-specifier with source-location
510   /// information.
511   ///
512   /// By default, transforms all of the types and declarations within the
513   /// nested-name-specifier. Subclasses may override this function to provide
514   /// alternate behavior.
515   NestedNameSpecifierLoc
516   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
517                                   QualType ObjectType = QualType(),
518                                   NamedDecl *FirstQualifierInScope = nullptr);
519 
520   /// Transform the given declaration name.
521   ///
522   /// By default, transforms the types of conversion function, constructor,
523   /// and destructor names and then (if needed) rebuilds the declaration name.
524   /// Identifiers and selectors are returned unmodified. Sublcasses may
525   /// override this function to provide alternate behavior.
526   DeclarationNameInfo
527   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
528 
529   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
530       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
531   concepts::TypeRequirement *
532   TransformTypeRequirement(concepts::TypeRequirement *Req);
533   concepts::ExprRequirement *
534   TransformExprRequirement(concepts::ExprRequirement *Req);
535   concepts::NestedRequirement *
536   TransformNestedRequirement(concepts::NestedRequirement *Req);
537 
538   /// Transform the given template name.
539   ///
540   /// \param SS The nested-name-specifier that qualifies the template
541   /// name. This nested-name-specifier must already have been transformed.
542   ///
543   /// \param Name The template name to transform.
544   ///
545   /// \param NameLoc The source location of the template name.
546   ///
547   /// \param ObjectType If we're translating a template name within a member
548   /// access expression, this is the type of the object whose member template
549   /// is being referenced.
550   ///
551   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
552   /// also refers to a name within the current (lexical) scope, this is the
553   /// declaration it refers to.
554   ///
555   /// By default, transforms the template name by transforming the declarations
556   /// and nested-name-specifiers that occur within the template name.
557   /// Subclasses may override this function to provide alternate behavior.
558   TemplateName
559   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
560                         SourceLocation NameLoc,
561                         QualType ObjectType = QualType(),
562                         NamedDecl *FirstQualifierInScope = nullptr,
563                         bool AllowInjectedClassName = false);
564 
565   /// Transform the given template argument.
566   ///
567   /// By default, this operation transforms the type, expression, or
568   /// declaration stored within the template argument and constructs a
569   /// new template argument from the transformed result. Subclasses may
570   /// override this function to provide alternate behavior.
571   ///
572   /// Returns true if there was an error.
573   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
574                                  TemplateArgumentLoc &Output,
575                                  bool Uneval = false);
576 
577   /// Transform the given set of template arguments.
578   ///
579   /// By default, this operation transforms all of the template arguments
580   /// in the input set using \c TransformTemplateArgument(), and appends
581   /// the transformed arguments to the output list.
582   ///
583   /// Note that this overload of \c TransformTemplateArguments() is merely
584   /// a convenience function. Subclasses that wish to override this behavior
585   /// should override the iterator-based member template version.
586   ///
587   /// \param Inputs The set of template arguments to be transformed.
588   ///
589   /// \param NumInputs The number of template arguments in \p Inputs.
590   ///
591   /// \param Outputs The set of transformed template arguments output by this
592   /// routine.
593   ///
594   /// Returns true if an error occurred.
595   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
596                                   unsigned NumInputs,
597                                   TemplateArgumentListInfo &Outputs,
598                                   bool Uneval = false) {
599     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
600                                       Uneval);
601   }
602 
603   /// Transform the given set of template arguments.
604   ///
605   /// By default, this operation transforms all of the template arguments
606   /// in the input set using \c TransformTemplateArgument(), and appends
607   /// the transformed arguments to the output list.
608   ///
609   /// \param First An iterator to the first template argument.
610   ///
611   /// \param Last An iterator one step past the last template argument.
612   ///
613   /// \param Outputs The set of transformed template arguments output by this
614   /// routine.
615   ///
616   /// Returns true if an error occurred.
617   template<typename InputIterator>
618   bool TransformTemplateArguments(InputIterator First,
619                                   InputIterator Last,
620                                   TemplateArgumentListInfo &Outputs,
621                                   bool Uneval = false);
622 
623   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
624   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
625                                  TemplateArgumentLoc &ArgLoc);
626 
627   /// Fakes up a TypeSourceInfo for a type.
628   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
629     return SemaRef.Context.getTrivialTypeSourceInfo(T,
630                        getDerived().getBaseLocation());
631   }
632 
633 #define ABSTRACT_TYPELOC(CLASS, PARENT)
634 #define TYPELOC(CLASS, PARENT)                                   \
635   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
636 #include "clang/AST/TypeLocNodes.def"
637 
638   template<typename Fn>
639   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
640                                       FunctionProtoTypeLoc TL,
641                                       CXXRecordDecl *ThisContext,
642                                       Qualifiers ThisTypeQuals,
643                                       Fn TransformExceptionSpec);
644 
645   bool TransformExceptionSpec(SourceLocation Loc,
646                               FunctionProtoType::ExceptionSpecInfo &ESI,
647                               SmallVectorImpl<QualType> &Exceptions,
648                               bool &Changed);
649 
650   StmtResult TransformSEHHandler(Stmt *Handler);
651 
652   QualType
653   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
654                                       TemplateSpecializationTypeLoc TL,
655                                       TemplateName Template);
656 
657   QualType
658   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
659                                       DependentTemplateSpecializationTypeLoc TL,
660                                                TemplateName Template,
661                                                CXXScopeSpec &SS);
662 
663   QualType TransformDependentTemplateSpecializationType(
664       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
665       NestedNameSpecifierLoc QualifierLoc);
666 
667   /// Transforms the parameters of a function type into the
668   /// given vectors.
669   ///
670   /// The result vectors should be kept in sync; null entries in the
671   /// variables vector are acceptable.
672   ///
673   /// Return true on error.
674   bool TransformFunctionTypeParams(
675       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
676       const QualType *ParamTypes,
677       const FunctionProtoType::ExtParameterInfo *ParamInfos,
678       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
679       Sema::ExtParameterInfoBuilder &PInfos);
680 
681   /// Transforms a single function-type parameter.  Return null
682   /// on error.
683   ///
684   /// \param indexAdjustment - A number to add to the parameter's
685   ///   scope index;  can be negative
686   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
687                                           int indexAdjustment,
688                                           Optional<unsigned> NumExpansions,
689                                           bool ExpectParameterPack);
690 
691   /// Transform the body of a lambda-expression.
692   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
693   /// Alternative implementation of TransformLambdaBody that skips transforming
694   /// the body.
695   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
696 
697   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
698 
699   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
700   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
701 
702   TemplateParameterList *TransformTemplateParameterList(
703         TemplateParameterList *TPL) {
704     return TPL;
705   }
706 
707   ExprResult TransformAddressOfOperand(Expr *E);
708 
709   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
710                                                 bool IsAddressOfOperand,
711                                                 TypeSourceInfo **RecoveryTSI);
712 
713   ExprResult TransformParenDependentScopeDeclRefExpr(
714       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
715       TypeSourceInfo **RecoveryTSI);
716 
717   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
718 
719 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
720 // amount of stack usage with clang.
721 #define STMT(Node, Parent)                        \
722   LLVM_ATTRIBUTE_NOINLINE \
723   StmtResult Transform##Node(Node *S);
724 #define VALUESTMT(Node, Parent)                   \
725   LLVM_ATTRIBUTE_NOINLINE \
726   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
727 #define EXPR(Node, Parent)                        \
728   LLVM_ATTRIBUTE_NOINLINE \
729   ExprResult Transform##Node(Node *E);
730 #define ABSTRACT_STMT(Stmt)
731 #include "clang/AST/StmtNodes.inc"
732 
733 #define OMP_CLAUSE_CLASS(Enum, Str, Class)                                           \
734   LLVM_ATTRIBUTE_NOINLINE \
735   OMPClause *Transform ## Class(Class *S);
736 #include "llvm/Frontend/OpenMP/OMPKinds.def"
737 
738   /// Build a new qualified type given its unqualified type and type location.
739   ///
740   /// By default, this routine adds type qualifiers only to types that can
741   /// have qualifiers, and silently suppresses those qualifiers that are not
742   /// permitted. Subclasses may override this routine to provide different
743   /// behavior.
744   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
745 
746   /// Build a new pointer type given its pointee type.
747   ///
748   /// By default, performs semantic analysis when building the pointer type.
749   /// Subclasses may override this routine to provide different behavior.
750   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
751 
752   /// Build a new block pointer type given its pointee type.
753   ///
754   /// By default, performs semantic analysis when building the block pointer
755   /// type. Subclasses may override this routine to provide different behavior.
756   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
757 
758   /// Build a new reference type given the type it references.
759   ///
760   /// By default, performs semantic analysis when building the
761   /// reference type. Subclasses may override this routine to provide
762   /// different behavior.
763   ///
764   /// \param LValue whether the type was written with an lvalue sigil
765   /// or an rvalue sigil.
766   QualType RebuildReferenceType(QualType ReferentType,
767                                 bool LValue,
768                                 SourceLocation Sigil);
769 
770   /// Build a new member pointer type given the pointee type and the
771   /// class type it refers into.
772   ///
773   /// By default, performs semantic analysis when building the member pointer
774   /// type. Subclasses may override this routine to provide different behavior.
775   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
776                                     SourceLocation Sigil);
777 
778   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
779                                     SourceLocation ProtocolLAngleLoc,
780                                     ArrayRef<ObjCProtocolDecl *> Protocols,
781                                     ArrayRef<SourceLocation> ProtocolLocs,
782                                     SourceLocation ProtocolRAngleLoc);
783 
784   /// Build an Objective-C object type.
785   ///
786   /// By default, performs semantic analysis when building the object type.
787   /// Subclasses may override this routine to provide different behavior.
788   QualType RebuildObjCObjectType(QualType BaseType,
789                                  SourceLocation Loc,
790                                  SourceLocation TypeArgsLAngleLoc,
791                                  ArrayRef<TypeSourceInfo *> TypeArgs,
792                                  SourceLocation TypeArgsRAngleLoc,
793                                  SourceLocation ProtocolLAngleLoc,
794                                  ArrayRef<ObjCProtocolDecl *> Protocols,
795                                  ArrayRef<SourceLocation> ProtocolLocs,
796                                  SourceLocation ProtocolRAngleLoc);
797 
798   /// Build a new Objective-C object pointer type given the pointee type.
799   ///
800   /// By default, directly builds the pointer type, with no additional semantic
801   /// analysis.
802   QualType RebuildObjCObjectPointerType(QualType PointeeType,
803                                         SourceLocation Star);
804 
805   /// Build a new array type given the element type, size
806   /// modifier, size of the array (if known), size expression, and index type
807   /// qualifiers.
808   ///
809   /// By default, performs semantic analysis when building the array type.
810   /// Subclasses may override this routine to provide different behavior.
811   /// Also by default, all of the other Rebuild*Array
812   QualType RebuildArrayType(QualType ElementType,
813                             ArrayType::ArraySizeModifier SizeMod,
814                             const llvm::APInt *Size,
815                             Expr *SizeExpr,
816                             unsigned IndexTypeQuals,
817                             SourceRange BracketsRange);
818 
819   /// Build a new constant array type given the element type, size
820   /// modifier, (known) size of the array, and index type qualifiers.
821   ///
822   /// By default, performs semantic analysis when building the array type.
823   /// Subclasses may override this routine to provide different behavior.
824   QualType RebuildConstantArrayType(QualType ElementType,
825                                     ArrayType::ArraySizeModifier SizeMod,
826                                     const llvm::APInt &Size,
827                                     Expr *SizeExpr,
828                                     unsigned IndexTypeQuals,
829                                     SourceRange BracketsRange);
830 
831   /// Build a new incomplete array type given the element type, size
832   /// modifier, and index type qualifiers.
833   ///
834   /// By default, performs semantic analysis when building the array type.
835   /// Subclasses may override this routine to provide different behavior.
836   QualType RebuildIncompleteArrayType(QualType ElementType,
837                                       ArrayType::ArraySizeModifier SizeMod,
838                                       unsigned IndexTypeQuals,
839                                       SourceRange BracketsRange);
840 
841   /// Build a new variable-length array type given the element type,
842   /// size modifier, size expression, and index type qualifiers.
843   ///
844   /// By default, performs semantic analysis when building the array type.
845   /// Subclasses may override this routine to provide different behavior.
846   QualType RebuildVariableArrayType(QualType ElementType,
847                                     ArrayType::ArraySizeModifier SizeMod,
848                                     Expr *SizeExpr,
849                                     unsigned IndexTypeQuals,
850                                     SourceRange BracketsRange);
851 
852   /// Build a new dependent-sized array type given the element type,
853   /// size modifier, size expression, and index type qualifiers.
854   ///
855   /// By default, performs semantic analysis when building the array type.
856   /// Subclasses may override this routine to provide different behavior.
857   QualType RebuildDependentSizedArrayType(QualType ElementType,
858                                           ArrayType::ArraySizeModifier SizeMod,
859                                           Expr *SizeExpr,
860                                           unsigned IndexTypeQuals,
861                                           SourceRange BracketsRange);
862 
863   /// Build a new vector type given the element type and
864   /// number of elements.
865   ///
866   /// By default, performs semantic analysis when building the vector type.
867   /// Subclasses may override this routine to provide different behavior.
868   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
869                              VectorType::VectorKind VecKind);
870 
871   /// Build a new potentially dependently-sized extended vector type
872   /// given the element type and number of elements.
873   ///
874   /// By default, performs semantic analysis when building the vector type.
875   /// Subclasses may override this routine to provide different behavior.
876   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
877                                            SourceLocation AttributeLoc,
878                                            VectorType::VectorKind);
879 
880   /// Build a new extended vector type given the element type and
881   /// number of elements.
882   ///
883   /// By default, performs semantic analysis when building the vector type.
884   /// Subclasses may override this routine to provide different behavior.
885   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
886                                 SourceLocation AttributeLoc);
887 
888   /// Build a new potentially dependently-sized extended vector type
889   /// given the element type and number of elements.
890   ///
891   /// By default, performs semantic analysis when building the vector type.
892   /// Subclasses may override this routine to provide different behavior.
893   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
894                                               Expr *SizeExpr,
895                                               SourceLocation AttributeLoc);
896 
897   /// Build a new matrix type given the element type and dimensions.
898   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
899                                      unsigned NumColumns);
900 
901   /// Build a new matrix type given the type and dependently-defined
902   /// dimensions.
903   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
904                                            Expr *ColumnExpr,
905                                            SourceLocation AttributeLoc);
906 
907   /// Build a new DependentAddressSpaceType or return the pointee
908   /// type variable with the correct address space (retrieved from
909   /// AddrSpaceExpr) applied to it. The former will be returned in cases
910   /// where the address space remains dependent.
911   ///
912   /// By default, performs semantic analysis when building the type with address
913   /// space applied. Subclasses may override this routine to provide different
914   /// behavior.
915   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
916                                             Expr *AddrSpaceExpr,
917                                             SourceLocation AttributeLoc);
918 
919   /// Build a new function type.
920   ///
921   /// By default, performs semantic analysis when building the function type.
922   /// Subclasses may override this routine to provide different behavior.
923   QualType RebuildFunctionProtoType(QualType T,
924                                     MutableArrayRef<QualType> ParamTypes,
925                                     const FunctionProtoType::ExtProtoInfo &EPI);
926 
927   /// Build a new unprototyped function type.
928   QualType RebuildFunctionNoProtoType(QualType ResultType);
929 
930   /// Rebuild an unresolved typename type, given the decl that
931   /// the UnresolvedUsingTypenameDecl was transformed to.
932   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
933 
934   /// Build a new typedef type.
935   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
936     return SemaRef.Context.getTypeDeclType(Typedef);
937   }
938 
939   /// Build a new MacroDefined type.
940   QualType RebuildMacroQualifiedType(QualType T,
941                                      const IdentifierInfo *MacroII) {
942     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
943   }
944 
945   /// Build a new class/struct/union type.
946   QualType RebuildRecordType(RecordDecl *Record) {
947     return SemaRef.Context.getTypeDeclType(Record);
948   }
949 
950   /// Build a new Enum type.
951   QualType RebuildEnumType(EnumDecl *Enum) {
952     return SemaRef.Context.getTypeDeclType(Enum);
953   }
954 
955   /// Build a new typeof(expr) type.
956   ///
957   /// By default, performs semantic analysis when building the typeof type.
958   /// Subclasses may override this routine to provide different behavior.
959   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
960 
961   /// Build a new typeof(type) type.
962   ///
963   /// By default, builds a new TypeOfType with the given underlying type.
964   QualType RebuildTypeOfType(QualType Underlying);
965 
966   /// Build a new unary transform type.
967   QualType RebuildUnaryTransformType(QualType BaseType,
968                                      UnaryTransformType::UTTKind UKind,
969                                      SourceLocation Loc);
970 
971   /// Build a new C++11 decltype type.
972   ///
973   /// By default, performs semantic analysis when building the decltype type.
974   /// Subclasses may override this routine to provide different behavior.
975   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
976 
977   /// Build a new C++11 auto type.
978   ///
979   /// By default, builds a new AutoType with the given deduced type.
980   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
981                            ConceptDecl *TypeConstraintConcept,
982                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
983     // Note, IsDependent is always false here: we implicitly convert an 'auto'
984     // which has been deduced to a dependent type into an undeduced 'auto', so
985     // that we'll retry deduction after the transformation.
986     return SemaRef.Context.getAutoType(Deduced, Keyword,
987                                        /*IsDependent*/ false, /*IsPack=*/false,
988                                        TypeConstraintConcept,
989                                        TypeConstraintArgs);
990   }
991 
992   /// By default, builds a new DeducedTemplateSpecializationType with the given
993   /// deduced type.
994   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
995       QualType Deduced) {
996     return SemaRef.Context.getDeducedTemplateSpecializationType(
997         Template, Deduced, /*IsDependent*/ false);
998   }
999 
1000   /// Build a new template specialization type.
1001   ///
1002   /// By default, performs semantic analysis when building the template
1003   /// specialization type. Subclasses may override this routine to provide
1004   /// different behavior.
1005   QualType RebuildTemplateSpecializationType(TemplateName Template,
1006                                              SourceLocation TemplateLoc,
1007                                              TemplateArgumentListInfo &Args);
1008 
1009   /// Build a new parenthesized type.
1010   ///
1011   /// By default, builds a new ParenType type from the inner type.
1012   /// Subclasses may override this routine to provide different behavior.
1013   QualType RebuildParenType(QualType InnerType) {
1014     return SemaRef.BuildParenType(InnerType);
1015   }
1016 
1017   /// Build a new qualified name type.
1018   ///
1019   /// By default, builds a new ElaboratedType type from the keyword,
1020   /// the nested-name-specifier and the named type.
1021   /// Subclasses may override this routine to provide different behavior.
1022   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1023                                  ElaboratedTypeKeyword Keyword,
1024                                  NestedNameSpecifierLoc QualifierLoc,
1025                                  QualType Named) {
1026     return SemaRef.Context.getElaboratedType(Keyword,
1027                                          QualifierLoc.getNestedNameSpecifier(),
1028                                              Named);
1029   }
1030 
1031   /// Build a new typename type that refers to a template-id.
1032   ///
1033   /// By default, builds a new DependentNameType type from the
1034   /// nested-name-specifier and the given type. Subclasses may override
1035   /// this routine to provide different behavior.
1036   QualType RebuildDependentTemplateSpecializationType(
1037                                           ElaboratedTypeKeyword Keyword,
1038                                           NestedNameSpecifierLoc QualifierLoc,
1039                                           SourceLocation TemplateKWLoc,
1040                                           const IdentifierInfo *Name,
1041                                           SourceLocation NameLoc,
1042                                           TemplateArgumentListInfo &Args,
1043                                           bool AllowInjectedClassName) {
1044     // Rebuild the template name.
1045     // TODO: avoid TemplateName abstraction
1046     CXXScopeSpec SS;
1047     SS.Adopt(QualifierLoc);
1048     TemplateName InstName = getDerived().RebuildTemplateName(
1049         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1050         AllowInjectedClassName);
1051 
1052     if (InstName.isNull())
1053       return QualType();
1054 
1055     // If it's still dependent, make a dependent specialization.
1056     if (InstName.getAsDependentTemplateName())
1057       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1058                                           QualifierLoc.getNestedNameSpecifier(),
1059                                                                     Name,
1060                                                                     Args);
1061 
1062     // Otherwise, make an elaborated type wrapping a non-dependent
1063     // specialization.
1064     QualType T =
1065     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1066     if (T.isNull()) return QualType();
1067 
1068     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1069       return T;
1070 
1071     return SemaRef.Context.getElaboratedType(Keyword,
1072                                        QualifierLoc.getNestedNameSpecifier(),
1073                                              T);
1074   }
1075 
1076   /// Build a new typename type that refers to an identifier.
1077   ///
1078   /// By default, performs semantic analysis when building the typename type
1079   /// (or elaborated type). Subclasses may override this routine to provide
1080   /// different behavior.
1081   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1082                                     SourceLocation KeywordLoc,
1083                                     NestedNameSpecifierLoc QualifierLoc,
1084                                     const IdentifierInfo *Id,
1085                                     SourceLocation IdLoc,
1086                                     bool DeducedTSTContext) {
1087     CXXScopeSpec SS;
1088     SS.Adopt(QualifierLoc);
1089 
1090     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1091       // If the name is still dependent, just build a new dependent name type.
1092       if (!SemaRef.computeDeclContext(SS))
1093         return SemaRef.Context.getDependentNameType(Keyword,
1094                                           QualifierLoc.getNestedNameSpecifier(),
1095                                                     Id);
1096     }
1097 
1098     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1099       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1100                                        *Id, IdLoc, DeducedTSTContext);
1101     }
1102 
1103     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1104 
1105     // We had a dependent elaborated-type-specifier that has been transformed
1106     // into a non-dependent elaborated-type-specifier. Find the tag we're
1107     // referring to.
1108     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1109     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1110     if (!DC)
1111       return QualType();
1112 
1113     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1114       return QualType();
1115 
1116     TagDecl *Tag = nullptr;
1117     SemaRef.LookupQualifiedName(Result, DC);
1118     switch (Result.getResultKind()) {
1119       case LookupResult::NotFound:
1120       case LookupResult::NotFoundInCurrentInstantiation:
1121         break;
1122 
1123       case LookupResult::Found:
1124         Tag = Result.getAsSingle<TagDecl>();
1125         break;
1126 
1127       case LookupResult::FoundOverloaded:
1128       case LookupResult::FoundUnresolvedValue:
1129         llvm_unreachable("Tag lookup cannot find non-tags");
1130 
1131       case LookupResult::Ambiguous:
1132         // Let the LookupResult structure handle ambiguities.
1133         return QualType();
1134     }
1135 
1136     if (!Tag) {
1137       // Check where the name exists but isn't a tag type and use that to emit
1138       // better diagnostics.
1139       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1140       SemaRef.LookupQualifiedName(Result, DC);
1141       switch (Result.getResultKind()) {
1142         case LookupResult::Found:
1143         case LookupResult::FoundOverloaded:
1144         case LookupResult::FoundUnresolvedValue: {
1145           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1146           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1147           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1148                                                                << NTK << Kind;
1149           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1150           break;
1151         }
1152         default:
1153           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1154               << Kind << Id << DC << QualifierLoc.getSourceRange();
1155           break;
1156       }
1157       return QualType();
1158     }
1159 
1160     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1161                                               IdLoc, Id)) {
1162       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1163       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1164       return QualType();
1165     }
1166 
1167     // Build the elaborated-type-specifier type.
1168     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1169     return SemaRef.Context.getElaboratedType(Keyword,
1170                                          QualifierLoc.getNestedNameSpecifier(),
1171                                              T);
1172   }
1173 
1174   /// Build a new pack expansion type.
1175   ///
1176   /// By default, builds a new PackExpansionType type from the given pattern.
1177   /// Subclasses may override this routine to provide different behavior.
1178   QualType RebuildPackExpansionType(QualType Pattern,
1179                                     SourceRange PatternRange,
1180                                     SourceLocation EllipsisLoc,
1181                                     Optional<unsigned> NumExpansions) {
1182     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1183                                         NumExpansions);
1184   }
1185 
1186   /// Build a new atomic type given its value type.
1187   ///
1188   /// By default, performs semantic analysis when building the atomic type.
1189   /// Subclasses may override this routine to provide different behavior.
1190   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1191 
1192   /// Build a new pipe type given its value type.
1193   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1194                            bool isReadPipe);
1195 
1196    /// Build an extended int given its value type.
1197   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1198                              SourceLocation Loc);
1199 
1200   /// Build a dependent extended int given its value type.
1201   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1202                                       SourceLocation Loc);
1203 
1204   /// Build a new template name given a nested name specifier, a flag
1205   /// indicating whether the "template" keyword was provided, and the template
1206   /// that the template name refers to.
1207   ///
1208   /// By default, builds the new template name directly. Subclasses may override
1209   /// this routine to provide different behavior.
1210   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1211                                    bool TemplateKW,
1212                                    TemplateDecl *Template);
1213 
1214   /// Build a new template name given a nested name specifier and the
1215   /// name that is referred to as a template.
1216   ///
1217   /// By default, performs semantic analysis to determine whether the name can
1218   /// be resolved to a specific template, then builds the appropriate kind of
1219   /// template name. Subclasses may override this routine to provide different
1220   /// behavior.
1221   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1222                                    SourceLocation TemplateKWLoc,
1223                                    const IdentifierInfo &Name,
1224                                    SourceLocation NameLoc, QualType ObjectType,
1225                                    NamedDecl *FirstQualifierInScope,
1226                                    bool AllowInjectedClassName);
1227 
1228   /// Build a new template name given a nested name specifier and the
1229   /// overloaded operator name that is referred to as a template.
1230   ///
1231   /// By default, performs semantic analysis to determine whether the name can
1232   /// be resolved to a specific template, then builds the appropriate kind of
1233   /// template name. Subclasses may override this routine to provide different
1234   /// behavior.
1235   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1236                                    SourceLocation TemplateKWLoc,
1237                                    OverloadedOperatorKind Operator,
1238                                    SourceLocation NameLoc, QualType ObjectType,
1239                                    bool AllowInjectedClassName);
1240 
1241   /// Build a new template name given a template template parameter pack
1242   /// and the
1243   ///
1244   /// By default, performs semantic analysis to determine whether the name can
1245   /// be resolved to a specific template, then builds the appropriate kind of
1246   /// template name. Subclasses may override this routine to provide different
1247   /// behavior.
1248   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1249                                    const TemplateArgument &ArgPack) {
1250     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1251   }
1252 
1253   /// Build a new compound statement.
1254   ///
1255   /// By default, performs semantic analysis to build the new statement.
1256   /// Subclasses may override this routine to provide different behavior.
1257   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1258                                        MultiStmtArg Statements,
1259                                        SourceLocation RBraceLoc,
1260                                        bool IsStmtExpr) {
1261     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1262                                        IsStmtExpr);
1263   }
1264 
1265   /// Build a new case statement.
1266   ///
1267   /// By default, performs semantic analysis to build the new statement.
1268   /// Subclasses may override this routine to provide different behavior.
1269   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1270                                    Expr *LHS,
1271                                    SourceLocation EllipsisLoc,
1272                                    Expr *RHS,
1273                                    SourceLocation ColonLoc) {
1274     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1275                                    ColonLoc);
1276   }
1277 
1278   /// Attach the body to a new case statement.
1279   ///
1280   /// By default, performs semantic analysis to build the new statement.
1281   /// Subclasses may override this routine to provide different behavior.
1282   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1283     getSema().ActOnCaseStmtBody(S, Body);
1284     return S;
1285   }
1286 
1287   /// Build a new default statement.
1288   ///
1289   /// By default, performs semantic analysis to build the new statement.
1290   /// Subclasses may override this routine to provide different behavior.
1291   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1292                                       SourceLocation ColonLoc,
1293                                       Stmt *SubStmt) {
1294     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1295                                       /*CurScope=*/nullptr);
1296   }
1297 
1298   /// Build a new label statement.
1299   ///
1300   /// By default, performs semantic analysis to build the new statement.
1301   /// Subclasses may override this routine to provide different behavior.
1302   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1303                               SourceLocation ColonLoc, Stmt *SubStmt) {
1304     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1305   }
1306 
1307   /// Build a new label statement.
1308   ///
1309   /// By default, performs semantic analysis to build the new statement.
1310   /// Subclasses may override this routine to provide different behavior.
1311   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1312                                    ArrayRef<const Attr*> Attrs,
1313                                    Stmt *SubStmt) {
1314     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1315   }
1316 
1317   /// Build a new "if" statement.
1318   ///
1319   /// By default, performs semantic analysis to build the new statement.
1320   /// Subclasses may override this routine to provide different behavior.
1321   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1322                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1323                            SourceLocation ElseLoc, Stmt *Else) {
1324     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1325                                  ElseLoc, Else);
1326   }
1327 
1328   /// Start building a new switch statement.
1329   ///
1330   /// By default, performs semantic analysis to build the new statement.
1331   /// Subclasses may override this routine to provide different behavior.
1332   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1333                                     Sema::ConditionResult Cond) {
1334     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1335   }
1336 
1337   /// Attach the body to the switch statement.
1338   ///
1339   /// By default, performs semantic analysis to build the new statement.
1340   /// Subclasses may override this routine to provide different behavior.
1341   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1342                                    Stmt *Switch, Stmt *Body) {
1343     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1344   }
1345 
1346   /// Build a new while statement.
1347   ///
1348   /// By default, performs semantic analysis to build the new statement.
1349   /// Subclasses may override this routine to provide different behavior.
1350   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1351                               Sema::ConditionResult Cond, Stmt *Body) {
1352     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1353   }
1354 
1355   /// Build a new do-while statement.
1356   ///
1357   /// By default, performs semantic analysis to build the new statement.
1358   /// Subclasses may override this routine to provide different behavior.
1359   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1360                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1361                            Expr *Cond, SourceLocation RParenLoc) {
1362     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1363                                  Cond, RParenLoc);
1364   }
1365 
1366   /// Build a new for statement.
1367   ///
1368   /// By default, performs semantic analysis to build the new statement.
1369   /// Subclasses may override this routine to provide different behavior.
1370   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1371                             Stmt *Init, Sema::ConditionResult Cond,
1372                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1373                             Stmt *Body) {
1374     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1375                                   Inc, RParenLoc, Body);
1376   }
1377 
1378   /// Build a new goto statement.
1379   ///
1380   /// By default, performs semantic analysis to build the new statement.
1381   /// Subclasses may override this routine to provide different behavior.
1382   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1383                              LabelDecl *Label) {
1384     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1385   }
1386 
1387   /// Build a new indirect goto statement.
1388   ///
1389   /// By default, performs semantic analysis to build the new statement.
1390   /// Subclasses may override this routine to provide different behavior.
1391   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1392                                      SourceLocation StarLoc,
1393                                      Expr *Target) {
1394     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1395   }
1396 
1397   /// Build a new return statement.
1398   ///
1399   /// By default, performs semantic analysis to build the new statement.
1400   /// Subclasses may override this routine to provide different behavior.
1401   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1402     return getSema().BuildReturnStmt(ReturnLoc, Result);
1403   }
1404 
1405   /// Build a new declaration statement.
1406   ///
1407   /// By default, performs semantic analysis to build the new statement.
1408   /// Subclasses may override this routine to provide different behavior.
1409   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1410                              SourceLocation StartLoc, SourceLocation EndLoc) {
1411     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1412     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1413   }
1414 
1415   /// Build a new inline asm statement.
1416   ///
1417   /// By default, performs semantic analysis to build the new statement.
1418   /// Subclasses may override this routine to provide different behavior.
1419   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1420                                bool IsVolatile, unsigned NumOutputs,
1421                                unsigned NumInputs, IdentifierInfo **Names,
1422                                MultiExprArg Constraints, MultiExprArg Exprs,
1423                                Expr *AsmString, MultiExprArg Clobbers,
1424                                unsigned NumLabels,
1425                                SourceLocation RParenLoc) {
1426     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1427                                      NumInputs, Names, Constraints, Exprs,
1428                                      AsmString, Clobbers, NumLabels, RParenLoc);
1429   }
1430 
1431   /// Build a new MS style inline asm statement.
1432   ///
1433   /// By default, performs semantic analysis to build the new statement.
1434   /// Subclasses may override this routine to provide different behavior.
1435   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1436                               ArrayRef<Token> AsmToks,
1437                               StringRef AsmString,
1438                               unsigned NumOutputs, unsigned NumInputs,
1439                               ArrayRef<StringRef> Constraints,
1440                               ArrayRef<StringRef> Clobbers,
1441                               ArrayRef<Expr*> Exprs,
1442                               SourceLocation EndLoc) {
1443     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1444                                     NumOutputs, NumInputs,
1445                                     Constraints, Clobbers, Exprs, EndLoc);
1446   }
1447 
1448   /// Build a new co_return statement.
1449   ///
1450   /// By default, performs semantic analysis to build the new statement.
1451   /// Subclasses may override this routine to provide different behavior.
1452   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1453                                  bool IsImplicit) {
1454     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1455   }
1456 
1457   /// Build a new co_await expression.
1458   ///
1459   /// By default, performs semantic analysis to build the new expression.
1460   /// Subclasses may override this routine to provide different behavior.
1461   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1462                                 bool IsImplicit) {
1463     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1464   }
1465 
1466   /// Build a new co_await expression.
1467   ///
1468   /// By default, performs semantic analysis to build the new expression.
1469   /// Subclasses may override this routine to provide different behavior.
1470   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1471                                          Expr *Result,
1472                                          UnresolvedLookupExpr *Lookup) {
1473     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1474   }
1475 
1476   /// Build a new co_yield expression.
1477   ///
1478   /// By default, performs semantic analysis to build the new expression.
1479   /// Subclasses may override this routine to provide different behavior.
1480   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1481     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1482   }
1483 
1484   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1485     return getSema().BuildCoroutineBodyStmt(Args);
1486   }
1487 
1488   /// Build a new Objective-C \@try statement.
1489   ///
1490   /// By default, performs semantic analysis to build the new statement.
1491   /// Subclasses may override this routine to provide different behavior.
1492   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1493                                         Stmt *TryBody,
1494                                         MultiStmtArg CatchStmts,
1495                                         Stmt *Finally) {
1496     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1497                                         Finally);
1498   }
1499 
1500   /// Rebuild an Objective-C exception declaration.
1501   ///
1502   /// By default, performs semantic analysis to build the new declaration.
1503   /// Subclasses may override this routine to provide different behavior.
1504   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1505                                     TypeSourceInfo *TInfo, QualType T) {
1506     return getSema().BuildObjCExceptionDecl(TInfo, T,
1507                                             ExceptionDecl->getInnerLocStart(),
1508                                             ExceptionDecl->getLocation(),
1509                                             ExceptionDecl->getIdentifier());
1510   }
1511 
1512   /// Build a new Objective-C \@catch statement.
1513   ///
1514   /// By default, performs semantic analysis to build the new statement.
1515   /// Subclasses may override this routine to provide different behavior.
1516   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1517                                           SourceLocation RParenLoc,
1518                                           VarDecl *Var,
1519                                           Stmt *Body) {
1520     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1521                                           Var, Body);
1522   }
1523 
1524   /// Build a new Objective-C \@finally statement.
1525   ///
1526   /// By default, performs semantic analysis to build the new statement.
1527   /// Subclasses may override this routine to provide different behavior.
1528   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1529                                             Stmt *Body) {
1530     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1531   }
1532 
1533   /// Build a new Objective-C \@throw statement.
1534   ///
1535   /// By default, performs semantic analysis to build the new statement.
1536   /// Subclasses may override this routine to provide different behavior.
1537   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1538                                           Expr *Operand) {
1539     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1540   }
1541 
1542   /// Build a new OpenMP executable directive.
1543   ///
1544   /// By default, performs semantic analysis to build the new statement.
1545   /// Subclasses may override this routine to provide different behavior.
1546   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1547                                            DeclarationNameInfo DirName,
1548                                            OpenMPDirectiveKind CancelRegion,
1549                                            ArrayRef<OMPClause *> Clauses,
1550                                            Stmt *AStmt, SourceLocation StartLoc,
1551                                            SourceLocation EndLoc) {
1552     return getSema().ActOnOpenMPExecutableDirective(
1553         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1554   }
1555 
1556   /// Build a new OpenMP 'if' clause.
1557   ///
1558   /// By default, performs semantic analysis to build the new OpenMP clause.
1559   /// Subclasses may override this routine to provide different behavior.
1560   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1561                                 Expr *Condition, SourceLocation StartLoc,
1562                                 SourceLocation LParenLoc,
1563                                 SourceLocation NameModifierLoc,
1564                                 SourceLocation ColonLoc,
1565                                 SourceLocation EndLoc) {
1566     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1567                                          LParenLoc, NameModifierLoc, ColonLoc,
1568                                          EndLoc);
1569   }
1570 
1571   /// Build a new OpenMP 'final' 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 *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1576                                    SourceLocation LParenLoc,
1577                                    SourceLocation EndLoc) {
1578     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1579                                             EndLoc);
1580   }
1581 
1582   /// Build a new OpenMP 'num_threads' clause.
1583   ///
1584   /// By default, performs semantic analysis to build the new OpenMP clause.
1585   /// Subclasses may override this routine to provide different behavior.
1586   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1587                                         SourceLocation StartLoc,
1588                                         SourceLocation LParenLoc,
1589                                         SourceLocation EndLoc) {
1590     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1591                                                  LParenLoc, EndLoc);
1592   }
1593 
1594   /// Build a new OpenMP 'safelen' clause.
1595   ///
1596   /// By default, performs semantic analysis to build the new OpenMP clause.
1597   /// Subclasses may override this routine to provide different behavior.
1598   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1599                                      SourceLocation LParenLoc,
1600                                      SourceLocation EndLoc) {
1601     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1602   }
1603 
1604   /// Build a new OpenMP 'simdlen' clause.
1605   ///
1606   /// By default, performs semantic analysis to build the new OpenMP clause.
1607   /// Subclasses may override this routine to provide different behavior.
1608   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1609                                      SourceLocation LParenLoc,
1610                                      SourceLocation EndLoc) {
1611     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1612   }
1613 
1614   /// Build a new OpenMP 'allocator' clause.
1615   ///
1616   /// By default, performs semantic analysis to build the new OpenMP clause.
1617   /// Subclasses may override this routine to provide different behavior.
1618   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1619                                        SourceLocation LParenLoc,
1620                                        SourceLocation EndLoc) {
1621     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1622   }
1623 
1624   /// Build a new OpenMP 'collapse' clause.
1625   ///
1626   /// By default, performs semantic analysis to build the new OpenMP clause.
1627   /// Subclasses may override this routine to provide different behavior.
1628   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1629                                       SourceLocation LParenLoc,
1630                                       SourceLocation EndLoc) {
1631     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1632                                                EndLoc);
1633   }
1634 
1635   /// Build a new OpenMP 'default' clause.
1636   ///
1637   /// By default, performs semantic analysis to build the new OpenMP clause.
1638   /// Subclasses may override this routine to provide different behavior.
1639   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1640                                      SourceLocation StartLoc,
1641                                      SourceLocation LParenLoc,
1642                                      SourceLocation EndLoc) {
1643     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1644                                               StartLoc, LParenLoc, EndLoc);
1645   }
1646 
1647   /// Build a new OpenMP 'proc_bind' clause.
1648   ///
1649   /// By default, performs semantic analysis to build the new OpenMP clause.
1650   /// Subclasses may override this routine to provide different behavior.
1651   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1652                                       SourceLocation KindKwLoc,
1653                                       SourceLocation StartLoc,
1654                                       SourceLocation LParenLoc,
1655                                       SourceLocation EndLoc) {
1656     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1657                                                StartLoc, LParenLoc, EndLoc);
1658   }
1659 
1660   /// Build a new OpenMP 'schedule' 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 *RebuildOMPScheduleClause(
1665       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1666       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1667       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1668       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1669     return getSema().ActOnOpenMPScheduleClause(
1670         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1671         CommaLoc, EndLoc);
1672   }
1673 
1674   /// Build a new OpenMP 'ordered' clause.
1675   ///
1676   /// By default, performs semantic analysis to build the new OpenMP clause.
1677   /// Subclasses may override this routine to provide different behavior.
1678   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1679                                      SourceLocation EndLoc,
1680                                      SourceLocation LParenLoc, Expr *Num) {
1681     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1682   }
1683 
1684   /// Build a new OpenMP 'private' clause.
1685   ///
1686   /// By default, performs semantic analysis to build the new OpenMP clause.
1687   /// Subclasses may override this routine to provide different behavior.
1688   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1689                                      SourceLocation StartLoc,
1690                                      SourceLocation LParenLoc,
1691                                      SourceLocation EndLoc) {
1692     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1693                                               EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'firstprivate' 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 *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1701                                           SourceLocation StartLoc,
1702                                           SourceLocation LParenLoc,
1703                                           SourceLocation EndLoc) {
1704     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1705                                                    EndLoc);
1706   }
1707 
1708   /// Build a new OpenMP 'lastprivate' clause.
1709   ///
1710   /// By default, performs semantic analysis to build the new OpenMP clause.
1711   /// Subclasses may override this routine to provide different behavior.
1712   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1713                                          OpenMPLastprivateModifier LPKind,
1714                                          SourceLocation LPKindLoc,
1715                                          SourceLocation ColonLoc,
1716                                          SourceLocation StartLoc,
1717                                          SourceLocation LParenLoc,
1718                                          SourceLocation EndLoc) {
1719     return getSema().ActOnOpenMPLastprivateClause(
1720         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1721   }
1722 
1723   /// Build a new OpenMP 'shared' clause.
1724   ///
1725   /// By default, performs semantic analysis to build the new OpenMP clause.
1726   /// Subclasses may override this routine to provide different behavior.
1727   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1728                                     SourceLocation StartLoc,
1729                                     SourceLocation LParenLoc,
1730                                     SourceLocation EndLoc) {
1731     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1732                                              EndLoc);
1733   }
1734 
1735   /// Build a new OpenMP 'reduction' clause.
1736   ///
1737   /// By default, performs semantic analysis to build the new statement.
1738   /// Subclasses may override this routine to provide different behavior.
1739   OMPClause *RebuildOMPReductionClause(
1740       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1741       SourceLocation StartLoc, SourceLocation LParenLoc,
1742       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1743       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1744       const DeclarationNameInfo &ReductionId,
1745       ArrayRef<Expr *> UnresolvedReductions) {
1746     return getSema().ActOnOpenMPReductionClause(
1747         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1748         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1749   }
1750 
1751   /// Build a new OpenMP 'task_reduction' clause.
1752   ///
1753   /// By default, performs semantic analysis to build the new statement.
1754   /// Subclasses may override this routine to provide different behavior.
1755   OMPClause *RebuildOMPTaskReductionClause(
1756       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1757       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1758       CXXScopeSpec &ReductionIdScopeSpec,
1759       const DeclarationNameInfo &ReductionId,
1760       ArrayRef<Expr *> UnresolvedReductions) {
1761     return getSema().ActOnOpenMPTaskReductionClause(
1762         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1763         ReductionId, UnresolvedReductions);
1764   }
1765 
1766   /// Build a new OpenMP 'in_reduction' clause.
1767   ///
1768   /// By default, performs semantic analysis to build the new statement.
1769   /// Subclasses may override this routine to provide different behavior.
1770   OMPClause *
1771   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1772                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1773                               SourceLocation EndLoc,
1774                               CXXScopeSpec &ReductionIdScopeSpec,
1775                               const DeclarationNameInfo &ReductionId,
1776                               ArrayRef<Expr *> UnresolvedReductions) {
1777     return getSema().ActOnOpenMPInReductionClause(
1778         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1779         ReductionId, UnresolvedReductions);
1780   }
1781 
1782   /// Build a new OpenMP 'linear' clause.
1783   ///
1784   /// By default, performs semantic analysis to build the new OpenMP clause.
1785   /// Subclasses may override this routine to provide different behavior.
1786   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1787                                     SourceLocation StartLoc,
1788                                     SourceLocation LParenLoc,
1789                                     OpenMPLinearClauseKind Modifier,
1790                                     SourceLocation ModifierLoc,
1791                                     SourceLocation ColonLoc,
1792                                     SourceLocation EndLoc) {
1793     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1794                                              Modifier, ModifierLoc, ColonLoc,
1795                                              EndLoc);
1796   }
1797 
1798   /// Build a new OpenMP 'aligned' clause.
1799   ///
1800   /// By default, performs semantic analysis to build the new OpenMP clause.
1801   /// Subclasses may override this routine to provide different behavior.
1802   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1803                                      SourceLocation StartLoc,
1804                                      SourceLocation LParenLoc,
1805                                      SourceLocation ColonLoc,
1806                                      SourceLocation EndLoc) {
1807     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1808                                               LParenLoc, ColonLoc, EndLoc);
1809   }
1810 
1811   /// Build a new OpenMP 'copyin' clause.
1812   ///
1813   /// By default, performs semantic analysis to build the new OpenMP clause.
1814   /// Subclasses may override this routine to provide different behavior.
1815   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1816                                     SourceLocation StartLoc,
1817                                     SourceLocation LParenLoc,
1818                                     SourceLocation EndLoc) {
1819     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1820                                              EndLoc);
1821   }
1822 
1823   /// Build a new OpenMP 'copyprivate' clause.
1824   ///
1825   /// By default, performs semantic analysis to build the new OpenMP clause.
1826   /// Subclasses may override this routine to provide different behavior.
1827   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1828                                          SourceLocation StartLoc,
1829                                          SourceLocation LParenLoc,
1830                                          SourceLocation EndLoc) {
1831     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1832                                                   EndLoc);
1833   }
1834 
1835   /// Build a new OpenMP 'flush' pseudo clause.
1836   ///
1837   /// By default, performs semantic analysis to build the new OpenMP clause.
1838   /// Subclasses may override this routine to provide different behavior.
1839   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1840                                    SourceLocation StartLoc,
1841                                    SourceLocation LParenLoc,
1842                                    SourceLocation EndLoc) {
1843     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1844                                             EndLoc);
1845   }
1846 
1847   /// Build a new OpenMP 'depobj' pseudo 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 *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1852                                     SourceLocation LParenLoc,
1853                                     SourceLocation EndLoc) {
1854     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1855                                              EndLoc);
1856   }
1857 
1858   /// Build a new OpenMP 'depend' pseudo clause.
1859   ///
1860   /// By default, performs semantic analysis to build the new OpenMP clause.
1861   /// Subclasses may override this routine to provide different behavior.
1862   OMPClause *
1863   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1864                          SourceLocation DepLoc, SourceLocation ColonLoc,
1865                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1866                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1867     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1868                                              ColonLoc, VarList, StartLoc,
1869                                              LParenLoc, EndLoc);
1870   }
1871 
1872   /// Build a new OpenMP 'device' clause.
1873   ///
1874   /// By default, performs semantic analysis to build the new statement.
1875   /// Subclasses may override this routine to provide different behavior.
1876   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1877                                     Expr *Device, SourceLocation StartLoc,
1878                                     SourceLocation LParenLoc,
1879                                     SourceLocation ModifierLoc,
1880                                     SourceLocation EndLoc) {
1881     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1882                                              LParenLoc, ModifierLoc, EndLoc);
1883   }
1884 
1885   /// Build a new OpenMP 'map' clause.
1886   ///
1887   /// By default, performs semantic analysis to build the new OpenMP clause.
1888   /// Subclasses may override this routine to provide different behavior.
1889   OMPClause *RebuildOMPMapClause(
1890       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1891       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1892       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1893       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1894       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1895       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1896     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1897                                           MapperIdScopeSpec, MapperId, MapType,
1898                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1899                                           VarList, Locs, UnresolvedMappers);
1900   }
1901 
1902   /// Build a new OpenMP 'allocate' clause.
1903   ///
1904   /// By default, performs semantic analysis to build the new OpenMP clause.
1905   /// Subclasses may override this routine to provide different behavior.
1906   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1907                                       SourceLocation StartLoc,
1908                                       SourceLocation LParenLoc,
1909                                       SourceLocation ColonLoc,
1910                                       SourceLocation EndLoc) {
1911     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1912                                                LParenLoc, ColonLoc, EndLoc);
1913   }
1914 
1915   /// Build a new OpenMP 'num_teams' clause.
1916   ///
1917   /// By default, performs semantic analysis to build the new statement.
1918   /// Subclasses may override this routine to provide different behavior.
1919   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1920                                       SourceLocation LParenLoc,
1921                                       SourceLocation EndLoc) {
1922     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1923                                                EndLoc);
1924   }
1925 
1926   /// Build a new OpenMP 'thread_limit' clause.
1927   ///
1928   /// By default, performs semantic analysis to build the new statement.
1929   /// Subclasses may override this routine to provide different behavior.
1930   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1931                                          SourceLocation StartLoc,
1932                                          SourceLocation LParenLoc,
1933                                          SourceLocation EndLoc) {
1934     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1935                                                   LParenLoc, EndLoc);
1936   }
1937 
1938   /// Build a new OpenMP 'priority' clause.
1939   ///
1940   /// By default, performs semantic analysis to build the new statement.
1941   /// Subclasses may override this routine to provide different behavior.
1942   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1943                                       SourceLocation LParenLoc,
1944                                       SourceLocation EndLoc) {
1945     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1946                                                EndLoc);
1947   }
1948 
1949   /// Build a new OpenMP 'grainsize' clause.
1950   ///
1951   /// By default, performs semantic analysis to build the new statement.
1952   /// Subclasses may override this routine to provide different behavior.
1953   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1954                                        SourceLocation LParenLoc,
1955                                        SourceLocation EndLoc) {
1956     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1957                                                 EndLoc);
1958   }
1959 
1960   /// Build a new OpenMP 'num_tasks' clause.
1961   ///
1962   /// By default, performs semantic analysis to build the new statement.
1963   /// Subclasses may override this routine to provide different behavior.
1964   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1965                                       SourceLocation LParenLoc,
1966                                       SourceLocation EndLoc) {
1967     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1968                                                EndLoc);
1969   }
1970 
1971   /// Build a new OpenMP 'hint' clause.
1972   ///
1973   /// By default, performs semantic analysis to build the new statement.
1974   /// Subclasses may override this routine to provide different behavior.
1975   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1976                                   SourceLocation LParenLoc,
1977                                   SourceLocation EndLoc) {
1978     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1979   }
1980 
1981   /// Build a new OpenMP 'detach' clause.
1982   ///
1983   /// By default, performs semantic analysis to build the new statement.
1984   /// Subclasses may override this routine to provide different behavior.
1985   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
1986                                     SourceLocation LParenLoc,
1987                                     SourceLocation EndLoc) {
1988     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
1989   }
1990 
1991   /// Build a new OpenMP 'dist_schedule' clause.
1992   ///
1993   /// By default, performs semantic analysis to build the new OpenMP clause.
1994   /// Subclasses may override this routine to provide different behavior.
1995   OMPClause *
1996   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1997                                Expr *ChunkSize, SourceLocation StartLoc,
1998                                SourceLocation LParenLoc, SourceLocation KindLoc,
1999                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2000     return getSema().ActOnOpenMPDistScheduleClause(
2001         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2002   }
2003 
2004   /// Build a new OpenMP 'to' clause.
2005   ///
2006   /// By default, performs semantic analysis to build the new statement.
2007   /// Subclasses may override this routine to provide different behavior.
2008   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
2009                                 CXXScopeSpec &MapperIdScopeSpec,
2010                                 DeclarationNameInfo &MapperId,
2011                                 const OMPVarListLocTy &Locs,
2012                                 ArrayRef<Expr *> UnresolvedMappers) {
2013     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
2014                                          Locs, UnresolvedMappers);
2015   }
2016 
2017   /// Build a new OpenMP 'from' 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 *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
2022                                   CXXScopeSpec &MapperIdScopeSpec,
2023                                   DeclarationNameInfo &MapperId,
2024                                   const OMPVarListLocTy &Locs,
2025                                   ArrayRef<Expr *> UnresolvedMappers) {
2026     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
2027                                            Locs, UnresolvedMappers);
2028   }
2029 
2030   /// Build a new OpenMP 'use_device_ptr' clause.
2031   ///
2032   /// By default, performs semantic analysis to build the new OpenMP clause.
2033   /// Subclasses may override this routine to provide different behavior.
2034   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2035                                           const OMPVarListLocTy &Locs) {
2036     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2037   }
2038 
2039   /// Build a new OpenMP 'use_device_addr' clause.
2040   ///
2041   /// By default, performs semantic analysis to build the new OpenMP clause.
2042   /// Subclasses may override this routine to provide different behavior.
2043   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2044                                            const OMPVarListLocTy &Locs) {
2045     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2046   }
2047 
2048   /// Build a new OpenMP 'is_device_ptr' clause.
2049   ///
2050   /// By default, performs semantic analysis to build the new OpenMP clause.
2051   /// Subclasses may override this routine to provide different behavior.
2052   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2053                                          const OMPVarListLocTy &Locs) {
2054     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2055   }
2056 
2057   /// Build a new OpenMP 'defaultmap' clause.
2058   ///
2059   /// By default, performs semantic analysis to build the new OpenMP clause.
2060   /// Subclasses may override this routine to provide different behavior.
2061   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2062                                         OpenMPDefaultmapClauseKind Kind,
2063                                         SourceLocation StartLoc,
2064                                         SourceLocation LParenLoc,
2065                                         SourceLocation MLoc,
2066                                         SourceLocation KindLoc,
2067                                         SourceLocation EndLoc) {
2068     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2069                                                  MLoc, KindLoc, EndLoc);
2070   }
2071 
2072   /// Build a new OpenMP 'nontemporal' 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 *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2077                                          SourceLocation StartLoc,
2078                                          SourceLocation LParenLoc,
2079                                          SourceLocation EndLoc) {
2080     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2081                                                   EndLoc);
2082   }
2083 
2084   /// Build a new OpenMP 'inclusive' clause.
2085   ///
2086   /// By default, performs semantic analysis to build the new OpenMP clause.
2087   /// Subclasses may override this routine to provide different behavior.
2088   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2089                                        SourceLocation StartLoc,
2090                                        SourceLocation LParenLoc,
2091                                        SourceLocation EndLoc) {
2092     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2093                                                 EndLoc);
2094   }
2095 
2096   /// Build a new OpenMP 'exclusive' clause.
2097   ///
2098   /// By default, performs semantic analysis to build the new OpenMP clause.
2099   /// Subclasses may override this routine to provide different behavior.
2100   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2101                                        SourceLocation StartLoc,
2102                                        SourceLocation LParenLoc,
2103                                        SourceLocation EndLoc) {
2104     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2105                                                 EndLoc);
2106   }
2107 
2108   /// Build a new OpenMP 'uses_allocators' clause.
2109   ///
2110   /// By default, performs semantic analysis to build the new OpenMP clause.
2111   /// Subclasses may override this routine to provide different behavior.
2112   OMPClause *RebuildOMPUsesAllocatorsClause(
2113       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2114       SourceLocation LParenLoc, SourceLocation EndLoc) {
2115     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2116                                                     Data);
2117   }
2118 
2119   /// Build a new OpenMP 'affinity' clause.
2120   ///
2121   /// By default, performs semantic analysis to build the new OpenMP clause.
2122   /// Subclasses may override this routine to provide different behavior.
2123   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2124                                       SourceLocation LParenLoc,
2125                                       SourceLocation ColonLoc,
2126                                       SourceLocation EndLoc, Expr *Modifier,
2127                                       ArrayRef<Expr *> Locators) {
2128     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2129                                                EndLoc, Modifier, Locators);
2130   }
2131 
2132   /// Build a new OpenMP 'order' clause.
2133   ///
2134   /// By default, performs semantic analysis to build the new OpenMP clause.
2135   /// Subclasses may override this routine to provide different behavior.
2136   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2137                                    SourceLocation KindKwLoc,
2138                                    SourceLocation StartLoc,
2139                                    SourceLocation LParenLoc,
2140                                    SourceLocation EndLoc) {
2141     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2142                                             LParenLoc, EndLoc);
2143   }
2144 
2145   /// Rebuild the operand to an Objective-C \@synchronized statement.
2146   ///
2147   /// By default, performs semantic analysis to build the new statement.
2148   /// Subclasses may override this routine to provide different behavior.
2149   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2150                                               Expr *object) {
2151     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2152   }
2153 
2154   /// Build a new Objective-C \@synchronized statement.
2155   ///
2156   /// By default, performs semantic analysis to build the new statement.
2157   /// Subclasses may override this routine to provide different behavior.
2158   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2159                                            Expr *Object, Stmt *Body) {
2160     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2161   }
2162 
2163   /// Build a new Objective-C \@autoreleasepool statement.
2164   ///
2165   /// By default, performs semantic analysis to build the new statement.
2166   /// Subclasses may override this routine to provide different behavior.
2167   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2168                                             Stmt *Body) {
2169     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2170   }
2171 
2172   /// Build a new Objective-C fast enumeration statement.
2173   ///
2174   /// By default, performs semantic analysis to build the new statement.
2175   /// Subclasses may override this routine to provide different behavior.
2176   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2177                                           Stmt *Element,
2178                                           Expr *Collection,
2179                                           SourceLocation RParenLoc,
2180                                           Stmt *Body) {
2181     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2182                                                 Element,
2183                                                 Collection,
2184                                                 RParenLoc);
2185     if (ForEachStmt.isInvalid())
2186       return StmtError();
2187 
2188     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2189   }
2190 
2191   /// Build a new C++ exception declaration.
2192   ///
2193   /// By default, performs semantic analysis to build the new decaration.
2194   /// Subclasses may override this routine to provide different behavior.
2195   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2196                                 TypeSourceInfo *Declarator,
2197                                 SourceLocation StartLoc,
2198                                 SourceLocation IdLoc,
2199                                 IdentifierInfo *Id) {
2200     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2201                                                        StartLoc, IdLoc, Id);
2202     if (Var)
2203       getSema().CurContext->addDecl(Var);
2204     return Var;
2205   }
2206 
2207   /// Build a new C++ catch statement.
2208   ///
2209   /// By default, performs semantic analysis to build the new statement.
2210   /// Subclasses may override this routine to provide different behavior.
2211   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2212                                  VarDecl *ExceptionDecl,
2213                                  Stmt *Handler) {
2214     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2215                                                       Handler));
2216   }
2217 
2218   /// Build a new C++ try statement.
2219   ///
2220   /// By default, performs semantic analysis to build the new statement.
2221   /// Subclasses may override this routine to provide different behavior.
2222   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2223                                ArrayRef<Stmt *> Handlers) {
2224     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2225   }
2226 
2227   /// Build a new C++0x range-based for statement.
2228   ///
2229   /// By default, performs semantic analysis to build the new statement.
2230   /// Subclasses may override this routine to provide different behavior.
2231   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2232                                     SourceLocation CoawaitLoc, Stmt *Init,
2233                                     SourceLocation ColonLoc, Stmt *Range,
2234                                     Stmt *Begin, Stmt *End, Expr *Cond,
2235                                     Expr *Inc, Stmt *LoopVar,
2236                                     SourceLocation RParenLoc) {
2237     // If we've just learned that the range is actually an Objective-C
2238     // collection, treat this as an Objective-C fast enumeration loop.
2239     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2240       if (RangeStmt->isSingleDecl()) {
2241         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2242           if (RangeVar->isInvalidDecl())
2243             return StmtError();
2244 
2245           Expr *RangeExpr = RangeVar->getInit();
2246           if (!RangeExpr->isTypeDependent() &&
2247               RangeExpr->getType()->isObjCObjectPointerType()) {
2248             // FIXME: Support init-statements in Objective-C++20 ranged for
2249             // statement.
2250             if (Init) {
2251               return SemaRef.Diag(Init->getBeginLoc(),
2252                                   diag::err_objc_for_range_init_stmt)
2253                          << Init->getSourceRange();
2254             }
2255             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2256                                                         RangeExpr, RParenLoc);
2257           }
2258         }
2259       }
2260     }
2261 
2262     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2263                                           Range, Begin, End, Cond, Inc, LoopVar,
2264                                           RParenLoc, Sema::BFRK_Rebuild);
2265   }
2266 
2267   /// Build a new C++0x range-based for statement.
2268   ///
2269   /// By default, performs semantic analysis to build the new statement.
2270   /// Subclasses may override this routine to provide different behavior.
2271   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2272                                           bool IsIfExists,
2273                                           NestedNameSpecifierLoc QualifierLoc,
2274                                           DeclarationNameInfo NameInfo,
2275                                           Stmt *Nested) {
2276     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2277                                                 QualifierLoc, NameInfo, Nested);
2278   }
2279 
2280   /// Attach body to a C++0x range-based for statement.
2281   ///
2282   /// By default, performs semantic analysis to finish the new statement.
2283   /// Subclasses may override this routine to provide different behavior.
2284   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2285     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2286   }
2287 
2288   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2289                                Stmt *TryBlock, Stmt *Handler) {
2290     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2291   }
2292 
2293   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2294                                   Stmt *Block) {
2295     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2296   }
2297 
2298   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2299     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2300   }
2301 
2302   /// Build a new predefined expression.
2303   ///
2304   /// By default, performs semantic analysis to build the new expression.
2305   /// Subclasses may override this routine to provide different behavior.
2306   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2307                                    PredefinedExpr::IdentKind IK) {
2308     return getSema().BuildPredefinedExpr(Loc, IK);
2309   }
2310 
2311   /// Build a new expression that references a declaration.
2312   ///
2313   /// By default, performs semantic analysis to build the new expression.
2314   /// Subclasses may override this routine to provide different behavior.
2315   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2316                                         LookupResult &R,
2317                                         bool RequiresADL) {
2318     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2319   }
2320 
2321 
2322   /// Build a new expression that references a declaration.
2323   ///
2324   /// By default, performs semantic analysis to build the new expression.
2325   /// Subclasses may override this routine to provide different behavior.
2326   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2327                                 ValueDecl *VD,
2328                                 const DeclarationNameInfo &NameInfo,
2329                                 NamedDecl *Found,
2330                                 TemplateArgumentListInfo *TemplateArgs) {
2331     CXXScopeSpec SS;
2332     SS.Adopt(QualifierLoc);
2333     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2334                                               TemplateArgs);
2335   }
2336 
2337   /// Build a new expression in parentheses.
2338   ///
2339   /// By default, performs semantic analysis to build the new expression.
2340   /// Subclasses may override this routine to provide different behavior.
2341   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2342                                     SourceLocation RParen) {
2343     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2344   }
2345 
2346   /// Build a new pseudo-destructor expression.
2347   ///
2348   /// By default, performs semantic analysis to build the new expression.
2349   /// Subclasses may override this routine to provide different behavior.
2350   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2351                                             SourceLocation OperatorLoc,
2352                                             bool isArrow,
2353                                             CXXScopeSpec &SS,
2354                                             TypeSourceInfo *ScopeType,
2355                                             SourceLocation CCLoc,
2356                                             SourceLocation TildeLoc,
2357                                         PseudoDestructorTypeStorage Destroyed);
2358 
2359   /// Build a new unary operator expression.
2360   ///
2361   /// By default, performs semantic analysis to build the new expression.
2362   /// Subclasses may override this routine to provide different behavior.
2363   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2364                                         UnaryOperatorKind Opc,
2365                                         Expr *SubExpr) {
2366     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2367   }
2368 
2369   /// Build a new builtin offsetof expression.
2370   ///
2371   /// By default, performs semantic analysis to build the new expression.
2372   /// Subclasses may override this routine to provide different behavior.
2373   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2374                                  TypeSourceInfo *Type,
2375                                  ArrayRef<Sema::OffsetOfComponent> Components,
2376                                  SourceLocation RParenLoc) {
2377     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2378                                           RParenLoc);
2379   }
2380 
2381   /// Build a new sizeof, alignof or vec_step expression with a
2382   /// type argument.
2383   ///
2384   /// By default, performs semantic analysis to build the new expression.
2385   /// Subclasses may override this routine to provide different behavior.
2386   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2387                                          SourceLocation OpLoc,
2388                                          UnaryExprOrTypeTrait ExprKind,
2389                                          SourceRange R) {
2390     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2391   }
2392 
2393   /// Build a new sizeof, alignof or vec step expression with an
2394   /// expression argument.
2395   ///
2396   /// By default, performs semantic analysis to build the new expression.
2397   /// Subclasses may override this routine to provide different behavior.
2398   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2399                                          UnaryExprOrTypeTrait ExprKind,
2400                                          SourceRange R) {
2401     ExprResult Result
2402       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2403     if (Result.isInvalid())
2404       return ExprError();
2405 
2406     return Result;
2407   }
2408 
2409   /// Build a new array subscript expression.
2410   ///
2411   /// By default, performs semantic analysis to build the new expression.
2412   /// Subclasses may override this routine to provide different behavior.
2413   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2414                                              SourceLocation LBracketLoc,
2415                                              Expr *RHS,
2416                                              SourceLocation RBracketLoc) {
2417     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2418                                              LBracketLoc, RHS,
2419                                              RBracketLoc);
2420   }
2421 
2422   /// Build a new matrix subscript expression.
2423   ///
2424   /// By default, performs semantic analysis to build the new expression.
2425   /// Subclasses may override this routine to provide different behavior.
2426   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2427                                         Expr *ColumnIdx,
2428                                         SourceLocation RBracketLoc) {
2429     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2430                                                       RBracketLoc);
2431   }
2432 
2433   /// Build a new array section expression.
2434   ///
2435   /// By default, performs semantic analysis to build the new expression.
2436   /// Subclasses may override this routine to provide different behavior.
2437   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2438                                         Expr *LowerBound,
2439                                         SourceLocation ColonLoc, Expr *Length,
2440                                         SourceLocation RBracketLoc) {
2441     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2442                                               ColonLoc, Length, RBracketLoc);
2443   }
2444 
2445   /// Build a new array shaping expression.
2446   ///
2447   /// By default, performs semantic analysis to build the new expression.
2448   /// Subclasses may override this routine to provide different behavior.
2449   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2450                                         SourceLocation RParenLoc,
2451                                         ArrayRef<Expr *> Dims,
2452                                         ArrayRef<SourceRange> BracketsRanges) {
2453     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2454                                               BracketsRanges);
2455   }
2456 
2457   /// Build a new iterator expression.
2458   ///
2459   /// By default, performs semantic analysis to build the new expression.
2460   /// Subclasses may override this routine to provide different behavior.
2461   ExprResult RebuildOMPIteratorExpr(
2462       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2463       ArrayRef<Sema::OMPIteratorData> Data) {
2464     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2465                                           LLoc, RLoc, Data);
2466   }
2467 
2468   /// Build a new call expression.
2469   ///
2470   /// By default, performs semantic analysis to build the new expression.
2471   /// Subclasses may override this routine to provide different behavior.
2472   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2473                                    MultiExprArg Args,
2474                                    SourceLocation RParenLoc,
2475                                    Expr *ExecConfig = nullptr) {
2476     return getSema().ActOnCallExpr(
2477         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2478   }
2479 
2480   /// Build a new member access 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 RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2485                                bool isArrow,
2486                                NestedNameSpecifierLoc QualifierLoc,
2487                                SourceLocation TemplateKWLoc,
2488                                const DeclarationNameInfo &MemberNameInfo,
2489                                ValueDecl *Member,
2490                                NamedDecl *FoundDecl,
2491                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2492                                NamedDecl *FirstQualifierInScope) {
2493     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2494                                                                       isArrow);
2495     if (!Member->getDeclName()) {
2496       // We have a reference to an unnamed field.  This is always the
2497       // base of an anonymous struct/union member access, i.e. the
2498       // field is always of record type.
2499       assert(Member->getType()->isRecordType() &&
2500              "unnamed member not of record type?");
2501 
2502       BaseResult =
2503         getSema().PerformObjectMemberConversion(BaseResult.get(),
2504                                                 QualifierLoc.getNestedNameSpecifier(),
2505                                                 FoundDecl, Member);
2506       if (BaseResult.isInvalid())
2507         return ExprError();
2508       Base = BaseResult.get();
2509 
2510       CXXScopeSpec EmptySS;
2511       return getSema().BuildFieldReferenceExpr(
2512           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2513           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2514     }
2515 
2516     CXXScopeSpec SS;
2517     SS.Adopt(QualifierLoc);
2518 
2519     Base = BaseResult.get();
2520     QualType BaseType = Base->getType();
2521 
2522     if (isArrow && !BaseType->isPointerType())
2523       return ExprError();
2524 
2525     // FIXME: this involves duplicating earlier analysis in a lot of
2526     // cases; we should avoid this when possible.
2527     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2528     R.addDecl(FoundDecl);
2529     R.resolveKind();
2530 
2531     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2532                                               SS, TemplateKWLoc,
2533                                               FirstQualifierInScope,
2534                                               R, ExplicitTemplateArgs,
2535                                               /*S*/nullptr);
2536   }
2537 
2538   /// Build a new binary operator expression.
2539   ///
2540   /// By default, performs semantic analysis to build the new expression.
2541   /// Subclasses may override this routine to provide different behavior.
2542   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2543                                          BinaryOperatorKind Opc,
2544                                          Expr *LHS, Expr *RHS) {
2545     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2546   }
2547 
2548   /// Build a new rewritten operator expression.
2549   ///
2550   /// By default, performs semantic analysis to build the new expression.
2551   /// Subclasses may override this routine to provide different behavior.
2552   ExprResult RebuildCXXRewrittenBinaryOperator(
2553       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2554       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2555     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2556                                            RHS, /*RequiresADL*/false);
2557   }
2558 
2559   /// Build a new conditional operator expression.
2560   ///
2561   /// By default, performs semantic analysis to build the new expression.
2562   /// Subclasses may override this routine to provide different behavior.
2563   ExprResult RebuildConditionalOperator(Expr *Cond,
2564                                         SourceLocation QuestionLoc,
2565                                         Expr *LHS,
2566                                         SourceLocation ColonLoc,
2567                                         Expr *RHS) {
2568     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2569                                         LHS, RHS);
2570   }
2571 
2572   /// Build a new C-style cast expression.
2573   ///
2574   /// By default, performs semantic analysis to build the new expression.
2575   /// Subclasses may override this routine to provide different behavior.
2576   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2577                                          TypeSourceInfo *TInfo,
2578                                          SourceLocation RParenLoc,
2579                                          Expr *SubExpr) {
2580     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2581                                          SubExpr);
2582   }
2583 
2584   /// Build a new compound literal expression.
2585   ///
2586   /// By default, performs semantic analysis to build the new expression.
2587   /// Subclasses may override this routine to provide different behavior.
2588   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2589                                               TypeSourceInfo *TInfo,
2590                                               SourceLocation RParenLoc,
2591                                               Expr *Init) {
2592     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2593                                               Init);
2594   }
2595 
2596   /// Build a new extended vector element access expression.
2597   ///
2598   /// By default, performs semantic analysis to build the new expression.
2599   /// Subclasses may override this routine to provide different behavior.
2600   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2601                                                SourceLocation OpLoc,
2602                                                SourceLocation AccessorLoc,
2603                                                IdentifierInfo &Accessor) {
2604 
2605     CXXScopeSpec SS;
2606     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2607     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2608                                               OpLoc, /*IsArrow*/ false,
2609                                               SS, SourceLocation(),
2610                                               /*FirstQualifierInScope*/ nullptr,
2611                                               NameInfo,
2612                                               /* TemplateArgs */ nullptr,
2613                                               /*S*/ nullptr);
2614   }
2615 
2616   /// Build a new initializer list expression.
2617   ///
2618   /// By default, performs semantic analysis to build the new expression.
2619   /// Subclasses may override this routine to provide different behavior.
2620   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2621                              MultiExprArg Inits,
2622                              SourceLocation RBraceLoc) {
2623     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2624   }
2625 
2626   /// Build a new designated initializer expression.
2627   ///
2628   /// By default, performs semantic analysis to build the new expression.
2629   /// Subclasses may override this routine to provide different behavior.
2630   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2631                                              MultiExprArg ArrayExprs,
2632                                              SourceLocation EqualOrColonLoc,
2633                                              bool GNUSyntax,
2634                                              Expr *Init) {
2635     ExprResult Result
2636       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2637                                            Init);
2638     if (Result.isInvalid())
2639       return ExprError();
2640 
2641     return Result;
2642   }
2643 
2644   /// Build a new value-initialized expression.
2645   ///
2646   /// By default, builds the implicit value initialization without performing
2647   /// any semantic analysis. Subclasses may override this routine to provide
2648   /// different behavior.
2649   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2650     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2651   }
2652 
2653   /// Build a new \c va_arg expression.
2654   ///
2655   /// By default, performs semantic analysis to build the new expression.
2656   /// Subclasses may override this routine to provide different behavior.
2657   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2658                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2659                                     SourceLocation RParenLoc) {
2660     return getSema().BuildVAArgExpr(BuiltinLoc,
2661                                     SubExpr, TInfo,
2662                                     RParenLoc);
2663   }
2664 
2665   /// Build a new expression list in parentheses.
2666   ///
2667   /// By default, performs semantic analysis to build the new expression.
2668   /// Subclasses may override this routine to provide different behavior.
2669   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2670                                   MultiExprArg SubExprs,
2671                                   SourceLocation RParenLoc) {
2672     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2673   }
2674 
2675   /// Build a new address-of-label expression.
2676   ///
2677   /// By default, performs semantic analysis, using the name of the label
2678   /// rather than attempting to map the label statement itself.
2679   /// Subclasses may override this routine to provide different behavior.
2680   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2681                                   SourceLocation LabelLoc, LabelDecl *Label) {
2682     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2683   }
2684 
2685   /// Build a new GNU statement 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 RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2690                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2691     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2692                                    TemplateDepth);
2693   }
2694 
2695   /// Build a new __builtin_choose_expr expression.
2696   ///
2697   /// By default, performs semantic analysis to build the new expression.
2698   /// Subclasses may override this routine to provide different behavior.
2699   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2700                                      Expr *Cond, Expr *LHS, Expr *RHS,
2701                                      SourceLocation RParenLoc) {
2702     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2703                                    Cond, LHS, RHS,
2704                                    RParenLoc);
2705   }
2706 
2707   /// Build a new generic selection expression.
2708   ///
2709   /// By default, performs semantic analysis to build the new expression.
2710   /// Subclasses may override this routine to provide different behavior.
2711   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2712                                          SourceLocation DefaultLoc,
2713                                          SourceLocation RParenLoc,
2714                                          Expr *ControllingExpr,
2715                                          ArrayRef<TypeSourceInfo *> Types,
2716                                          ArrayRef<Expr *> Exprs) {
2717     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2718                                                 ControllingExpr, Types, Exprs);
2719   }
2720 
2721   /// Build a new overloaded operator call expression.
2722   ///
2723   /// By default, performs semantic analysis to build the new expression.
2724   /// The semantic analysis provides the behavior of template instantiation,
2725   /// copying with transformations that turn what looks like an overloaded
2726   /// operator call into a use of a builtin operator, performing
2727   /// argument-dependent lookup, etc. Subclasses may override this routine to
2728   /// provide different behavior.
2729   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2730                                               SourceLocation OpLoc,
2731                                               Expr *Callee,
2732                                               Expr *First,
2733                                               Expr *Second);
2734 
2735   /// Build a new C++ "named" cast expression, such as static_cast or
2736   /// reinterpret_cast.
2737   ///
2738   /// By default, this routine dispatches to one of the more-specific routines
2739   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2740   /// Subclasses may override this routine to provide different behavior.
2741   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2742                                            Stmt::StmtClass Class,
2743                                            SourceLocation LAngleLoc,
2744                                            TypeSourceInfo *TInfo,
2745                                            SourceLocation RAngleLoc,
2746                                            SourceLocation LParenLoc,
2747                                            Expr *SubExpr,
2748                                            SourceLocation RParenLoc) {
2749     switch (Class) {
2750     case Stmt::CXXStaticCastExprClass:
2751       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2752                                                    RAngleLoc, LParenLoc,
2753                                                    SubExpr, RParenLoc);
2754 
2755     case Stmt::CXXDynamicCastExprClass:
2756       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2757                                                     RAngleLoc, LParenLoc,
2758                                                     SubExpr, RParenLoc);
2759 
2760     case Stmt::CXXReinterpretCastExprClass:
2761       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2762                                                         RAngleLoc, LParenLoc,
2763                                                         SubExpr,
2764                                                         RParenLoc);
2765 
2766     case Stmt::CXXConstCastExprClass:
2767       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2768                                                    RAngleLoc, LParenLoc,
2769                                                    SubExpr, RParenLoc);
2770 
2771     case Stmt::CXXAddrspaceCastExprClass:
2772       return getDerived().RebuildCXXAddrspaceCastExpr(
2773           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2774 
2775     default:
2776       llvm_unreachable("Invalid C++ named cast");
2777     }
2778   }
2779 
2780   /// Build a new C++ static_cast expression.
2781   ///
2782   /// By default, performs semantic analysis to build the new expression.
2783   /// Subclasses may override this routine to provide different behavior.
2784   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2785                                             SourceLocation LAngleLoc,
2786                                             TypeSourceInfo *TInfo,
2787                                             SourceLocation RAngleLoc,
2788                                             SourceLocation LParenLoc,
2789                                             Expr *SubExpr,
2790                                             SourceLocation RParenLoc) {
2791     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2792                                        TInfo, SubExpr,
2793                                        SourceRange(LAngleLoc, RAngleLoc),
2794                                        SourceRange(LParenLoc, RParenLoc));
2795   }
2796 
2797   /// Build a new C++ dynamic_cast expression.
2798   ///
2799   /// By default, performs semantic analysis to build the new expression.
2800   /// Subclasses may override this routine to provide different behavior.
2801   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2802                                              SourceLocation LAngleLoc,
2803                                              TypeSourceInfo *TInfo,
2804                                              SourceLocation RAngleLoc,
2805                                              SourceLocation LParenLoc,
2806                                              Expr *SubExpr,
2807                                              SourceLocation RParenLoc) {
2808     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2809                                        TInfo, SubExpr,
2810                                        SourceRange(LAngleLoc, RAngleLoc),
2811                                        SourceRange(LParenLoc, RParenLoc));
2812   }
2813 
2814   /// Build a new C++ reinterpret_cast expression.
2815   ///
2816   /// By default, performs semantic analysis to build the new expression.
2817   /// Subclasses may override this routine to provide different behavior.
2818   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2819                                                  SourceLocation LAngleLoc,
2820                                                  TypeSourceInfo *TInfo,
2821                                                  SourceLocation RAngleLoc,
2822                                                  SourceLocation LParenLoc,
2823                                                  Expr *SubExpr,
2824                                                  SourceLocation RParenLoc) {
2825     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2826                                        TInfo, SubExpr,
2827                                        SourceRange(LAngleLoc, RAngleLoc),
2828                                        SourceRange(LParenLoc, RParenLoc));
2829   }
2830 
2831   /// Build a new C++ const_cast expression.
2832   ///
2833   /// By default, performs semantic analysis to build the new expression.
2834   /// Subclasses may override this routine to provide different behavior.
2835   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2836                                            SourceLocation LAngleLoc,
2837                                            TypeSourceInfo *TInfo,
2838                                            SourceLocation RAngleLoc,
2839                                            SourceLocation LParenLoc,
2840                                            Expr *SubExpr,
2841                                            SourceLocation RParenLoc) {
2842     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2843                                        TInfo, SubExpr,
2844                                        SourceRange(LAngleLoc, RAngleLoc),
2845                                        SourceRange(LParenLoc, RParenLoc));
2846   }
2847 
2848   ExprResult
2849   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2850                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2851                               SourceLocation LParenLoc, Expr *SubExpr,
2852                               SourceLocation RParenLoc) {
2853     return getSema().BuildCXXNamedCast(
2854         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2855         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2856   }
2857 
2858   /// Build a new C++ functional-style cast expression.
2859   ///
2860   /// By default, performs semantic analysis to build the new expression.
2861   /// Subclasses may override this routine to provide different behavior.
2862   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2863                                           SourceLocation LParenLoc,
2864                                           Expr *Sub,
2865                                           SourceLocation RParenLoc,
2866                                           bool ListInitialization) {
2867     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2868                                                MultiExprArg(&Sub, 1), RParenLoc,
2869                                                ListInitialization);
2870   }
2871 
2872   /// Build a new C++ __builtin_bit_cast expression.
2873   ///
2874   /// By default, performs semantic analysis to build the new expression.
2875   /// Subclasses may override this routine to provide different behavior.
2876   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2877                                        TypeSourceInfo *TSI, Expr *Sub,
2878                                        SourceLocation RParenLoc) {
2879     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2880   }
2881 
2882   /// Build a new C++ typeid(type) expression.
2883   ///
2884   /// By default, performs semantic analysis to build the new expression.
2885   /// Subclasses may override this routine to provide different behavior.
2886   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2887                                         SourceLocation TypeidLoc,
2888                                         TypeSourceInfo *Operand,
2889                                         SourceLocation RParenLoc) {
2890     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2891                                     RParenLoc);
2892   }
2893 
2894 
2895   /// Build a new C++ typeid(expr) expression.
2896   ///
2897   /// By default, performs semantic analysis to build the new expression.
2898   /// Subclasses may override this routine to provide different behavior.
2899   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2900                                         SourceLocation TypeidLoc,
2901                                         Expr *Operand,
2902                                         SourceLocation RParenLoc) {
2903     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2904                                     RParenLoc);
2905   }
2906 
2907   /// Build a new C++ __uuidof(type) expression.
2908   ///
2909   /// By default, performs semantic analysis to build the new expression.
2910   /// Subclasses may override this routine to provide different behavior.
2911   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2912                                   TypeSourceInfo *Operand,
2913                                   SourceLocation RParenLoc) {
2914     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2915   }
2916 
2917   /// Build a new C++ __uuidof(expr) 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 RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2922                                   Expr *Operand, SourceLocation RParenLoc) {
2923     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2924   }
2925 
2926   /// Build a new C++ "this" expression.
2927   ///
2928   /// By default, builds a new "this" expression without performing any
2929   /// semantic analysis. Subclasses may override this routine to provide
2930   /// different behavior.
2931   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2932                                 QualType ThisType,
2933                                 bool isImplicit) {
2934     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2935   }
2936 
2937   /// Build a new C++ throw expression.
2938   ///
2939   /// By default, performs semantic analysis to build the new expression.
2940   /// Subclasses may override this routine to provide different behavior.
2941   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2942                                  bool IsThrownVariableInScope) {
2943     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2944   }
2945 
2946   /// Build a new C++ default-argument expression.
2947   ///
2948   /// By default, builds a new default-argument expression, which does not
2949   /// require any semantic analysis. Subclasses may override this routine to
2950   /// provide different behavior.
2951   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2952     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2953                                      getSema().CurContext);
2954   }
2955 
2956   /// Build a new C++11 default-initialization expression.
2957   ///
2958   /// By default, builds a new default field initialization expression, which
2959   /// does not require any semantic analysis. Subclasses may override this
2960   /// routine to provide different behavior.
2961   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2962                                        FieldDecl *Field) {
2963     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2964                                       getSema().CurContext);
2965   }
2966 
2967   /// Build a new C++ zero-initialization expression.
2968   ///
2969   /// By default, performs semantic analysis to build the new expression.
2970   /// Subclasses may override this routine to provide different behavior.
2971   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2972                                            SourceLocation LParenLoc,
2973                                            SourceLocation RParenLoc) {
2974     return getSema().BuildCXXTypeConstructExpr(
2975         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2976   }
2977 
2978   /// Build a new C++ "new" expression.
2979   ///
2980   /// By default, performs semantic analysis to build the new expression.
2981   /// Subclasses may override this routine to provide different behavior.
2982   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2983                                bool UseGlobal,
2984                                SourceLocation PlacementLParen,
2985                                MultiExprArg PlacementArgs,
2986                                SourceLocation PlacementRParen,
2987                                SourceRange TypeIdParens,
2988                                QualType AllocatedType,
2989                                TypeSourceInfo *AllocatedTypeInfo,
2990                                Optional<Expr *> ArraySize,
2991                                SourceRange DirectInitRange,
2992                                Expr *Initializer) {
2993     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2994                                  PlacementLParen,
2995                                  PlacementArgs,
2996                                  PlacementRParen,
2997                                  TypeIdParens,
2998                                  AllocatedType,
2999                                  AllocatedTypeInfo,
3000                                  ArraySize,
3001                                  DirectInitRange,
3002                                  Initializer);
3003   }
3004 
3005   /// Build a new C++ "delete" expression.
3006   ///
3007   /// By default, performs semantic analysis to build the new expression.
3008   /// Subclasses may override this routine to provide different behavior.
3009   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3010                                         bool IsGlobalDelete,
3011                                         bool IsArrayForm,
3012                                         Expr *Operand) {
3013     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3014                                     Operand);
3015   }
3016 
3017   /// Build a new type trait expression.
3018   ///
3019   /// By default, performs semantic analysis to build the new expression.
3020   /// Subclasses may override this routine to provide different behavior.
3021   ExprResult RebuildTypeTrait(TypeTrait Trait,
3022                               SourceLocation StartLoc,
3023                               ArrayRef<TypeSourceInfo *> Args,
3024                               SourceLocation RParenLoc) {
3025     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3026   }
3027 
3028   /// Build a new array type trait expression.
3029   ///
3030   /// By default, performs semantic analysis to build the new expression.
3031   /// Subclasses may override this routine to provide different behavior.
3032   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3033                                    SourceLocation StartLoc,
3034                                    TypeSourceInfo *TSInfo,
3035                                    Expr *DimExpr,
3036                                    SourceLocation RParenLoc) {
3037     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3038   }
3039 
3040   /// Build a new expression trait expression.
3041   ///
3042   /// By default, performs semantic analysis to build the new expression.
3043   /// Subclasses may override this routine to provide different behavior.
3044   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3045                                    SourceLocation StartLoc,
3046                                    Expr *Queried,
3047                                    SourceLocation RParenLoc) {
3048     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3049   }
3050 
3051   /// Build a new (previously unresolved) declaration reference
3052   /// expression.
3053   ///
3054   /// By default, performs semantic analysis to build the new expression.
3055   /// Subclasses may override this routine to provide different behavior.
3056   ExprResult RebuildDependentScopeDeclRefExpr(
3057                                           NestedNameSpecifierLoc QualifierLoc,
3058                                           SourceLocation TemplateKWLoc,
3059                                        const DeclarationNameInfo &NameInfo,
3060                               const TemplateArgumentListInfo *TemplateArgs,
3061                                           bool IsAddressOfOperand,
3062                                           TypeSourceInfo **RecoveryTSI) {
3063     CXXScopeSpec SS;
3064     SS.Adopt(QualifierLoc);
3065 
3066     if (TemplateArgs || TemplateKWLoc.isValid())
3067       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3068                                                     TemplateArgs);
3069 
3070     return getSema().BuildQualifiedDeclarationNameExpr(
3071         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3072   }
3073 
3074   /// Build a new template-id 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 RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3079                                    SourceLocation TemplateKWLoc,
3080                                    LookupResult &R,
3081                                    bool RequiresADL,
3082                               const TemplateArgumentListInfo *TemplateArgs) {
3083     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3084                                          TemplateArgs);
3085   }
3086 
3087   /// Build a new object-construction expression.
3088   ///
3089   /// By default, performs semantic analysis to build the new expression.
3090   /// Subclasses may override this routine to provide different behavior.
3091   ExprResult RebuildCXXConstructExpr(QualType T,
3092                                      SourceLocation Loc,
3093                                      CXXConstructorDecl *Constructor,
3094                                      bool IsElidable,
3095                                      MultiExprArg Args,
3096                                      bool HadMultipleCandidates,
3097                                      bool ListInitialization,
3098                                      bool StdInitListInitialization,
3099                                      bool RequiresZeroInit,
3100                              CXXConstructExpr::ConstructionKind ConstructKind,
3101                                      SourceRange ParenRange) {
3102     // Reconstruct the constructor we originally found, which might be
3103     // different if this is a call to an inherited constructor.
3104     CXXConstructorDecl *FoundCtor = Constructor;
3105     if (Constructor->isInheritingConstructor())
3106       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3107 
3108     SmallVector<Expr*, 8> ConvertedArgs;
3109     if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs))
3110       return ExprError();
3111 
3112     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3113                                            IsElidable,
3114                                            ConvertedArgs,
3115                                            HadMultipleCandidates,
3116                                            ListInitialization,
3117                                            StdInitListInitialization,
3118                                            RequiresZeroInit, ConstructKind,
3119                                            ParenRange);
3120   }
3121 
3122   /// Build a new implicit construction via inherited constructor
3123   /// expression.
3124   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3125                                              CXXConstructorDecl *Constructor,
3126                                              bool ConstructsVBase,
3127                                              bool InheritedFromVBase) {
3128     return new (getSema().Context) CXXInheritedCtorInitExpr(
3129         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3130   }
3131 
3132   /// Build a new object-construction expression.
3133   ///
3134   /// By default, performs semantic analysis to build the new expression.
3135   /// Subclasses may override this routine to provide different behavior.
3136   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3137                                            SourceLocation LParenOrBraceLoc,
3138                                            MultiExprArg Args,
3139                                            SourceLocation RParenOrBraceLoc,
3140                                            bool ListInitialization) {
3141     return getSema().BuildCXXTypeConstructExpr(
3142         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3143   }
3144 
3145   /// Build a new object-construction expression.
3146   ///
3147   /// By default, performs semantic analysis to build the new expression.
3148   /// Subclasses may override this routine to provide different behavior.
3149   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3150                                                SourceLocation LParenLoc,
3151                                                MultiExprArg Args,
3152                                                SourceLocation RParenLoc,
3153                                                bool ListInitialization) {
3154     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3155                                                RParenLoc, ListInitialization);
3156   }
3157 
3158   /// Build a new member reference expression.
3159   ///
3160   /// By default, performs semantic analysis to build the new expression.
3161   /// Subclasses may override this routine to provide different behavior.
3162   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3163                                                 QualType BaseType,
3164                                                 bool IsArrow,
3165                                                 SourceLocation OperatorLoc,
3166                                           NestedNameSpecifierLoc QualifierLoc,
3167                                                 SourceLocation TemplateKWLoc,
3168                                             NamedDecl *FirstQualifierInScope,
3169                                    const DeclarationNameInfo &MemberNameInfo,
3170                               const TemplateArgumentListInfo *TemplateArgs) {
3171     CXXScopeSpec SS;
3172     SS.Adopt(QualifierLoc);
3173 
3174     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3175                                             OperatorLoc, IsArrow,
3176                                             SS, TemplateKWLoc,
3177                                             FirstQualifierInScope,
3178                                             MemberNameInfo,
3179                                             TemplateArgs, /*S*/nullptr);
3180   }
3181 
3182   /// Build a new member reference expression.
3183   ///
3184   /// By default, performs semantic analysis to build the new expression.
3185   /// Subclasses may override this routine to provide different behavior.
3186   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3187                                          SourceLocation OperatorLoc,
3188                                          bool IsArrow,
3189                                          NestedNameSpecifierLoc QualifierLoc,
3190                                          SourceLocation TemplateKWLoc,
3191                                          NamedDecl *FirstQualifierInScope,
3192                                          LookupResult &R,
3193                                 const TemplateArgumentListInfo *TemplateArgs) {
3194     CXXScopeSpec SS;
3195     SS.Adopt(QualifierLoc);
3196 
3197     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3198                                             OperatorLoc, IsArrow,
3199                                             SS, TemplateKWLoc,
3200                                             FirstQualifierInScope,
3201                                             R, TemplateArgs, /*S*/nullptr);
3202   }
3203 
3204   /// Build a new noexcept expression.
3205   ///
3206   /// By default, performs semantic analysis to build the new expression.
3207   /// Subclasses may override this routine to provide different behavior.
3208   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3209     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3210   }
3211 
3212   /// Build a new expression to compute the length of a parameter pack.
3213   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3214                                    NamedDecl *Pack,
3215                                    SourceLocation PackLoc,
3216                                    SourceLocation RParenLoc,
3217                                    Optional<unsigned> Length,
3218                                    ArrayRef<TemplateArgument> PartialArgs) {
3219     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3220                                   RParenLoc, Length, PartialArgs);
3221   }
3222 
3223   /// Build a new expression representing a call to a source location
3224   ///  builtin.
3225   ///
3226   /// By default, performs semantic analysis to build the new expression.
3227   /// Subclasses may override this routine to provide different behavior.
3228   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3229                                   SourceLocation BuiltinLoc,
3230                                   SourceLocation RPLoc,
3231                                   DeclContext *ParentContext) {
3232     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3233   }
3234 
3235   /// Build a new Objective-C boxed expression.
3236   ///
3237   /// By default, performs semantic analysis to build the new expression.
3238   /// Subclasses may override this routine to provide different behavior.
3239   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3240       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3241       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3242       TemplateArgumentListInfo *TALI) {
3243     CXXScopeSpec SS;
3244     SS.Adopt(NNS);
3245     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3246                                                          ConceptNameInfo,
3247                                                          FoundDecl,
3248                                                          NamedConcept, TALI);
3249     if (Result.isInvalid())
3250       return ExprError();
3251     return Result;
3252   }
3253 
3254   /// \brief Build a new requires expression.
3255   ///
3256   /// By default, performs semantic analysis to build the new expression.
3257   /// Subclasses may override this routine to provide different behavior.
3258   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3259                                  RequiresExprBodyDecl *Body,
3260                                  ArrayRef<ParmVarDecl *> LocalParameters,
3261                                  ArrayRef<concepts::Requirement *> Requirements,
3262                                  SourceLocation ClosingBraceLoc) {
3263     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3264                                 LocalParameters, Requirements, ClosingBraceLoc);
3265   }
3266 
3267   concepts::TypeRequirement *
3268   RebuildTypeRequirement(
3269       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3270     return SemaRef.BuildTypeRequirement(SubstDiag);
3271   }
3272 
3273   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3274     return SemaRef.BuildTypeRequirement(T);
3275   }
3276 
3277   concepts::ExprRequirement *
3278   RebuildExprRequirement(
3279       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3280       SourceLocation NoexceptLoc,
3281       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3282     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3283                                         std::move(Ret));
3284   }
3285 
3286   concepts::ExprRequirement *
3287   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3288                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3289     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3290                                         std::move(Ret));
3291   }
3292 
3293   concepts::NestedRequirement *
3294   RebuildNestedRequirement(
3295       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3296     return SemaRef.BuildNestedRequirement(SubstDiag);
3297   }
3298 
3299   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3300     return SemaRef.BuildNestedRequirement(Constraint);
3301   }
3302 
3303   /// \brief Build a new Objective-C boxed expression.
3304   ///
3305   /// By default, performs semantic analysis to build the new expression.
3306   /// Subclasses may override this routine to provide different behavior.
3307   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3308     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3309   }
3310 
3311   /// Build a new Objective-C array literal.
3312   ///
3313   /// By default, performs semantic analysis to build the new expression.
3314   /// Subclasses may override this routine to provide different behavior.
3315   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3316                                      Expr **Elements, unsigned NumElements) {
3317     return getSema().BuildObjCArrayLiteral(Range,
3318                                            MultiExprArg(Elements, NumElements));
3319   }
3320 
3321   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3322                                          Expr *Base, Expr *Key,
3323                                          ObjCMethodDecl *getterMethod,
3324                                          ObjCMethodDecl *setterMethod) {
3325     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3326                                                    getterMethod, setterMethod);
3327   }
3328 
3329   /// Build a new Objective-C dictionary literal.
3330   ///
3331   /// By default, performs semantic analysis to build the new expression.
3332   /// Subclasses may override this routine to provide different behavior.
3333   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3334                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3335     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3336   }
3337 
3338   /// Build a new Objective-C \@encode expression.
3339   ///
3340   /// By default, performs semantic analysis to build the new expression.
3341   /// Subclasses may override this routine to provide different behavior.
3342   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3343                                          TypeSourceInfo *EncodeTypeInfo,
3344                                          SourceLocation RParenLoc) {
3345     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3346   }
3347 
3348   /// Build a new Objective-C class message.
3349   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3350                                           Selector Sel,
3351                                           ArrayRef<SourceLocation> SelectorLocs,
3352                                           ObjCMethodDecl *Method,
3353                                           SourceLocation LBracLoc,
3354                                           MultiExprArg Args,
3355                                           SourceLocation RBracLoc) {
3356     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3357                                      ReceiverTypeInfo->getType(),
3358                                      /*SuperLoc=*/SourceLocation(),
3359                                      Sel, Method, LBracLoc, SelectorLocs,
3360                                      RBracLoc, Args);
3361   }
3362 
3363   /// Build a new Objective-C instance message.
3364   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3365                                           Selector Sel,
3366                                           ArrayRef<SourceLocation> SelectorLocs,
3367                                           ObjCMethodDecl *Method,
3368                                           SourceLocation LBracLoc,
3369                                           MultiExprArg Args,
3370                                           SourceLocation RBracLoc) {
3371     return SemaRef.BuildInstanceMessage(Receiver,
3372                                         Receiver->getType(),
3373                                         /*SuperLoc=*/SourceLocation(),
3374                                         Sel, Method, LBracLoc, SelectorLocs,
3375                                         RBracLoc, Args);
3376   }
3377 
3378   /// Build a new Objective-C instance/class message to 'super'.
3379   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3380                                     Selector Sel,
3381                                     ArrayRef<SourceLocation> SelectorLocs,
3382                                     QualType SuperType,
3383                                     ObjCMethodDecl *Method,
3384                                     SourceLocation LBracLoc,
3385                                     MultiExprArg Args,
3386                                     SourceLocation RBracLoc) {
3387     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3388                                           SuperType,
3389                                           SuperLoc,
3390                                           Sel, Method, LBracLoc, SelectorLocs,
3391                                           RBracLoc, Args)
3392                                       : SemaRef.BuildClassMessage(nullptr,
3393                                           SuperType,
3394                                           SuperLoc,
3395                                           Sel, Method, LBracLoc, SelectorLocs,
3396                                           RBracLoc, Args);
3397 
3398 
3399   }
3400 
3401   /// Build a new Objective-C ivar reference expression.
3402   ///
3403   /// By default, performs semantic analysis to build the new expression.
3404   /// Subclasses may override this routine to provide different behavior.
3405   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3406                                           SourceLocation IvarLoc,
3407                                           bool IsArrow, bool IsFreeIvar) {
3408     CXXScopeSpec SS;
3409     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3410     ExprResult Result = getSema().BuildMemberReferenceExpr(
3411         BaseArg, BaseArg->getType(),
3412         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3413         /*FirstQualifierInScope=*/nullptr, NameInfo,
3414         /*TemplateArgs=*/nullptr,
3415         /*S=*/nullptr);
3416     if (IsFreeIvar && Result.isUsable())
3417       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3418     return Result;
3419   }
3420 
3421   /// Build a new Objective-C property reference expression.
3422   ///
3423   /// By default, performs semantic analysis to build the new expression.
3424   /// Subclasses may override this routine to provide different behavior.
3425   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3426                                         ObjCPropertyDecl *Property,
3427                                         SourceLocation PropertyLoc) {
3428     CXXScopeSpec SS;
3429     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3430     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3431                                               /*FIXME:*/PropertyLoc,
3432                                               /*IsArrow=*/false,
3433                                               SS, SourceLocation(),
3434                                               /*FirstQualifierInScope=*/nullptr,
3435                                               NameInfo,
3436                                               /*TemplateArgs=*/nullptr,
3437                                               /*S=*/nullptr);
3438   }
3439 
3440   /// Build a new Objective-C property reference expression.
3441   ///
3442   /// By default, performs semantic analysis to build the new expression.
3443   /// Subclasses may override this routine to provide different behavior.
3444   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3445                                         ObjCMethodDecl *Getter,
3446                                         ObjCMethodDecl *Setter,
3447                                         SourceLocation PropertyLoc) {
3448     // Since these expressions can only be value-dependent, we do not
3449     // need to perform semantic analysis again.
3450     return Owned(
3451       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3452                                                   VK_LValue, OK_ObjCProperty,
3453                                                   PropertyLoc, Base));
3454   }
3455 
3456   /// Build a new Objective-C "isa" expression.
3457   ///
3458   /// By default, performs semantic analysis to build the new expression.
3459   /// Subclasses may override this routine to provide different behavior.
3460   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3461                                 SourceLocation OpLoc, bool IsArrow) {
3462     CXXScopeSpec SS;
3463     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3464     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3465                                               OpLoc, IsArrow,
3466                                               SS, SourceLocation(),
3467                                               /*FirstQualifierInScope=*/nullptr,
3468                                               NameInfo,
3469                                               /*TemplateArgs=*/nullptr,
3470                                               /*S=*/nullptr);
3471   }
3472 
3473   /// Build a new shuffle vector expression.
3474   ///
3475   /// By default, performs semantic analysis to build the new expression.
3476   /// Subclasses may override this routine to provide different behavior.
3477   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3478                                       MultiExprArg SubExprs,
3479                                       SourceLocation RParenLoc) {
3480     // Find the declaration for __builtin_shufflevector
3481     const IdentifierInfo &Name
3482       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3483     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3484     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3485     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3486 
3487     // Build a reference to the __builtin_shufflevector builtin
3488     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3489     Expr *Callee = new (SemaRef.Context)
3490         DeclRefExpr(SemaRef.Context, Builtin, false,
3491                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3492     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3493     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3494                                        CK_BuiltinFnToFnPtr).get();
3495 
3496     // Build the CallExpr
3497     ExprResult TheCall = CallExpr::Create(
3498         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3499         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3500 
3501     // Type-check the __builtin_shufflevector expression.
3502     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3503   }
3504 
3505   /// Build a new convert vector expression.
3506   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3507                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3508                                       SourceLocation RParenLoc) {
3509     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3510                                          BuiltinLoc, RParenLoc);
3511   }
3512 
3513   /// Build a new template argument pack expansion.
3514   ///
3515   /// By default, performs semantic analysis to build a new pack expansion
3516   /// for a template argument. Subclasses may override this routine to provide
3517   /// different behavior.
3518   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3519                                            SourceLocation EllipsisLoc,
3520                                            Optional<unsigned> NumExpansions) {
3521     switch (Pattern.getArgument().getKind()) {
3522     case TemplateArgument::Expression: {
3523       ExprResult Result
3524         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3525                                        EllipsisLoc, NumExpansions);
3526       if (Result.isInvalid())
3527         return TemplateArgumentLoc();
3528 
3529       return TemplateArgumentLoc(Result.get(), Result.get());
3530     }
3531 
3532     case TemplateArgument::Template:
3533       return TemplateArgumentLoc(TemplateArgument(
3534                                           Pattern.getArgument().getAsTemplate(),
3535                                                   NumExpansions),
3536                                  Pattern.getTemplateQualifierLoc(),
3537                                  Pattern.getTemplateNameLoc(),
3538                                  EllipsisLoc);
3539 
3540     case TemplateArgument::Null:
3541     case TemplateArgument::Integral:
3542     case TemplateArgument::Declaration:
3543     case TemplateArgument::Pack:
3544     case TemplateArgument::TemplateExpansion:
3545     case TemplateArgument::NullPtr:
3546       llvm_unreachable("Pack expansion pattern has no parameter packs");
3547 
3548     case TemplateArgument::Type:
3549       if (TypeSourceInfo *Expansion
3550             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3551                                            EllipsisLoc,
3552                                            NumExpansions))
3553         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3554                                    Expansion);
3555       break;
3556     }
3557 
3558     return TemplateArgumentLoc();
3559   }
3560 
3561   /// Build a new expression pack expansion.
3562   ///
3563   /// By default, performs semantic analysis to build a new pack expansion
3564   /// for an expression. Subclasses may override this routine to provide
3565   /// different behavior.
3566   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3567                                   Optional<unsigned> NumExpansions) {
3568     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3569   }
3570 
3571   /// Build a new C++1z fold-expression.
3572   ///
3573   /// By default, performs semantic analysis in order to build a new fold
3574   /// expression.
3575   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3576                                 BinaryOperatorKind Operator,
3577                                 SourceLocation EllipsisLoc, Expr *RHS,
3578                                 SourceLocation RParenLoc,
3579                                 Optional<unsigned> NumExpansions) {
3580     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3581                                       RHS, RParenLoc, NumExpansions);
3582   }
3583 
3584   /// Build an empty C++1z fold-expression with the given operator.
3585   ///
3586   /// By default, produces the fallback value for the fold-expression, or
3587   /// produce an error if there is no fallback value.
3588   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3589                                      BinaryOperatorKind Operator) {
3590     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3591   }
3592 
3593   /// Build a new atomic operation expression.
3594   ///
3595   /// By default, performs semantic analysis to build the new expression.
3596   /// Subclasses may override this routine to provide different behavior.
3597   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3598                                AtomicExpr::AtomicOp Op,
3599                                SourceLocation RParenLoc) {
3600     // Use this for all of the locations, since we don't know the difference
3601     // between the call and the expr at this point.
3602     SourceRange Range{BuiltinLoc, RParenLoc};
3603     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3604                                      Sema::AtomicArgumentOrder::AST);
3605   }
3606 
3607   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3608                                  ArrayRef<Expr *> SubExprs) {
3609     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs);
3610   }
3611 
3612 private:
3613   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3614                                      QualType ObjectType,
3615                                      NamedDecl *FirstQualifierInScope,
3616                                      CXXScopeSpec &SS);
3617 
3618   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3619                                              QualType ObjectType,
3620                                              NamedDecl *FirstQualifierInScope,
3621                                              CXXScopeSpec &SS);
3622 
3623   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3624                                             NamedDecl *FirstQualifierInScope,
3625                                             CXXScopeSpec &SS);
3626 
3627   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3628                                       DependentNameTypeLoc TL,
3629                                       bool DeducibleTSTContext);
3630 };
3631 
3632 template <typename Derived>
3633 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3634   if (!S)
3635     return S;
3636 
3637   switch (S->getStmtClass()) {
3638   case Stmt::NoStmtClass: break;
3639 
3640   // Transform individual statement nodes
3641   // Pass SDK into statements that can produce a value
3642 #define STMT(Node, Parent)                                              \
3643   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3644 #define VALUESTMT(Node, Parent)                                         \
3645   case Stmt::Node##Class:                                               \
3646     return getDerived().Transform##Node(cast<Node>(S), SDK);
3647 #define ABSTRACT_STMT(Node)
3648 #define EXPR(Node, Parent)
3649 #include "clang/AST/StmtNodes.inc"
3650 
3651   // Transform expressions by calling TransformExpr.
3652 #define STMT(Node, Parent)
3653 #define ABSTRACT_STMT(Stmt)
3654 #define EXPR(Node, Parent) case Stmt::Node##Class:
3655 #include "clang/AST/StmtNodes.inc"
3656     {
3657       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3658 
3659       if (SDK == SDK_StmtExprResult)
3660         E = getSema().ActOnStmtExprResult(E);
3661       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3662     }
3663   }
3664 
3665   return S;
3666 }
3667 
3668 template<typename Derived>
3669 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3670   if (!S)
3671     return S;
3672 
3673   switch (S->getClauseKind()) {
3674   default: break;
3675   // Transform individual clause nodes
3676 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
3677   case Enum:                                                                   \
3678     return getDerived().Transform ## Class(cast<Class>(S));
3679 #include "llvm/Frontend/OpenMP/OMPKinds.def"
3680   }
3681 
3682   return S;
3683 }
3684 
3685 
3686 template<typename Derived>
3687 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3688   if (!E)
3689     return E;
3690 
3691   switch (E->getStmtClass()) {
3692     case Stmt::NoStmtClass: break;
3693 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3694 #define ABSTRACT_STMT(Stmt)
3695 #define EXPR(Node, Parent)                                              \
3696     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3697 #include "clang/AST/StmtNodes.inc"
3698   }
3699 
3700   return E;
3701 }
3702 
3703 template<typename Derived>
3704 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3705                                                         bool NotCopyInit) {
3706   // Initializers are instantiated like expressions, except that various outer
3707   // layers are stripped.
3708   if (!Init)
3709     return Init;
3710 
3711   if (auto *FE = dyn_cast<FullExpr>(Init))
3712     Init = FE->getSubExpr();
3713 
3714   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3715     Init = AIL->getCommonExpr();
3716 
3717   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3718     Init = MTE->getSubExpr();
3719 
3720   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3721     Init = Binder->getSubExpr();
3722 
3723   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3724     Init = ICE->getSubExprAsWritten();
3725 
3726   if (CXXStdInitializerListExpr *ILE =
3727           dyn_cast<CXXStdInitializerListExpr>(Init))
3728     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3729 
3730   // If this is copy-initialization, we only need to reconstruct
3731   // InitListExprs. Other forms of copy-initialization will be a no-op if
3732   // the initializer is already the right type.
3733   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3734   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3735     return getDerived().TransformExpr(Init);
3736 
3737   // Revert value-initialization back to empty parens.
3738   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3739     SourceRange Parens = VIE->getSourceRange();
3740     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3741                                              Parens.getEnd());
3742   }
3743 
3744   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3745   if (isa<ImplicitValueInitExpr>(Init))
3746     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3747                                              SourceLocation());
3748 
3749   // Revert initialization by constructor back to a parenthesized or braced list
3750   // of expressions. Any other form of initializer can just be reused directly.
3751   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3752     return getDerived().TransformExpr(Init);
3753 
3754   // If the initialization implicitly converted an initializer list to a
3755   // std::initializer_list object, unwrap the std::initializer_list too.
3756   if (Construct && Construct->isStdInitListInitialization())
3757     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3758 
3759   // Enter a list-init context if this was list initialization.
3760   EnterExpressionEvaluationContext Context(
3761       getSema(), EnterExpressionEvaluationContext::InitList,
3762       Construct->isListInitialization());
3763 
3764   SmallVector<Expr*, 8> NewArgs;
3765   bool ArgChanged = false;
3766   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3767                                   /*IsCall*/true, NewArgs, &ArgChanged))
3768     return ExprError();
3769 
3770   // If this was list initialization, revert to syntactic list form.
3771   if (Construct->isListInitialization())
3772     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3773                                         Construct->getEndLoc());
3774 
3775   // Build a ParenListExpr to represent anything else.
3776   SourceRange Parens = Construct->getParenOrBraceRange();
3777   if (Parens.isInvalid()) {
3778     // This was a variable declaration's initialization for which no initializer
3779     // was specified.
3780     assert(NewArgs.empty() &&
3781            "no parens or braces but have direct init with arguments?");
3782     return ExprEmpty();
3783   }
3784   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3785                                            Parens.getEnd());
3786 }
3787 
3788 template<typename Derived>
3789 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3790                                             unsigned NumInputs,
3791                                             bool IsCall,
3792                                       SmallVectorImpl<Expr *> &Outputs,
3793                                             bool *ArgChanged) {
3794   for (unsigned I = 0; I != NumInputs; ++I) {
3795     // If requested, drop call arguments that need to be dropped.
3796     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3797       if (ArgChanged)
3798         *ArgChanged = true;
3799 
3800       break;
3801     }
3802 
3803     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3804       Expr *Pattern = Expansion->getPattern();
3805 
3806       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3807       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3808       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3809 
3810       // Determine whether the set of unexpanded parameter packs can and should
3811       // be expanded.
3812       bool Expand = true;
3813       bool RetainExpansion = false;
3814       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3815       Optional<unsigned> NumExpansions = OrigNumExpansions;
3816       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3817                                                Pattern->getSourceRange(),
3818                                                Unexpanded,
3819                                                Expand, RetainExpansion,
3820                                                NumExpansions))
3821         return true;
3822 
3823       if (!Expand) {
3824         // The transform has determined that we should perform a simple
3825         // transformation on the pack expansion, producing another pack
3826         // expansion.
3827         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3828         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3829         if (OutPattern.isInvalid())
3830           return true;
3831 
3832         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3833                                                 Expansion->getEllipsisLoc(),
3834                                                            NumExpansions);
3835         if (Out.isInvalid())
3836           return true;
3837 
3838         if (ArgChanged)
3839           *ArgChanged = true;
3840         Outputs.push_back(Out.get());
3841         continue;
3842       }
3843 
3844       // Record right away that the argument was changed.  This needs
3845       // to happen even if the array expands to nothing.
3846       if (ArgChanged) *ArgChanged = true;
3847 
3848       // The transform has determined that we should perform an elementwise
3849       // expansion of the pattern. Do so.
3850       for (unsigned I = 0; I != *NumExpansions; ++I) {
3851         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3852         ExprResult Out = getDerived().TransformExpr(Pattern);
3853         if (Out.isInvalid())
3854           return true;
3855 
3856         if (Out.get()->containsUnexpandedParameterPack()) {
3857           Out = getDerived().RebuildPackExpansion(
3858               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3859           if (Out.isInvalid())
3860             return true;
3861         }
3862 
3863         Outputs.push_back(Out.get());
3864       }
3865 
3866       // If we're supposed to retain a pack expansion, do so by temporarily
3867       // forgetting the partially-substituted parameter pack.
3868       if (RetainExpansion) {
3869         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3870 
3871         ExprResult Out = getDerived().TransformExpr(Pattern);
3872         if (Out.isInvalid())
3873           return true;
3874 
3875         Out = getDerived().RebuildPackExpansion(
3876             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3877         if (Out.isInvalid())
3878           return true;
3879 
3880         Outputs.push_back(Out.get());
3881       }
3882 
3883       continue;
3884     }
3885 
3886     ExprResult Result =
3887       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3888              : getDerived().TransformExpr(Inputs[I]);
3889     if (Result.isInvalid())
3890       return true;
3891 
3892     if (Result.get() != Inputs[I] && ArgChanged)
3893       *ArgChanged = true;
3894 
3895     Outputs.push_back(Result.get());
3896   }
3897 
3898   return false;
3899 }
3900 
3901 template <typename Derived>
3902 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3903     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3904   if (Var) {
3905     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3906         getDerived().TransformDefinition(Var->getLocation(), Var));
3907 
3908     if (!ConditionVar)
3909       return Sema::ConditionError();
3910 
3911     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3912   }
3913 
3914   if (Expr) {
3915     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3916 
3917     if (CondExpr.isInvalid())
3918       return Sema::ConditionError();
3919 
3920     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3921   }
3922 
3923   return Sema::ConditionResult();
3924 }
3925 
3926 template<typename Derived>
3927 NestedNameSpecifierLoc
3928 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3929                                                     NestedNameSpecifierLoc NNS,
3930                                                      QualType ObjectType,
3931                                              NamedDecl *FirstQualifierInScope) {
3932   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3933   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3934        Qualifier = Qualifier.getPrefix())
3935     Qualifiers.push_back(Qualifier);
3936 
3937   CXXScopeSpec SS;
3938   while (!Qualifiers.empty()) {
3939     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3940     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3941 
3942     switch (QNNS->getKind()) {
3943     case NestedNameSpecifier::Identifier: {
3944       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3945                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3946       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3947                                               SS, FirstQualifierInScope, false))
3948         return NestedNameSpecifierLoc();
3949     }
3950       break;
3951 
3952     case NestedNameSpecifier::Namespace: {
3953       NamespaceDecl *NS
3954         = cast_or_null<NamespaceDecl>(
3955                                     getDerived().TransformDecl(
3956                                                           Q.getLocalBeginLoc(),
3957                                                        QNNS->getAsNamespace()));
3958       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3959       break;
3960     }
3961 
3962     case NestedNameSpecifier::NamespaceAlias: {
3963       NamespaceAliasDecl *Alias
3964         = cast_or_null<NamespaceAliasDecl>(
3965                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3966                                                  QNNS->getAsNamespaceAlias()));
3967       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3968                 Q.getLocalEndLoc());
3969       break;
3970     }
3971 
3972     case NestedNameSpecifier::Global:
3973       // There is no meaningful transformation that one could perform on the
3974       // global scope.
3975       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3976       break;
3977 
3978     case NestedNameSpecifier::Super: {
3979       CXXRecordDecl *RD =
3980           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3981               SourceLocation(), QNNS->getAsRecordDecl()));
3982       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3983       break;
3984     }
3985 
3986     case NestedNameSpecifier::TypeSpecWithTemplate:
3987     case NestedNameSpecifier::TypeSpec: {
3988       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3989                                               FirstQualifierInScope, SS);
3990 
3991       if (!TL)
3992         return NestedNameSpecifierLoc();
3993 
3994       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3995           (SemaRef.getLangOpts().CPlusPlus11 &&
3996            TL.getType()->isEnumeralType())) {
3997         assert(!TL.getType().hasLocalQualifiers() &&
3998                "Can't get cv-qualifiers here");
3999         if (TL.getType()->isEnumeralType())
4000           SemaRef.Diag(TL.getBeginLoc(),
4001                        diag::warn_cxx98_compat_enum_nested_name_spec);
4002         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
4003                   Q.getLocalEndLoc());
4004         break;
4005       }
4006       // If the nested-name-specifier is an invalid type def, don't emit an
4007       // error because a previous error should have already been emitted.
4008       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4009       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4010         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4011           << TL.getType() << SS.getRange();
4012       }
4013       return NestedNameSpecifierLoc();
4014     }
4015     }
4016 
4017     // The qualifier-in-scope and object type only apply to the leftmost entity.
4018     FirstQualifierInScope = nullptr;
4019     ObjectType = QualType();
4020   }
4021 
4022   // Don't rebuild the nested-name-specifier if we don't have to.
4023   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4024       !getDerived().AlwaysRebuild())
4025     return NNS;
4026 
4027   // If we can re-use the source-location data from the original
4028   // nested-name-specifier, do so.
4029   if (SS.location_size() == NNS.getDataLength() &&
4030       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4031     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4032 
4033   // Allocate new nested-name-specifier location information.
4034   return SS.getWithLocInContext(SemaRef.Context);
4035 }
4036 
4037 template<typename Derived>
4038 DeclarationNameInfo
4039 TreeTransform<Derived>
4040 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4041   DeclarationName Name = NameInfo.getName();
4042   if (!Name)
4043     return DeclarationNameInfo();
4044 
4045   switch (Name.getNameKind()) {
4046   case DeclarationName::Identifier:
4047   case DeclarationName::ObjCZeroArgSelector:
4048   case DeclarationName::ObjCOneArgSelector:
4049   case DeclarationName::ObjCMultiArgSelector:
4050   case DeclarationName::CXXOperatorName:
4051   case DeclarationName::CXXLiteralOperatorName:
4052   case DeclarationName::CXXUsingDirective:
4053     return NameInfo;
4054 
4055   case DeclarationName::CXXDeductionGuideName: {
4056     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4057     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4058         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4059     if (!NewTemplate)
4060       return DeclarationNameInfo();
4061 
4062     DeclarationNameInfo NewNameInfo(NameInfo);
4063     NewNameInfo.setName(
4064         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4065     return NewNameInfo;
4066   }
4067 
4068   case DeclarationName::CXXConstructorName:
4069   case DeclarationName::CXXDestructorName:
4070   case DeclarationName::CXXConversionFunctionName: {
4071     TypeSourceInfo *NewTInfo;
4072     CanQualType NewCanTy;
4073     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4074       NewTInfo = getDerived().TransformType(OldTInfo);
4075       if (!NewTInfo)
4076         return DeclarationNameInfo();
4077       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4078     }
4079     else {
4080       NewTInfo = nullptr;
4081       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4082       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4083       if (NewT.isNull())
4084         return DeclarationNameInfo();
4085       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4086     }
4087 
4088     DeclarationName NewName
4089       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4090                                                            NewCanTy);
4091     DeclarationNameInfo NewNameInfo(NameInfo);
4092     NewNameInfo.setName(NewName);
4093     NewNameInfo.setNamedTypeInfo(NewTInfo);
4094     return NewNameInfo;
4095   }
4096   }
4097 
4098   llvm_unreachable("Unknown name kind.");
4099 }
4100 
4101 template<typename Derived>
4102 TemplateName
4103 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4104                                               TemplateName Name,
4105                                               SourceLocation NameLoc,
4106                                               QualType ObjectType,
4107                                               NamedDecl *FirstQualifierInScope,
4108                                               bool AllowInjectedClassName) {
4109   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4110     TemplateDecl *Template = QTN->getTemplateDecl();
4111     assert(Template && "qualified template name must refer to a template");
4112 
4113     TemplateDecl *TransTemplate
4114       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4115                                                               Template));
4116     if (!TransTemplate)
4117       return TemplateName();
4118 
4119     if (!getDerived().AlwaysRebuild() &&
4120         SS.getScopeRep() == QTN->getQualifier() &&
4121         TransTemplate == Template)
4122       return Name;
4123 
4124     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4125                                             TransTemplate);
4126   }
4127 
4128   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4129     if (SS.getScopeRep()) {
4130       // These apply to the scope specifier, not the template.
4131       ObjectType = QualType();
4132       FirstQualifierInScope = nullptr;
4133     }
4134 
4135     if (!getDerived().AlwaysRebuild() &&
4136         SS.getScopeRep() == DTN->getQualifier() &&
4137         ObjectType.isNull())
4138       return Name;
4139 
4140     // FIXME: Preserve the location of the "template" keyword.
4141     SourceLocation TemplateKWLoc = NameLoc;
4142 
4143     if (DTN->isIdentifier()) {
4144       return getDerived().RebuildTemplateName(SS,
4145                                               TemplateKWLoc,
4146                                               *DTN->getIdentifier(),
4147                                               NameLoc,
4148                                               ObjectType,
4149                                               FirstQualifierInScope,
4150                                               AllowInjectedClassName);
4151     }
4152 
4153     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4154                                             DTN->getOperator(), NameLoc,
4155                                             ObjectType, AllowInjectedClassName);
4156   }
4157 
4158   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4159     TemplateDecl *TransTemplate
4160       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4161                                                               Template));
4162     if (!TransTemplate)
4163       return TemplateName();
4164 
4165     if (!getDerived().AlwaysRebuild() &&
4166         TransTemplate == Template)
4167       return Name;
4168 
4169     return TemplateName(TransTemplate);
4170   }
4171 
4172   if (SubstTemplateTemplateParmPackStorage *SubstPack
4173       = Name.getAsSubstTemplateTemplateParmPack()) {
4174     TemplateTemplateParmDecl *TransParam
4175     = cast_or_null<TemplateTemplateParmDecl>(
4176             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4177     if (!TransParam)
4178       return TemplateName();
4179 
4180     if (!getDerived().AlwaysRebuild() &&
4181         TransParam == SubstPack->getParameterPack())
4182       return Name;
4183 
4184     return getDerived().RebuildTemplateName(TransParam,
4185                                             SubstPack->getArgumentPack());
4186   }
4187 
4188   // These should be getting filtered out before they reach the AST.
4189   llvm_unreachable("overloaded function decl survived to here");
4190 }
4191 
4192 template<typename Derived>
4193 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4194                                          const TemplateArgument &Arg,
4195                                          TemplateArgumentLoc &Output) {
4196   Output = getSema().getTrivialTemplateArgumentLoc(
4197       Arg, QualType(), getDerived().getBaseLocation());
4198 }
4199 
4200 template<typename Derived>
4201 bool TreeTransform<Derived>::TransformTemplateArgument(
4202                                          const TemplateArgumentLoc &Input,
4203                                          TemplateArgumentLoc &Output, bool Uneval) {
4204   const TemplateArgument &Arg = Input.getArgument();
4205   switch (Arg.getKind()) {
4206   case TemplateArgument::Null:
4207   case TemplateArgument::Pack:
4208     llvm_unreachable("Unexpected TemplateArgument");
4209 
4210   case TemplateArgument::Integral:
4211   case TemplateArgument::NullPtr:
4212   case TemplateArgument::Declaration: {
4213     // Transform a resolved template argument straight to a resolved template
4214     // argument. We get here when substituting into an already-substituted
4215     // template type argument during concept satisfaction checking.
4216     QualType T = Arg.getNonTypeTemplateArgumentType();
4217     QualType NewT = getDerived().TransformType(T);
4218     if (NewT.isNull())
4219       return true;
4220 
4221     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4222                        ? Arg.getAsDecl()
4223                        : nullptr;
4224     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4225                               getDerived().getBaseLocation(), D))
4226                         : nullptr;
4227     if (D && !NewD)
4228       return true;
4229 
4230     if (NewT == T && D == NewD)
4231       Output = Input;
4232     else if (Arg.getKind() == TemplateArgument::Integral)
4233       Output = TemplateArgumentLoc(
4234           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4235           TemplateArgumentLocInfo());
4236     else if (Arg.getKind() == TemplateArgument::NullPtr)
4237       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4238                                    TemplateArgumentLocInfo());
4239     else
4240       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4241                                    TemplateArgumentLocInfo());
4242 
4243     return false;
4244   }
4245 
4246   case TemplateArgument::Type: {
4247     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4248     if (!DI)
4249       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4250 
4251     DI = getDerived().TransformType(DI);
4252     if (!DI) return true;
4253 
4254     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4255     return false;
4256   }
4257 
4258   case TemplateArgument::Template: {
4259     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4260     if (QualifierLoc) {
4261       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4262       if (!QualifierLoc)
4263         return true;
4264     }
4265 
4266     CXXScopeSpec SS;
4267     SS.Adopt(QualifierLoc);
4268     TemplateName Template
4269       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4270                                            Input.getTemplateNameLoc());
4271     if (Template.isNull())
4272       return true;
4273 
4274     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4275                                  Input.getTemplateNameLoc());
4276     return false;
4277   }
4278 
4279   case TemplateArgument::TemplateExpansion:
4280     llvm_unreachable("Caller should expand pack expansions");
4281 
4282   case TemplateArgument::Expression: {
4283     // Template argument expressions are constant expressions.
4284     EnterExpressionEvaluationContext Unevaluated(
4285         getSema(),
4286         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4287                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4288         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4289         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4290 
4291     Expr *InputExpr = Input.getSourceExpression();
4292     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4293 
4294     ExprResult E = getDerived().TransformExpr(InputExpr);
4295     E = SemaRef.ActOnConstantExpression(E);
4296     if (E.isInvalid()) return true;
4297     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4298     return false;
4299   }
4300   }
4301 
4302   // Work around bogus GCC warning
4303   return true;
4304 }
4305 
4306 /// Iterator adaptor that invents template argument location information
4307 /// for each of the template arguments in its underlying iterator.
4308 template<typename Derived, typename InputIterator>
4309 class TemplateArgumentLocInventIterator {
4310   TreeTransform<Derived> &Self;
4311   InputIterator Iter;
4312 
4313 public:
4314   typedef TemplateArgumentLoc value_type;
4315   typedef TemplateArgumentLoc reference;
4316   typedef typename std::iterator_traits<InputIterator>::difference_type
4317     difference_type;
4318   typedef std::input_iterator_tag iterator_category;
4319 
4320   class pointer {
4321     TemplateArgumentLoc Arg;
4322 
4323   public:
4324     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4325 
4326     const TemplateArgumentLoc *operator->() const { return &Arg; }
4327   };
4328 
4329   TemplateArgumentLocInventIterator() { }
4330 
4331   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4332                                              InputIterator Iter)
4333     : Self(Self), Iter(Iter) { }
4334 
4335   TemplateArgumentLocInventIterator &operator++() {
4336     ++Iter;
4337     return *this;
4338   }
4339 
4340   TemplateArgumentLocInventIterator operator++(int) {
4341     TemplateArgumentLocInventIterator Old(*this);
4342     ++(*this);
4343     return Old;
4344   }
4345 
4346   reference operator*() const {
4347     TemplateArgumentLoc Result;
4348     Self.InventTemplateArgumentLoc(*Iter, Result);
4349     return Result;
4350   }
4351 
4352   pointer operator->() const { return pointer(**this); }
4353 
4354   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4355                          const TemplateArgumentLocInventIterator &Y) {
4356     return X.Iter == Y.Iter;
4357   }
4358 
4359   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4360                          const TemplateArgumentLocInventIterator &Y) {
4361     return X.Iter != Y.Iter;
4362   }
4363 };
4364 
4365 template<typename Derived>
4366 template<typename InputIterator>
4367 bool TreeTransform<Derived>::TransformTemplateArguments(
4368     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4369     bool Uneval) {
4370   for (; First != Last; ++First) {
4371     TemplateArgumentLoc Out;
4372     TemplateArgumentLoc In = *First;
4373 
4374     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4375       // Unpack argument packs, which we translate them into separate
4376       // arguments.
4377       // FIXME: We could do much better if we could guarantee that the
4378       // TemplateArgumentLocInfo for the pack expansion would be usable for
4379       // all of the template arguments in the argument pack.
4380       typedef TemplateArgumentLocInventIterator<Derived,
4381                                                 TemplateArgument::pack_iterator>
4382         PackLocIterator;
4383       if (TransformTemplateArguments(PackLocIterator(*this,
4384                                                  In.getArgument().pack_begin()),
4385                                      PackLocIterator(*this,
4386                                                    In.getArgument().pack_end()),
4387                                      Outputs, Uneval))
4388         return true;
4389 
4390       continue;
4391     }
4392 
4393     if (In.getArgument().isPackExpansion()) {
4394       // We have a pack expansion, for which we will be substituting into
4395       // the pattern.
4396       SourceLocation Ellipsis;
4397       Optional<unsigned> OrigNumExpansions;
4398       TemplateArgumentLoc Pattern
4399         = getSema().getTemplateArgumentPackExpansionPattern(
4400               In, Ellipsis, OrigNumExpansions);
4401 
4402       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4403       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4404       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4405 
4406       // Determine whether the set of unexpanded parameter packs can and should
4407       // be expanded.
4408       bool Expand = true;
4409       bool RetainExpansion = false;
4410       Optional<unsigned> NumExpansions = OrigNumExpansions;
4411       if (getDerived().TryExpandParameterPacks(Ellipsis,
4412                                                Pattern.getSourceRange(),
4413                                                Unexpanded,
4414                                                Expand,
4415                                                RetainExpansion,
4416                                                NumExpansions))
4417         return true;
4418 
4419       if (!Expand) {
4420         // The transform has determined that we should perform a simple
4421         // transformation on the pack expansion, producing another pack
4422         // expansion.
4423         TemplateArgumentLoc OutPattern;
4424         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4425         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4426           return true;
4427 
4428         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4429                                                 NumExpansions);
4430         if (Out.getArgument().isNull())
4431           return true;
4432 
4433         Outputs.addArgument(Out);
4434         continue;
4435       }
4436 
4437       // The transform has determined that we should perform an elementwise
4438       // expansion of the pattern. Do so.
4439       for (unsigned I = 0; I != *NumExpansions; ++I) {
4440         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4441 
4442         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4443           return true;
4444 
4445         if (Out.getArgument().containsUnexpandedParameterPack()) {
4446           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4447                                                   OrigNumExpansions);
4448           if (Out.getArgument().isNull())
4449             return true;
4450         }
4451 
4452         Outputs.addArgument(Out);
4453       }
4454 
4455       // If we're supposed to retain a pack expansion, do so by temporarily
4456       // forgetting the partially-substituted parameter pack.
4457       if (RetainExpansion) {
4458         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4459 
4460         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4461           return true;
4462 
4463         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4464                                                 OrigNumExpansions);
4465         if (Out.getArgument().isNull())
4466           return true;
4467 
4468         Outputs.addArgument(Out);
4469       }
4470 
4471       continue;
4472     }
4473 
4474     // The simple case:
4475     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4476       return true;
4477 
4478     Outputs.addArgument(Out);
4479   }
4480 
4481   return false;
4482 
4483 }
4484 
4485 //===----------------------------------------------------------------------===//
4486 // Type transformation
4487 //===----------------------------------------------------------------------===//
4488 
4489 template<typename Derived>
4490 QualType TreeTransform<Derived>::TransformType(QualType T) {
4491   if (getDerived().AlreadyTransformed(T))
4492     return T;
4493 
4494   // Temporary workaround.  All of these transformations should
4495   // eventually turn into transformations on TypeLocs.
4496   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4497                                                 getDerived().getBaseLocation());
4498 
4499   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4500 
4501   if (!NewDI)
4502     return QualType();
4503 
4504   return NewDI->getType();
4505 }
4506 
4507 template<typename Derived>
4508 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4509   // Refine the base location to the type's location.
4510   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4511                        getDerived().getBaseEntity());
4512   if (getDerived().AlreadyTransformed(DI->getType()))
4513     return DI;
4514 
4515   TypeLocBuilder TLB;
4516 
4517   TypeLoc TL = DI->getTypeLoc();
4518   TLB.reserve(TL.getFullDataSize());
4519 
4520   QualType Result = getDerived().TransformType(TLB, TL);
4521   if (Result.isNull())
4522     return nullptr;
4523 
4524   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4525 }
4526 
4527 template<typename Derived>
4528 QualType
4529 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4530   switch (T.getTypeLocClass()) {
4531 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4532 #define TYPELOC(CLASS, PARENT)                                                 \
4533   case TypeLoc::CLASS:                                                         \
4534     return getDerived().Transform##CLASS##Type(TLB,                            \
4535                                                T.castAs<CLASS##TypeLoc>());
4536 #include "clang/AST/TypeLocNodes.def"
4537   }
4538 
4539   llvm_unreachable("unhandled type loc!");
4540 }
4541 
4542 template<typename Derived>
4543 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4544   if (!isa<DependentNameType>(T))
4545     return TransformType(T);
4546 
4547   if (getDerived().AlreadyTransformed(T))
4548     return T;
4549   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4550                                                 getDerived().getBaseLocation());
4551   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4552   return NewDI ? NewDI->getType() : QualType();
4553 }
4554 
4555 template<typename Derived>
4556 TypeSourceInfo *
4557 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4558   if (!isa<DependentNameType>(DI->getType()))
4559     return TransformType(DI);
4560 
4561   // Refine the base location to the type's location.
4562   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4563                        getDerived().getBaseEntity());
4564   if (getDerived().AlreadyTransformed(DI->getType()))
4565     return DI;
4566 
4567   TypeLocBuilder TLB;
4568 
4569   TypeLoc TL = DI->getTypeLoc();
4570   TLB.reserve(TL.getFullDataSize());
4571 
4572   auto QTL = TL.getAs<QualifiedTypeLoc>();
4573   if (QTL)
4574     TL = QTL.getUnqualifiedLoc();
4575 
4576   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4577 
4578   QualType Result = getDerived().TransformDependentNameType(
4579       TLB, DNTL, /*DeducedTSTContext*/true);
4580   if (Result.isNull())
4581     return nullptr;
4582 
4583   if (QTL) {
4584     Result = getDerived().RebuildQualifiedType(Result, QTL);
4585     if (Result.isNull())
4586       return nullptr;
4587     TLB.TypeWasModifiedSafely(Result);
4588   }
4589 
4590   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4591 }
4592 
4593 template<typename Derived>
4594 QualType
4595 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4596                                                QualifiedTypeLoc T) {
4597   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4598   if (Result.isNull())
4599     return QualType();
4600 
4601   Result = getDerived().RebuildQualifiedType(Result, T);
4602 
4603   if (Result.isNull())
4604     return QualType();
4605 
4606   // RebuildQualifiedType might have updated the type, but not in a way
4607   // that invalidates the TypeLoc. (There's no location information for
4608   // qualifiers.)
4609   TLB.TypeWasModifiedSafely(Result);
4610 
4611   return Result;
4612 }
4613 
4614 template <typename Derived>
4615 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4616                                                       QualifiedTypeLoc TL) {
4617 
4618   SourceLocation Loc = TL.getBeginLoc();
4619   Qualifiers Quals = TL.getType().getLocalQualifiers();
4620 
4621   if (((T.getAddressSpace() != LangAS::Default &&
4622         Quals.getAddressSpace() != LangAS::Default)) &&
4623       T.getAddressSpace() != Quals.getAddressSpace()) {
4624     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4625         << TL.getType() << T;
4626     return QualType();
4627   }
4628 
4629   // C++ [dcl.fct]p7:
4630   //   [When] adding cv-qualifications on top of the function type [...] the
4631   //   cv-qualifiers are ignored.
4632   if (T->isFunctionType()) {
4633     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4634                                                      Quals.getAddressSpace());
4635     return T;
4636   }
4637 
4638   // C++ [dcl.ref]p1:
4639   //   when the cv-qualifiers are introduced through the use of a typedef-name
4640   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4641   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4642   // applied to a reference type.
4643   if (T->isReferenceType()) {
4644     // The only qualifier that applies to a reference type is restrict.
4645     if (!Quals.hasRestrict())
4646       return T;
4647     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4648   }
4649 
4650   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4651   // resulting type.
4652   if (Quals.hasObjCLifetime()) {
4653     if (!T->isObjCLifetimeType() && !T->isDependentType())
4654       Quals.removeObjCLifetime();
4655     else if (T.getObjCLifetime()) {
4656       // Objective-C ARC:
4657       //   A lifetime qualifier applied to a substituted template parameter
4658       //   overrides the lifetime qualifier from the template argument.
4659       const AutoType *AutoTy;
4660       if (const SubstTemplateTypeParmType *SubstTypeParam
4661                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4662         QualType Replacement = SubstTypeParam->getReplacementType();
4663         Qualifiers Qs = Replacement.getQualifiers();
4664         Qs.removeObjCLifetime();
4665         Replacement = SemaRef.Context.getQualifiedType(
4666             Replacement.getUnqualifiedType(), Qs);
4667         T = SemaRef.Context.getSubstTemplateTypeParmType(
4668             SubstTypeParam->getReplacedParameter(), Replacement);
4669       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4670         // 'auto' types behave the same way as template parameters.
4671         QualType Deduced = AutoTy->getDeducedType();
4672         Qualifiers Qs = Deduced.getQualifiers();
4673         Qs.removeObjCLifetime();
4674         Deduced =
4675             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4676         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4677                                         AutoTy->isDependentType(),
4678                                         /*isPack=*/false,
4679                                         AutoTy->getTypeConstraintConcept(),
4680                                         AutoTy->getTypeConstraintArguments());
4681       } else {
4682         // Otherwise, complain about the addition of a qualifier to an
4683         // already-qualified type.
4684         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4685         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4686         Quals.removeObjCLifetime();
4687       }
4688     }
4689   }
4690 
4691   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4692 }
4693 
4694 template<typename Derived>
4695 TypeLoc
4696 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4697                                                    QualType ObjectType,
4698                                                    NamedDecl *UnqualLookup,
4699                                                    CXXScopeSpec &SS) {
4700   if (getDerived().AlreadyTransformed(TL.getType()))
4701     return TL;
4702 
4703   TypeSourceInfo *TSI =
4704       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4705   if (TSI)
4706     return TSI->getTypeLoc();
4707   return TypeLoc();
4708 }
4709 
4710 template<typename Derived>
4711 TypeSourceInfo *
4712 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4713                                                    QualType ObjectType,
4714                                                    NamedDecl *UnqualLookup,
4715                                                    CXXScopeSpec &SS) {
4716   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4717     return TSInfo;
4718 
4719   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4720                                    UnqualLookup, SS);
4721 }
4722 
4723 template <typename Derived>
4724 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4725     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4726     CXXScopeSpec &SS) {
4727   QualType T = TL.getType();
4728   assert(!getDerived().AlreadyTransformed(T));
4729 
4730   TypeLocBuilder TLB;
4731   QualType Result;
4732 
4733   if (isa<TemplateSpecializationType>(T)) {
4734     TemplateSpecializationTypeLoc SpecTL =
4735         TL.castAs<TemplateSpecializationTypeLoc>();
4736 
4737     TemplateName Template = getDerived().TransformTemplateName(
4738         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4739         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4740     if (Template.isNull())
4741       return nullptr;
4742 
4743     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4744                                                               Template);
4745   } else if (isa<DependentTemplateSpecializationType>(T)) {
4746     DependentTemplateSpecializationTypeLoc SpecTL =
4747         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4748 
4749     TemplateName Template
4750       = getDerived().RebuildTemplateName(SS,
4751                                          SpecTL.getTemplateKeywordLoc(),
4752                                          *SpecTL.getTypePtr()->getIdentifier(),
4753                                          SpecTL.getTemplateNameLoc(),
4754                                          ObjectType, UnqualLookup,
4755                                          /*AllowInjectedClassName*/true);
4756     if (Template.isNull())
4757       return nullptr;
4758 
4759     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4760                                                                        SpecTL,
4761                                                                        Template,
4762                                                                        SS);
4763   } else {
4764     // Nothing special needs to be done for these.
4765     Result = getDerived().TransformType(TLB, TL);
4766   }
4767 
4768   if (Result.isNull())
4769     return nullptr;
4770 
4771   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4772 }
4773 
4774 template <class TyLoc> static inline
4775 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4776   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4777   NewT.setNameLoc(T.getNameLoc());
4778   return T.getType();
4779 }
4780 
4781 template<typename Derived>
4782 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4783                                                       BuiltinTypeLoc T) {
4784   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4785   NewT.setBuiltinLoc(T.getBuiltinLoc());
4786   if (T.needsExtraLocalData())
4787     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4788   return T.getType();
4789 }
4790 
4791 template<typename Derived>
4792 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4793                                                       ComplexTypeLoc T) {
4794   // FIXME: recurse?
4795   return TransformTypeSpecType(TLB, T);
4796 }
4797 
4798 template <typename Derived>
4799 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4800                                                        AdjustedTypeLoc TL) {
4801   // Adjustments applied during transformation are handled elsewhere.
4802   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4803 }
4804 
4805 template<typename Derived>
4806 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4807                                                       DecayedTypeLoc TL) {
4808   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4809   if (OriginalType.isNull())
4810     return QualType();
4811 
4812   QualType Result = TL.getType();
4813   if (getDerived().AlwaysRebuild() ||
4814       OriginalType != TL.getOriginalLoc().getType())
4815     Result = SemaRef.Context.getDecayedType(OriginalType);
4816   TLB.push<DecayedTypeLoc>(Result);
4817   // Nothing to set for DecayedTypeLoc.
4818   return Result;
4819 }
4820 
4821 template<typename Derived>
4822 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4823                                                       PointerTypeLoc TL) {
4824   QualType PointeeType
4825     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4826   if (PointeeType.isNull())
4827     return QualType();
4828 
4829   QualType Result = TL.getType();
4830   if (PointeeType->getAs<ObjCObjectType>()) {
4831     // A dependent pointer type 'T *' has is being transformed such
4832     // that an Objective-C class type is being replaced for 'T'. The
4833     // resulting pointer type is an ObjCObjectPointerType, not a
4834     // PointerType.
4835     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4836 
4837     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4838     NewT.setStarLoc(TL.getStarLoc());
4839     return Result;
4840   }
4841 
4842   if (getDerived().AlwaysRebuild() ||
4843       PointeeType != TL.getPointeeLoc().getType()) {
4844     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4845     if (Result.isNull())
4846       return QualType();
4847   }
4848 
4849   // Objective-C ARC can add lifetime qualifiers to the type that we're
4850   // pointing to.
4851   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4852 
4853   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4854   NewT.setSigilLoc(TL.getSigilLoc());
4855   return Result;
4856 }
4857 
4858 template<typename Derived>
4859 QualType
4860 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4861                                                   BlockPointerTypeLoc TL) {
4862   QualType PointeeType
4863     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4864   if (PointeeType.isNull())
4865     return QualType();
4866 
4867   QualType Result = TL.getType();
4868   if (getDerived().AlwaysRebuild() ||
4869       PointeeType != TL.getPointeeLoc().getType()) {
4870     Result = getDerived().RebuildBlockPointerType(PointeeType,
4871                                                   TL.getSigilLoc());
4872     if (Result.isNull())
4873       return QualType();
4874   }
4875 
4876   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4877   NewT.setSigilLoc(TL.getSigilLoc());
4878   return Result;
4879 }
4880 
4881 /// Transforms a reference type.  Note that somewhat paradoxically we
4882 /// don't care whether the type itself is an l-value type or an r-value
4883 /// type;  we only care if the type was *written* as an l-value type
4884 /// or an r-value type.
4885 template<typename Derived>
4886 QualType
4887 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4888                                                ReferenceTypeLoc TL) {
4889   const ReferenceType *T = TL.getTypePtr();
4890 
4891   // Note that this works with the pointee-as-written.
4892   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4893   if (PointeeType.isNull())
4894     return QualType();
4895 
4896   QualType Result = TL.getType();
4897   if (getDerived().AlwaysRebuild() ||
4898       PointeeType != T->getPointeeTypeAsWritten()) {
4899     Result = getDerived().RebuildReferenceType(PointeeType,
4900                                                T->isSpelledAsLValue(),
4901                                                TL.getSigilLoc());
4902     if (Result.isNull())
4903       return QualType();
4904   }
4905 
4906   // Objective-C ARC can add lifetime qualifiers to the type that we're
4907   // referring to.
4908   TLB.TypeWasModifiedSafely(
4909       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4910 
4911   // r-value references can be rebuilt as l-value references.
4912   ReferenceTypeLoc NewTL;
4913   if (isa<LValueReferenceType>(Result))
4914     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4915   else
4916     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4917   NewTL.setSigilLoc(TL.getSigilLoc());
4918 
4919   return Result;
4920 }
4921 
4922 template<typename Derived>
4923 QualType
4924 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4925                                                  LValueReferenceTypeLoc TL) {
4926   return TransformReferenceType(TLB, TL);
4927 }
4928 
4929 template<typename Derived>
4930 QualType
4931 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4932                                                  RValueReferenceTypeLoc TL) {
4933   return TransformReferenceType(TLB, TL);
4934 }
4935 
4936 template<typename Derived>
4937 QualType
4938 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4939                                                    MemberPointerTypeLoc TL) {
4940   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4941   if (PointeeType.isNull())
4942     return QualType();
4943 
4944   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4945   TypeSourceInfo *NewClsTInfo = nullptr;
4946   if (OldClsTInfo) {
4947     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4948     if (!NewClsTInfo)
4949       return QualType();
4950   }
4951 
4952   const MemberPointerType *T = TL.getTypePtr();
4953   QualType OldClsType = QualType(T->getClass(), 0);
4954   QualType NewClsType;
4955   if (NewClsTInfo)
4956     NewClsType = NewClsTInfo->getType();
4957   else {
4958     NewClsType = getDerived().TransformType(OldClsType);
4959     if (NewClsType.isNull())
4960       return QualType();
4961   }
4962 
4963   QualType Result = TL.getType();
4964   if (getDerived().AlwaysRebuild() ||
4965       PointeeType != T->getPointeeType() ||
4966       NewClsType != OldClsType) {
4967     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4968                                                    TL.getStarLoc());
4969     if (Result.isNull())
4970       return QualType();
4971   }
4972 
4973   // If we had to adjust the pointee type when building a member pointer, make
4974   // sure to push TypeLoc info for it.
4975   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4976   if (MPT && PointeeType != MPT->getPointeeType()) {
4977     assert(isa<AdjustedType>(MPT->getPointeeType()));
4978     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4979   }
4980 
4981   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4982   NewTL.setSigilLoc(TL.getSigilLoc());
4983   NewTL.setClassTInfo(NewClsTInfo);
4984 
4985   return Result;
4986 }
4987 
4988 template<typename Derived>
4989 QualType
4990 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4991                                                    ConstantArrayTypeLoc TL) {
4992   const ConstantArrayType *T = TL.getTypePtr();
4993   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4994   if (ElementType.isNull())
4995     return QualType();
4996 
4997   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4998   Expr *OldSize = TL.getSizeExpr();
4999   if (!OldSize)
5000     OldSize = const_cast<Expr*>(T->getSizeExpr());
5001   Expr *NewSize = nullptr;
5002   if (OldSize) {
5003     EnterExpressionEvaluationContext Unevaluated(
5004         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5005     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5006     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5007   }
5008 
5009   QualType Result = TL.getType();
5010   if (getDerived().AlwaysRebuild() ||
5011       ElementType != T->getElementType() ||
5012       (T->getSizeExpr() && NewSize != OldSize)) {
5013     Result = getDerived().RebuildConstantArrayType(ElementType,
5014                                                    T->getSizeModifier(),
5015                                                    T->getSize(), NewSize,
5016                                              T->getIndexTypeCVRQualifiers(),
5017                                                    TL.getBracketsRange());
5018     if (Result.isNull())
5019       return QualType();
5020   }
5021 
5022   // We might have either a ConstantArrayType or a VariableArrayType now:
5023   // a ConstantArrayType is allowed to have an element type which is a
5024   // VariableArrayType if the type is dependent.  Fortunately, all array
5025   // types have the same location layout.
5026   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5027   NewTL.setLBracketLoc(TL.getLBracketLoc());
5028   NewTL.setRBracketLoc(TL.getRBracketLoc());
5029   NewTL.setSizeExpr(NewSize);
5030 
5031   return Result;
5032 }
5033 
5034 template<typename Derived>
5035 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5036                                               TypeLocBuilder &TLB,
5037                                               IncompleteArrayTypeLoc TL) {
5038   const IncompleteArrayType *T = TL.getTypePtr();
5039   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5040   if (ElementType.isNull())
5041     return QualType();
5042 
5043   QualType Result = TL.getType();
5044   if (getDerived().AlwaysRebuild() ||
5045       ElementType != T->getElementType()) {
5046     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5047                                                      T->getSizeModifier(),
5048                                            T->getIndexTypeCVRQualifiers(),
5049                                                      TL.getBracketsRange());
5050     if (Result.isNull())
5051       return QualType();
5052   }
5053 
5054   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5055   NewTL.setLBracketLoc(TL.getLBracketLoc());
5056   NewTL.setRBracketLoc(TL.getRBracketLoc());
5057   NewTL.setSizeExpr(nullptr);
5058 
5059   return Result;
5060 }
5061 
5062 template<typename Derived>
5063 QualType
5064 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5065                                                    VariableArrayTypeLoc TL) {
5066   const VariableArrayType *T = TL.getTypePtr();
5067   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5068   if (ElementType.isNull())
5069     return QualType();
5070 
5071   ExprResult SizeResult;
5072   {
5073     EnterExpressionEvaluationContext Context(
5074         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5075     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5076   }
5077   if (SizeResult.isInvalid())
5078     return QualType();
5079   SizeResult =
5080       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5081   if (SizeResult.isInvalid())
5082     return QualType();
5083 
5084   Expr *Size = SizeResult.get();
5085 
5086   QualType Result = TL.getType();
5087   if (getDerived().AlwaysRebuild() ||
5088       ElementType != T->getElementType() ||
5089       Size != T->getSizeExpr()) {
5090     Result = getDerived().RebuildVariableArrayType(ElementType,
5091                                                    T->getSizeModifier(),
5092                                                    Size,
5093                                              T->getIndexTypeCVRQualifiers(),
5094                                                    TL.getBracketsRange());
5095     if (Result.isNull())
5096       return QualType();
5097   }
5098 
5099   // We might have constant size array now, but fortunately it has the same
5100   // location layout.
5101   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5102   NewTL.setLBracketLoc(TL.getLBracketLoc());
5103   NewTL.setRBracketLoc(TL.getRBracketLoc());
5104   NewTL.setSizeExpr(Size);
5105 
5106   return Result;
5107 }
5108 
5109 template<typename Derived>
5110 QualType
5111 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5112                                              DependentSizedArrayTypeLoc TL) {
5113   const DependentSizedArrayType *T = TL.getTypePtr();
5114   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5115   if (ElementType.isNull())
5116     return QualType();
5117 
5118   // Array bounds are constant expressions.
5119   EnterExpressionEvaluationContext Unevaluated(
5120       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5121 
5122   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5123   Expr *origSize = TL.getSizeExpr();
5124   if (!origSize) origSize = T->getSizeExpr();
5125 
5126   ExprResult sizeResult
5127     = getDerived().TransformExpr(origSize);
5128   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5129   if (sizeResult.isInvalid())
5130     return QualType();
5131 
5132   Expr *size = sizeResult.get();
5133 
5134   QualType Result = TL.getType();
5135   if (getDerived().AlwaysRebuild() ||
5136       ElementType != T->getElementType() ||
5137       size != origSize) {
5138     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5139                                                          T->getSizeModifier(),
5140                                                          size,
5141                                                 T->getIndexTypeCVRQualifiers(),
5142                                                         TL.getBracketsRange());
5143     if (Result.isNull())
5144       return QualType();
5145   }
5146 
5147   // We might have any sort of array type now, but fortunately they
5148   // all have the same location layout.
5149   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5150   NewTL.setLBracketLoc(TL.getLBracketLoc());
5151   NewTL.setRBracketLoc(TL.getRBracketLoc());
5152   NewTL.setSizeExpr(size);
5153 
5154   return Result;
5155 }
5156 
5157 template <typename Derived>
5158 QualType TreeTransform<Derived>::TransformDependentVectorType(
5159     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5160   const DependentVectorType *T = TL.getTypePtr();
5161   QualType ElementType = getDerived().TransformType(T->getElementType());
5162   if (ElementType.isNull())
5163     return QualType();
5164 
5165   EnterExpressionEvaluationContext Unevaluated(
5166       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5167 
5168   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5169   Size = SemaRef.ActOnConstantExpression(Size);
5170   if (Size.isInvalid())
5171     return QualType();
5172 
5173   QualType Result = TL.getType();
5174   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5175       Size.get() != T->getSizeExpr()) {
5176     Result = getDerived().RebuildDependentVectorType(
5177         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5178     if (Result.isNull())
5179       return QualType();
5180   }
5181 
5182   // Result might be dependent or not.
5183   if (isa<DependentVectorType>(Result)) {
5184     DependentVectorTypeLoc NewTL =
5185         TLB.push<DependentVectorTypeLoc>(Result);
5186     NewTL.setNameLoc(TL.getNameLoc());
5187   } else {
5188     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5189     NewTL.setNameLoc(TL.getNameLoc());
5190   }
5191 
5192   return Result;
5193 }
5194 
5195 template<typename Derived>
5196 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5197                                       TypeLocBuilder &TLB,
5198                                       DependentSizedExtVectorTypeLoc TL) {
5199   const DependentSizedExtVectorType *T = TL.getTypePtr();
5200 
5201   // FIXME: ext vector locs should be nested
5202   QualType ElementType = getDerived().TransformType(T->getElementType());
5203   if (ElementType.isNull())
5204     return QualType();
5205 
5206   // Vector sizes are constant expressions.
5207   EnterExpressionEvaluationContext Unevaluated(
5208       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5209 
5210   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5211   Size = SemaRef.ActOnConstantExpression(Size);
5212   if (Size.isInvalid())
5213     return QualType();
5214 
5215   QualType Result = TL.getType();
5216   if (getDerived().AlwaysRebuild() ||
5217       ElementType != T->getElementType() ||
5218       Size.get() != T->getSizeExpr()) {
5219     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5220                                                              Size.get(),
5221                                                          T->getAttributeLoc());
5222     if (Result.isNull())
5223       return QualType();
5224   }
5225 
5226   // Result might be dependent or not.
5227   if (isa<DependentSizedExtVectorType>(Result)) {
5228     DependentSizedExtVectorTypeLoc NewTL
5229       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5230     NewTL.setNameLoc(TL.getNameLoc());
5231   } else {
5232     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5233     NewTL.setNameLoc(TL.getNameLoc());
5234   }
5235 
5236   return Result;
5237 }
5238 
5239 template <typename Derived>
5240 QualType
5241 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5242                                                     ConstantMatrixTypeLoc TL) {
5243   const ConstantMatrixType *T = TL.getTypePtr();
5244   QualType ElementType = getDerived().TransformType(T->getElementType());
5245   if (ElementType.isNull())
5246     return QualType();
5247 
5248   QualType Result = TL.getType();
5249   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5250     Result = getDerived().RebuildConstantMatrixType(
5251         ElementType, T->getNumRows(), T->getNumColumns());
5252     if (Result.isNull())
5253       return QualType();
5254   }
5255 
5256   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5257   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5258   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5259   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5260   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5261 
5262   return Result;
5263 }
5264 
5265 template <typename Derived>
5266 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5267     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5268   const DependentSizedMatrixType *T = TL.getTypePtr();
5269 
5270   QualType ElementType = getDerived().TransformType(T->getElementType());
5271   if (ElementType.isNull()) {
5272     return QualType();
5273   }
5274 
5275   // Matrix dimensions are constant expressions.
5276   EnterExpressionEvaluationContext Unevaluated(
5277       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5278 
5279   Expr *origRows = TL.getAttrRowOperand();
5280   if (!origRows)
5281     origRows = T->getRowExpr();
5282   Expr *origColumns = TL.getAttrColumnOperand();
5283   if (!origColumns)
5284     origColumns = T->getColumnExpr();
5285 
5286   ExprResult rowResult = getDerived().TransformExpr(origRows);
5287   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5288   if (rowResult.isInvalid())
5289     return QualType();
5290 
5291   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5292   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5293   if (columnResult.isInvalid())
5294     return QualType();
5295 
5296   Expr *rows = rowResult.get();
5297   Expr *columns = columnResult.get();
5298 
5299   QualType Result = TL.getType();
5300   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5301       rows != origRows || columns != origColumns) {
5302     Result = getDerived().RebuildDependentSizedMatrixType(
5303         ElementType, rows, columns, T->getAttributeLoc());
5304 
5305     if (Result.isNull())
5306       return QualType();
5307   }
5308 
5309   // We might have any sort of matrix type now, but fortunately they
5310   // all have the same location layout.
5311   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5312   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5313   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5314   NewTL.setAttrRowOperand(rows);
5315   NewTL.setAttrColumnOperand(columns);
5316   return Result;
5317 }
5318 
5319 template <typename Derived>
5320 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5321     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5322   const DependentAddressSpaceType *T = TL.getTypePtr();
5323 
5324   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5325 
5326   if (pointeeType.isNull())
5327     return QualType();
5328 
5329   // Address spaces are constant expressions.
5330   EnterExpressionEvaluationContext Unevaluated(
5331       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5332 
5333   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5334   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5335   if (AddrSpace.isInvalid())
5336     return QualType();
5337 
5338   QualType Result = TL.getType();
5339   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5340       AddrSpace.get() != T->getAddrSpaceExpr()) {
5341     Result = getDerived().RebuildDependentAddressSpaceType(
5342         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5343     if (Result.isNull())
5344       return QualType();
5345   }
5346 
5347   // Result might be dependent or not.
5348   if (isa<DependentAddressSpaceType>(Result)) {
5349     DependentAddressSpaceTypeLoc NewTL =
5350         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5351 
5352     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5353     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5354     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5355 
5356   } else {
5357     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5358         Result, getDerived().getBaseLocation());
5359     TransformType(TLB, DI->getTypeLoc());
5360   }
5361 
5362   return Result;
5363 }
5364 
5365 template <typename Derived>
5366 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5367                                                      VectorTypeLoc TL) {
5368   const VectorType *T = TL.getTypePtr();
5369   QualType ElementType = getDerived().TransformType(T->getElementType());
5370   if (ElementType.isNull())
5371     return QualType();
5372 
5373   QualType Result = TL.getType();
5374   if (getDerived().AlwaysRebuild() ||
5375       ElementType != T->getElementType()) {
5376     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5377                                             T->getVectorKind());
5378     if (Result.isNull())
5379       return QualType();
5380   }
5381 
5382   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5383   NewTL.setNameLoc(TL.getNameLoc());
5384 
5385   return Result;
5386 }
5387 
5388 template<typename Derived>
5389 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5390                                                         ExtVectorTypeLoc TL) {
5391   const VectorType *T = TL.getTypePtr();
5392   QualType ElementType = getDerived().TransformType(T->getElementType());
5393   if (ElementType.isNull())
5394     return QualType();
5395 
5396   QualType Result = TL.getType();
5397   if (getDerived().AlwaysRebuild() ||
5398       ElementType != T->getElementType()) {
5399     Result = getDerived().RebuildExtVectorType(ElementType,
5400                                                T->getNumElements(),
5401                                                /*FIXME*/ SourceLocation());
5402     if (Result.isNull())
5403       return QualType();
5404   }
5405 
5406   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5407   NewTL.setNameLoc(TL.getNameLoc());
5408 
5409   return Result;
5410 }
5411 
5412 template <typename Derived>
5413 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5414     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5415     bool ExpectParameterPack) {
5416   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5417   TypeSourceInfo *NewDI = nullptr;
5418 
5419   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5420     // If we're substituting into a pack expansion type and we know the
5421     // length we want to expand to, just substitute for the pattern.
5422     TypeLoc OldTL = OldDI->getTypeLoc();
5423     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5424 
5425     TypeLocBuilder TLB;
5426     TypeLoc NewTL = OldDI->getTypeLoc();
5427     TLB.reserve(NewTL.getFullDataSize());
5428 
5429     QualType Result = getDerived().TransformType(TLB,
5430                                                OldExpansionTL.getPatternLoc());
5431     if (Result.isNull())
5432       return nullptr;
5433 
5434     Result = RebuildPackExpansionType(Result,
5435                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5436                                       OldExpansionTL.getEllipsisLoc(),
5437                                       NumExpansions);
5438     if (Result.isNull())
5439       return nullptr;
5440 
5441     PackExpansionTypeLoc NewExpansionTL
5442       = TLB.push<PackExpansionTypeLoc>(Result);
5443     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5444     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5445   } else
5446     NewDI = getDerived().TransformType(OldDI);
5447   if (!NewDI)
5448     return nullptr;
5449 
5450   if (NewDI == OldDI && indexAdjustment == 0)
5451     return OldParm;
5452 
5453   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5454                                              OldParm->getDeclContext(),
5455                                              OldParm->getInnerLocStart(),
5456                                              OldParm->getLocation(),
5457                                              OldParm->getIdentifier(),
5458                                              NewDI->getType(),
5459                                              NewDI,
5460                                              OldParm->getStorageClass(),
5461                                              /* DefArg */ nullptr);
5462   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5463                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5464   return newParm;
5465 }
5466 
5467 template <typename Derived>
5468 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5469     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5470     const QualType *ParamTypes,
5471     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5472     SmallVectorImpl<QualType> &OutParamTypes,
5473     SmallVectorImpl<ParmVarDecl *> *PVars,
5474     Sema::ExtParameterInfoBuilder &PInfos) {
5475   int indexAdjustment = 0;
5476 
5477   unsigned NumParams = Params.size();
5478   for (unsigned i = 0; i != NumParams; ++i) {
5479     if (ParmVarDecl *OldParm = Params[i]) {
5480       assert(OldParm->getFunctionScopeIndex() == i);
5481 
5482       Optional<unsigned> NumExpansions;
5483       ParmVarDecl *NewParm = nullptr;
5484       if (OldParm->isParameterPack()) {
5485         // We have a function parameter pack that may need to be expanded.
5486         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5487 
5488         // Find the parameter packs that could be expanded.
5489         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5490         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5491         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5492         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5493 
5494         // Determine whether we should expand the parameter packs.
5495         bool ShouldExpand = false;
5496         bool RetainExpansion = false;
5497         Optional<unsigned> OrigNumExpansions;
5498         if (Unexpanded.size() > 0) {
5499           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5500           NumExpansions = OrigNumExpansions;
5501           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5502                                                    Pattern.getSourceRange(),
5503                                                    Unexpanded,
5504                                                    ShouldExpand,
5505                                                    RetainExpansion,
5506                                                    NumExpansions)) {
5507             return true;
5508           }
5509         } else {
5510 #ifndef NDEBUG
5511           const AutoType *AT =
5512               Pattern.getType().getTypePtr()->getContainedAutoType();
5513           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5514                  "Could not find parameter packs or undeduced auto type!");
5515 #endif
5516         }
5517 
5518         if (ShouldExpand) {
5519           // Expand the function parameter pack into multiple, separate
5520           // parameters.
5521           getDerived().ExpandingFunctionParameterPack(OldParm);
5522           for (unsigned I = 0; I != *NumExpansions; ++I) {
5523             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5524             ParmVarDecl *NewParm
5525               = getDerived().TransformFunctionTypeParam(OldParm,
5526                                                         indexAdjustment++,
5527                                                         OrigNumExpansions,
5528                                                 /*ExpectParameterPack=*/false);
5529             if (!NewParm)
5530               return true;
5531 
5532             if (ParamInfos)
5533               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5534             OutParamTypes.push_back(NewParm->getType());
5535             if (PVars)
5536               PVars->push_back(NewParm);
5537           }
5538 
5539           // If we're supposed to retain a pack expansion, do so by temporarily
5540           // forgetting the partially-substituted parameter pack.
5541           if (RetainExpansion) {
5542             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5543             ParmVarDecl *NewParm
5544               = getDerived().TransformFunctionTypeParam(OldParm,
5545                                                         indexAdjustment++,
5546                                                         OrigNumExpansions,
5547                                                 /*ExpectParameterPack=*/false);
5548             if (!NewParm)
5549               return true;
5550 
5551             if (ParamInfos)
5552               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5553             OutParamTypes.push_back(NewParm->getType());
5554             if (PVars)
5555               PVars->push_back(NewParm);
5556           }
5557 
5558           // The next parameter should have the same adjustment as the
5559           // last thing we pushed, but we post-incremented indexAdjustment
5560           // on every push.  Also, if we push nothing, the adjustment should
5561           // go down by one.
5562           indexAdjustment--;
5563 
5564           // We're done with the pack expansion.
5565           continue;
5566         }
5567 
5568         // We'll substitute the parameter now without expanding the pack
5569         // expansion.
5570         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5571         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5572                                                           indexAdjustment,
5573                                                           NumExpansions,
5574                                                   /*ExpectParameterPack=*/true);
5575         assert(NewParm->isParameterPack() &&
5576                "Parameter pack no longer a parameter pack after "
5577                "transformation.");
5578       } else {
5579         NewParm = getDerived().TransformFunctionTypeParam(
5580             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5581       }
5582 
5583       if (!NewParm)
5584         return true;
5585 
5586       if (ParamInfos)
5587         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5588       OutParamTypes.push_back(NewParm->getType());
5589       if (PVars)
5590         PVars->push_back(NewParm);
5591       continue;
5592     }
5593 
5594     // Deal with the possibility that we don't have a parameter
5595     // declaration for this parameter.
5596     QualType OldType = ParamTypes[i];
5597     bool IsPackExpansion = false;
5598     Optional<unsigned> NumExpansions;
5599     QualType NewType;
5600     if (const PackExpansionType *Expansion
5601                                        = dyn_cast<PackExpansionType>(OldType)) {
5602       // We have a function parameter pack that may need to be expanded.
5603       QualType Pattern = Expansion->getPattern();
5604       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5605       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5606 
5607       // Determine whether we should expand the parameter packs.
5608       bool ShouldExpand = false;
5609       bool RetainExpansion = false;
5610       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5611                                                Unexpanded,
5612                                                ShouldExpand,
5613                                                RetainExpansion,
5614                                                NumExpansions)) {
5615         return true;
5616       }
5617 
5618       if (ShouldExpand) {
5619         // Expand the function parameter pack into multiple, separate
5620         // parameters.
5621         for (unsigned I = 0; I != *NumExpansions; ++I) {
5622           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5623           QualType NewType = getDerived().TransformType(Pattern);
5624           if (NewType.isNull())
5625             return true;
5626 
5627           if (NewType->containsUnexpandedParameterPack()) {
5628             NewType =
5629                 getSema().getASTContext().getPackExpansionType(NewType, None);
5630 
5631             if (NewType.isNull())
5632               return true;
5633           }
5634 
5635           if (ParamInfos)
5636             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5637           OutParamTypes.push_back(NewType);
5638           if (PVars)
5639             PVars->push_back(nullptr);
5640         }
5641 
5642         // We're done with the pack expansion.
5643         continue;
5644       }
5645 
5646       // If we're supposed to retain a pack expansion, do so by temporarily
5647       // forgetting the partially-substituted parameter pack.
5648       if (RetainExpansion) {
5649         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5650         QualType NewType = getDerived().TransformType(Pattern);
5651         if (NewType.isNull())
5652           return true;
5653 
5654         if (ParamInfos)
5655           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5656         OutParamTypes.push_back(NewType);
5657         if (PVars)
5658           PVars->push_back(nullptr);
5659       }
5660 
5661       // We'll substitute the parameter now without expanding the pack
5662       // expansion.
5663       OldType = Expansion->getPattern();
5664       IsPackExpansion = true;
5665       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5666       NewType = getDerived().TransformType(OldType);
5667     } else {
5668       NewType = getDerived().TransformType(OldType);
5669     }
5670 
5671     if (NewType.isNull())
5672       return true;
5673 
5674     if (IsPackExpansion)
5675       NewType = getSema().Context.getPackExpansionType(NewType,
5676                                                        NumExpansions);
5677 
5678     if (ParamInfos)
5679       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5680     OutParamTypes.push_back(NewType);
5681     if (PVars)
5682       PVars->push_back(nullptr);
5683   }
5684 
5685 #ifndef NDEBUG
5686   if (PVars) {
5687     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5688       if (ParmVarDecl *parm = (*PVars)[i])
5689         assert(parm->getFunctionScopeIndex() == i);
5690   }
5691 #endif
5692 
5693   return false;
5694 }
5695 
5696 template<typename Derived>
5697 QualType
5698 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5699                                                    FunctionProtoTypeLoc TL) {
5700   SmallVector<QualType, 4> ExceptionStorage;
5701   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5702   return getDerived().TransformFunctionProtoType(
5703       TLB, TL, nullptr, Qualifiers(),
5704       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5705         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5706                                             ExceptionStorage, Changed);
5707       });
5708 }
5709 
5710 template<typename Derived> template<typename Fn>
5711 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5712     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5713     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5714 
5715   // Transform the parameters and return type.
5716   //
5717   // We are required to instantiate the params and return type in source order.
5718   // When the function has a trailing return type, we instantiate the
5719   // parameters before the return type,  since the return type can then refer
5720   // to the parameters themselves (via decltype, sizeof, etc.).
5721   //
5722   SmallVector<QualType, 4> ParamTypes;
5723   SmallVector<ParmVarDecl*, 4> ParamDecls;
5724   Sema::ExtParameterInfoBuilder ExtParamInfos;
5725   const FunctionProtoType *T = TL.getTypePtr();
5726 
5727   QualType ResultType;
5728 
5729   if (T->hasTrailingReturn()) {
5730     if (getDerived().TransformFunctionTypeParams(
5731             TL.getBeginLoc(), TL.getParams(),
5732             TL.getTypePtr()->param_type_begin(),
5733             T->getExtParameterInfosOrNull(),
5734             ParamTypes, &ParamDecls, ExtParamInfos))
5735       return QualType();
5736 
5737     {
5738       // C++11 [expr.prim.general]p3:
5739       //   If a declaration declares a member function or member function
5740       //   template of a class X, the expression this is a prvalue of type
5741       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5742       //   and the end of the function-definition, member-declarator, or
5743       //   declarator.
5744       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5745 
5746       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5747       if (ResultType.isNull())
5748         return QualType();
5749     }
5750   }
5751   else {
5752     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5753     if (ResultType.isNull())
5754       return QualType();
5755 
5756     if (getDerived().TransformFunctionTypeParams(
5757             TL.getBeginLoc(), TL.getParams(),
5758             TL.getTypePtr()->param_type_begin(),
5759             T->getExtParameterInfosOrNull(),
5760             ParamTypes, &ParamDecls, ExtParamInfos))
5761       return QualType();
5762   }
5763 
5764   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5765 
5766   bool EPIChanged = false;
5767   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5768     return QualType();
5769 
5770   // Handle extended parameter information.
5771   if (auto NewExtParamInfos =
5772         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5773     if (!EPI.ExtParameterInfos ||
5774         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5775           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5776       EPIChanged = true;
5777     }
5778     EPI.ExtParameterInfos = NewExtParamInfos;
5779   } else if (EPI.ExtParameterInfos) {
5780     EPIChanged = true;
5781     EPI.ExtParameterInfos = nullptr;
5782   }
5783 
5784   QualType Result = TL.getType();
5785   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5786       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5787     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5788     if (Result.isNull())
5789       return QualType();
5790   }
5791 
5792   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5793   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5794   NewTL.setLParenLoc(TL.getLParenLoc());
5795   NewTL.setRParenLoc(TL.getRParenLoc());
5796   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5797   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5798   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5799     NewTL.setParam(i, ParamDecls[i]);
5800 
5801   return Result;
5802 }
5803 
5804 template<typename Derived>
5805 bool TreeTransform<Derived>::TransformExceptionSpec(
5806     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5807     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5808   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5809 
5810   // Instantiate a dynamic noexcept expression, if any.
5811   if (isComputedNoexcept(ESI.Type)) {
5812     EnterExpressionEvaluationContext Unevaluated(
5813         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5814     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5815     if (NoexceptExpr.isInvalid())
5816       return true;
5817 
5818     ExceptionSpecificationType EST = ESI.Type;
5819     NoexceptExpr =
5820         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5821     if (NoexceptExpr.isInvalid())
5822       return true;
5823 
5824     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5825       Changed = true;
5826     ESI.NoexceptExpr = NoexceptExpr.get();
5827     ESI.Type = EST;
5828   }
5829 
5830   if (ESI.Type != EST_Dynamic)
5831     return false;
5832 
5833   // Instantiate a dynamic exception specification's type.
5834   for (QualType T : ESI.Exceptions) {
5835     if (const PackExpansionType *PackExpansion =
5836             T->getAs<PackExpansionType>()) {
5837       Changed = true;
5838 
5839       // We have a pack expansion. Instantiate it.
5840       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5841       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5842                                               Unexpanded);
5843       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5844 
5845       // Determine whether the set of unexpanded parameter packs can and
5846       // should
5847       // be expanded.
5848       bool Expand = false;
5849       bool RetainExpansion = false;
5850       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5851       // FIXME: Track the location of the ellipsis (and track source location
5852       // information for the types in the exception specification in general).
5853       if (getDerived().TryExpandParameterPacks(
5854               Loc, SourceRange(), Unexpanded, Expand,
5855               RetainExpansion, NumExpansions))
5856         return true;
5857 
5858       if (!Expand) {
5859         // We can't expand this pack expansion into separate arguments yet;
5860         // just substitute into the pattern and create a new pack expansion
5861         // type.
5862         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5863         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5864         if (U.isNull())
5865           return true;
5866 
5867         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5868         Exceptions.push_back(U);
5869         continue;
5870       }
5871 
5872       // Substitute into the pack expansion pattern for each slice of the
5873       // pack.
5874       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5875         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5876 
5877         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5878         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5879           return true;
5880 
5881         Exceptions.push_back(U);
5882       }
5883     } else {
5884       QualType U = getDerived().TransformType(T);
5885       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5886         return true;
5887       if (T != U)
5888         Changed = true;
5889 
5890       Exceptions.push_back(U);
5891     }
5892   }
5893 
5894   ESI.Exceptions = Exceptions;
5895   if (ESI.Exceptions.empty())
5896     ESI.Type = EST_DynamicNone;
5897   return false;
5898 }
5899 
5900 template<typename Derived>
5901 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5902                                                  TypeLocBuilder &TLB,
5903                                                  FunctionNoProtoTypeLoc TL) {
5904   const FunctionNoProtoType *T = TL.getTypePtr();
5905   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5906   if (ResultType.isNull())
5907     return QualType();
5908 
5909   QualType Result = TL.getType();
5910   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5911     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5912 
5913   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5914   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5915   NewTL.setLParenLoc(TL.getLParenLoc());
5916   NewTL.setRParenLoc(TL.getRParenLoc());
5917   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5918 
5919   return Result;
5920 }
5921 
5922 template<typename Derived> QualType
5923 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5924                                                  UnresolvedUsingTypeLoc TL) {
5925   const UnresolvedUsingType *T = TL.getTypePtr();
5926   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5927   if (!D)
5928     return QualType();
5929 
5930   QualType Result = TL.getType();
5931   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5932     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5933     if (Result.isNull())
5934       return QualType();
5935   }
5936 
5937   // We might get an arbitrary type spec type back.  We should at
5938   // least always get a type spec type, though.
5939   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5940   NewTL.setNameLoc(TL.getNameLoc());
5941 
5942   return Result;
5943 }
5944 
5945 template<typename Derived>
5946 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5947                                                       TypedefTypeLoc TL) {
5948   const TypedefType *T = TL.getTypePtr();
5949   TypedefNameDecl *Typedef
5950     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5951                                                                T->getDecl()));
5952   if (!Typedef)
5953     return QualType();
5954 
5955   QualType Result = TL.getType();
5956   if (getDerived().AlwaysRebuild() ||
5957       Typedef != T->getDecl()) {
5958     Result = getDerived().RebuildTypedefType(Typedef);
5959     if (Result.isNull())
5960       return QualType();
5961   }
5962 
5963   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5964   NewTL.setNameLoc(TL.getNameLoc());
5965 
5966   return Result;
5967 }
5968 
5969 template<typename Derived>
5970 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5971                                                       TypeOfExprTypeLoc TL) {
5972   // typeof expressions are not potentially evaluated contexts
5973   EnterExpressionEvaluationContext Unevaluated(
5974       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5975       Sema::ReuseLambdaContextDecl);
5976 
5977   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5978   if (E.isInvalid())
5979     return QualType();
5980 
5981   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5982   if (E.isInvalid())
5983     return QualType();
5984 
5985   QualType Result = TL.getType();
5986   if (getDerived().AlwaysRebuild() ||
5987       E.get() != TL.getUnderlyingExpr()) {
5988     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5989     if (Result.isNull())
5990       return QualType();
5991   }
5992   else E.get();
5993 
5994   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5995   NewTL.setTypeofLoc(TL.getTypeofLoc());
5996   NewTL.setLParenLoc(TL.getLParenLoc());
5997   NewTL.setRParenLoc(TL.getRParenLoc());
5998 
5999   return Result;
6000 }
6001 
6002 template<typename Derived>
6003 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6004                                                      TypeOfTypeLoc TL) {
6005   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6006   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6007   if (!New_Under_TI)
6008     return QualType();
6009 
6010   QualType Result = TL.getType();
6011   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6012     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6013     if (Result.isNull())
6014       return QualType();
6015   }
6016 
6017   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6018   NewTL.setTypeofLoc(TL.getTypeofLoc());
6019   NewTL.setLParenLoc(TL.getLParenLoc());
6020   NewTL.setRParenLoc(TL.getRParenLoc());
6021   NewTL.setUnderlyingTInfo(New_Under_TI);
6022 
6023   return Result;
6024 }
6025 
6026 template<typename Derived>
6027 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6028                                                        DecltypeTypeLoc TL) {
6029   const DecltypeType *T = TL.getTypePtr();
6030 
6031   // decltype expressions are not potentially evaluated contexts
6032   EnterExpressionEvaluationContext Unevaluated(
6033       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6034       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6035 
6036   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6037   if (E.isInvalid())
6038     return QualType();
6039 
6040   E = getSema().ActOnDecltypeExpression(E.get());
6041   if (E.isInvalid())
6042     return QualType();
6043 
6044   QualType Result = TL.getType();
6045   if (getDerived().AlwaysRebuild() ||
6046       E.get() != T->getUnderlyingExpr()) {
6047     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6048     if (Result.isNull())
6049       return QualType();
6050   }
6051   else E.get();
6052 
6053   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6054   NewTL.setNameLoc(TL.getNameLoc());
6055 
6056   return Result;
6057 }
6058 
6059 template<typename Derived>
6060 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6061                                                             TypeLocBuilder &TLB,
6062                                                      UnaryTransformTypeLoc TL) {
6063   QualType Result = TL.getType();
6064   if (Result->isDependentType()) {
6065     const UnaryTransformType *T = TL.getTypePtr();
6066     QualType NewBase =
6067       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6068     Result = getDerived().RebuildUnaryTransformType(NewBase,
6069                                                     T->getUTTKind(),
6070                                                     TL.getKWLoc());
6071     if (Result.isNull())
6072       return QualType();
6073   }
6074 
6075   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6076   NewTL.setKWLoc(TL.getKWLoc());
6077   NewTL.setParensRange(TL.getParensRange());
6078   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6079   return Result;
6080 }
6081 
6082 template<typename Derived>
6083 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6084     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6085   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6086 
6087   CXXScopeSpec SS;
6088   TemplateName TemplateName = getDerived().TransformTemplateName(
6089       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6090   if (TemplateName.isNull())
6091     return QualType();
6092 
6093   QualType OldDeduced = T->getDeducedType();
6094   QualType NewDeduced;
6095   if (!OldDeduced.isNull()) {
6096     NewDeduced = getDerived().TransformType(OldDeduced);
6097     if (NewDeduced.isNull())
6098       return QualType();
6099   }
6100 
6101   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6102       TemplateName, NewDeduced);
6103   if (Result.isNull())
6104     return QualType();
6105 
6106   DeducedTemplateSpecializationTypeLoc NewTL =
6107       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6108   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6109 
6110   return Result;
6111 }
6112 
6113 template<typename Derived>
6114 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6115                                                      RecordTypeLoc TL) {
6116   const RecordType *T = TL.getTypePtr();
6117   RecordDecl *Record
6118     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6119                                                           T->getDecl()));
6120   if (!Record)
6121     return QualType();
6122 
6123   QualType Result = TL.getType();
6124   if (getDerived().AlwaysRebuild() ||
6125       Record != T->getDecl()) {
6126     Result = getDerived().RebuildRecordType(Record);
6127     if (Result.isNull())
6128       return QualType();
6129   }
6130 
6131   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6132   NewTL.setNameLoc(TL.getNameLoc());
6133 
6134   return Result;
6135 }
6136 
6137 template<typename Derived>
6138 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6139                                                    EnumTypeLoc TL) {
6140   const EnumType *T = TL.getTypePtr();
6141   EnumDecl *Enum
6142     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6143                                                         T->getDecl()));
6144   if (!Enum)
6145     return QualType();
6146 
6147   QualType Result = TL.getType();
6148   if (getDerived().AlwaysRebuild() ||
6149       Enum != T->getDecl()) {
6150     Result = getDerived().RebuildEnumType(Enum);
6151     if (Result.isNull())
6152       return QualType();
6153   }
6154 
6155   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6156   NewTL.setNameLoc(TL.getNameLoc());
6157 
6158   return Result;
6159 }
6160 
6161 template<typename Derived>
6162 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6163                                          TypeLocBuilder &TLB,
6164                                          InjectedClassNameTypeLoc TL) {
6165   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6166                                        TL.getTypePtr()->getDecl());
6167   if (!D) return QualType();
6168 
6169   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6170   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6171   return T;
6172 }
6173 
6174 template<typename Derived>
6175 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6176                                                 TypeLocBuilder &TLB,
6177                                                 TemplateTypeParmTypeLoc TL) {
6178   return TransformTypeSpecType(TLB, TL);
6179 }
6180 
6181 template<typename Derived>
6182 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6183                                          TypeLocBuilder &TLB,
6184                                          SubstTemplateTypeParmTypeLoc TL) {
6185   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6186 
6187   // Substitute into the replacement type, which itself might involve something
6188   // that needs to be transformed. This only tends to occur with default
6189   // template arguments of template template parameters.
6190   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6191   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6192   if (Replacement.isNull())
6193     return QualType();
6194 
6195   // Always canonicalize the replacement type.
6196   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6197   QualType Result
6198     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6199                                                    Replacement);
6200 
6201   // Propagate type-source information.
6202   SubstTemplateTypeParmTypeLoc NewTL
6203     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6204   NewTL.setNameLoc(TL.getNameLoc());
6205   return Result;
6206 
6207 }
6208 
6209 template<typename Derived>
6210 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6211                                           TypeLocBuilder &TLB,
6212                                           SubstTemplateTypeParmPackTypeLoc TL) {
6213   return TransformTypeSpecType(TLB, TL);
6214 }
6215 
6216 template<typename Derived>
6217 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6218                                                         TypeLocBuilder &TLB,
6219                                            TemplateSpecializationTypeLoc TL) {
6220   const TemplateSpecializationType *T = TL.getTypePtr();
6221 
6222   // The nested-name-specifier never matters in a TemplateSpecializationType,
6223   // because we can't have a dependent nested-name-specifier anyway.
6224   CXXScopeSpec SS;
6225   TemplateName Template
6226     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6227                                          TL.getTemplateNameLoc());
6228   if (Template.isNull())
6229     return QualType();
6230 
6231   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6232 }
6233 
6234 template<typename Derived>
6235 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6236                                                      AtomicTypeLoc TL) {
6237   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6238   if (ValueType.isNull())
6239     return QualType();
6240 
6241   QualType Result = TL.getType();
6242   if (getDerived().AlwaysRebuild() ||
6243       ValueType != TL.getValueLoc().getType()) {
6244     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6245     if (Result.isNull())
6246       return QualType();
6247   }
6248 
6249   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6250   NewTL.setKWLoc(TL.getKWLoc());
6251   NewTL.setLParenLoc(TL.getLParenLoc());
6252   NewTL.setRParenLoc(TL.getRParenLoc());
6253 
6254   return Result;
6255 }
6256 
6257 template <typename Derived>
6258 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6259                                                    PipeTypeLoc TL) {
6260   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6261   if (ValueType.isNull())
6262     return QualType();
6263 
6264   QualType Result = TL.getType();
6265   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6266     const PipeType *PT = Result->castAs<PipeType>();
6267     bool isReadPipe = PT->isReadOnly();
6268     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6269     if (Result.isNull())
6270       return QualType();
6271   }
6272 
6273   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6274   NewTL.setKWLoc(TL.getKWLoc());
6275 
6276   return Result;
6277 }
6278 
6279 template <typename Derived>
6280 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6281                                                      ExtIntTypeLoc TL) {
6282   const ExtIntType *EIT = TL.getTypePtr();
6283   QualType Result = TL.getType();
6284 
6285   if (getDerived().AlwaysRebuild()) {
6286     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6287                                             EIT->getNumBits(), TL.getNameLoc());
6288     if (Result.isNull())
6289       return QualType();
6290   }
6291 
6292   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6293   NewTL.setNameLoc(TL.getNameLoc());
6294   return Result;
6295 }
6296 
6297 template <typename Derived>
6298 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6299     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6300   const DependentExtIntType *EIT = TL.getTypePtr();
6301 
6302   EnterExpressionEvaluationContext Unevaluated(
6303       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6304   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6305   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6306 
6307   if (BitsExpr.isInvalid())
6308     return QualType();
6309 
6310   QualType Result = TL.getType();
6311 
6312   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6313     Result = getDerived().RebuildDependentExtIntType(
6314         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6315 
6316     if (Result.isNull())
6317       return QualType();
6318   }
6319 
6320   if (isa<DependentExtIntType>(Result)) {
6321     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6322     NewTL.setNameLoc(TL.getNameLoc());
6323   } else {
6324     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6325     NewTL.setNameLoc(TL.getNameLoc());
6326   }
6327   return Result;
6328 }
6329 
6330   /// Simple iterator that traverses the template arguments in a
6331   /// container that provides a \c getArgLoc() member function.
6332   ///
6333   /// This iterator is intended to be used with the iterator form of
6334   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6335   template<typename ArgLocContainer>
6336   class TemplateArgumentLocContainerIterator {
6337     ArgLocContainer *Container;
6338     unsigned Index;
6339 
6340   public:
6341     typedef TemplateArgumentLoc value_type;
6342     typedef TemplateArgumentLoc reference;
6343     typedef int difference_type;
6344     typedef std::input_iterator_tag iterator_category;
6345 
6346     class pointer {
6347       TemplateArgumentLoc Arg;
6348 
6349     public:
6350       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6351 
6352       const TemplateArgumentLoc *operator->() const {
6353         return &Arg;
6354       }
6355     };
6356 
6357 
6358     TemplateArgumentLocContainerIterator() {}
6359 
6360     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6361                                  unsigned Index)
6362       : Container(&Container), Index(Index) { }
6363 
6364     TemplateArgumentLocContainerIterator &operator++() {
6365       ++Index;
6366       return *this;
6367     }
6368 
6369     TemplateArgumentLocContainerIterator operator++(int) {
6370       TemplateArgumentLocContainerIterator Old(*this);
6371       ++(*this);
6372       return Old;
6373     }
6374 
6375     TemplateArgumentLoc operator*() const {
6376       return Container->getArgLoc(Index);
6377     }
6378 
6379     pointer operator->() const {
6380       return pointer(Container->getArgLoc(Index));
6381     }
6382 
6383     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6384                            const TemplateArgumentLocContainerIterator &Y) {
6385       return X.Container == Y.Container && X.Index == Y.Index;
6386     }
6387 
6388     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6389                            const TemplateArgumentLocContainerIterator &Y) {
6390       return !(X == Y);
6391     }
6392   };
6393 
6394 template<typename Derived>
6395 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6396                                                    AutoTypeLoc TL) {
6397   const AutoType *T = TL.getTypePtr();
6398   QualType OldDeduced = T->getDeducedType();
6399   QualType NewDeduced;
6400   if (!OldDeduced.isNull()) {
6401     NewDeduced = getDerived().TransformType(OldDeduced);
6402     if (NewDeduced.isNull())
6403       return QualType();
6404   }
6405 
6406   ConceptDecl *NewCD = nullptr;
6407   TemplateArgumentListInfo NewTemplateArgs;
6408   NestedNameSpecifierLoc NewNestedNameSpec;
6409   if (TL.getTypePtr()->isConstrained()) {
6410     NewCD = cast_or_null<ConceptDecl>(
6411         getDerived().TransformDecl(
6412             TL.getConceptNameLoc(),
6413             TL.getTypePtr()->getTypeConstraintConcept()));
6414 
6415     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6416     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6417     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6418     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6419                                                 ArgIterator(TL,
6420                                                             TL.getNumArgs()),
6421                                                 NewTemplateArgs))
6422       return QualType();
6423 
6424     if (TL.getNestedNameSpecifierLoc()) {
6425       NewNestedNameSpec
6426         = getDerived().TransformNestedNameSpecifierLoc(
6427             TL.getNestedNameSpecifierLoc());
6428       if (!NewNestedNameSpec)
6429         return QualType();
6430     }
6431   }
6432 
6433   QualType Result = TL.getType();
6434   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6435       T->isDependentType()) {
6436     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6437     NewArgList.reserve(NewArgList.size());
6438     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6439       NewArgList.push_back(ArgLoc.getArgument());
6440     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6441                                           NewArgList);
6442     if (Result.isNull())
6443       return QualType();
6444   }
6445 
6446   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6447   NewTL.setNameLoc(TL.getNameLoc());
6448   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6449   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6450   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6451   NewTL.setFoundDecl(TL.getFoundDecl());
6452   NewTL.setLAngleLoc(TL.getLAngleLoc());
6453   NewTL.setRAngleLoc(TL.getRAngleLoc());
6454   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6455     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6456 
6457   return Result;
6458 }
6459 
6460 template <typename Derived>
6461 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6462                                                         TypeLocBuilder &TLB,
6463                                            TemplateSpecializationTypeLoc TL,
6464                                                       TemplateName Template) {
6465   TemplateArgumentListInfo NewTemplateArgs;
6466   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6467   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6468   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6469     ArgIterator;
6470   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6471                                               ArgIterator(TL, TL.getNumArgs()),
6472                                               NewTemplateArgs))
6473     return QualType();
6474 
6475   // FIXME: maybe don't rebuild if all the template arguments are the same.
6476 
6477   QualType Result =
6478     getDerived().RebuildTemplateSpecializationType(Template,
6479                                                    TL.getTemplateNameLoc(),
6480                                                    NewTemplateArgs);
6481 
6482   if (!Result.isNull()) {
6483     // Specializations of template template parameters are represented as
6484     // TemplateSpecializationTypes, and substitution of type alias templates
6485     // within a dependent context can transform them into
6486     // DependentTemplateSpecializationTypes.
6487     if (isa<DependentTemplateSpecializationType>(Result)) {
6488       DependentTemplateSpecializationTypeLoc NewTL
6489         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6490       NewTL.setElaboratedKeywordLoc(SourceLocation());
6491       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6492       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6493       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6494       NewTL.setLAngleLoc(TL.getLAngleLoc());
6495       NewTL.setRAngleLoc(TL.getRAngleLoc());
6496       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6497         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6498       return Result;
6499     }
6500 
6501     TemplateSpecializationTypeLoc NewTL
6502       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6503     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6504     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6505     NewTL.setLAngleLoc(TL.getLAngleLoc());
6506     NewTL.setRAngleLoc(TL.getRAngleLoc());
6507     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6508       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6509   }
6510 
6511   return Result;
6512 }
6513 
6514 template <typename Derived>
6515 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6516                                      TypeLocBuilder &TLB,
6517                                      DependentTemplateSpecializationTypeLoc TL,
6518                                      TemplateName Template,
6519                                      CXXScopeSpec &SS) {
6520   TemplateArgumentListInfo NewTemplateArgs;
6521   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6522   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6523   typedef TemplateArgumentLocContainerIterator<
6524             DependentTemplateSpecializationTypeLoc> ArgIterator;
6525   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6526                                               ArgIterator(TL, TL.getNumArgs()),
6527                                               NewTemplateArgs))
6528     return QualType();
6529 
6530   // FIXME: maybe don't rebuild if all the template arguments are the same.
6531 
6532   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6533     QualType Result
6534       = getSema().Context.getDependentTemplateSpecializationType(
6535                                                 TL.getTypePtr()->getKeyword(),
6536                                                          DTN->getQualifier(),
6537                                                          DTN->getIdentifier(),
6538                                                                NewTemplateArgs);
6539 
6540     DependentTemplateSpecializationTypeLoc NewTL
6541       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6542     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6543     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6544     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6545     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6546     NewTL.setLAngleLoc(TL.getLAngleLoc());
6547     NewTL.setRAngleLoc(TL.getRAngleLoc());
6548     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6549       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6550     return Result;
6551   }
6552 
6553   QualType Result
6554     = getDerived().RebuildTemplateSpecializationType(Template,
6555                                                      TL.getTemplateNameLoc(),
6556                                                      NewTemplateArgs);
6557 
6558   if (!Result.isNull()) {
6559     /// FIXME: Wrap this in an elaborated-type-specifier?
6560     TemplateSpecializationTypeLoc NewTL
6561       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6562     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6563     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6564     NewTL.setLAngleLoc(TL.getLAngleLoc());
6565     NewTL.setRAngleLoc(TL.getRAngleLoc());
6566     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6567       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6568   }
6569 
6570   return Result;
6571 }
6572 
6573 template<typename Derived>
6574 QualType
6575 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6576                                                 ElaboratedTypeLoc TL) {
6577   const ElaboratedType *T = TL.getTypePtr();
6578 
6579   NestedNameSpecifierLoc QualifierLoc;
6580   // NOTE: the qualifier in an ElaboratedType is optional.
6581   if (TL.getQualifierLoc()) {
6582     QualifierLoc
6583       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6584     if (!QualifierLoc)
6585       return QualType();
6586   }
6587 
6588   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6589   if (NamedT.isNull())
6590     return QualType();
6591 
6592   // C++0x [dcl.type.elab]p2:
6593   //   If the identifier resolves to a typedef-name or the simple-template-id
6594   //   resolves to an alias template specialization, the
6595   //   elaborated-type-specifier is ill-formed.
6596   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6597     if (const TemplateSpecializationType *TST =
6598           NamedT->getAs<TemplateSpecializationType>()) {
6599       TemplateName Template = TST->getTemplateName();
6600       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6601               Template.getAsTemplateDecl())) {
6602         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6603                      diag::err_tag_reference_non_tag)
6604             << TAT << Sema::NTK_TypeAliasTemplate
6605             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6606         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6607       }
6608     }
6609   }
6610 
6611   QualType Result = TL.getType();
6612   if (getDerived().AlwaysRebuild() ||
6613       QualifierLoc != TL.getQualifierLoc() ||
6614       NamedT != T->getNamedType()) {
6615     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6616                                                 T->getKeyword(),
6617                                                 QualifierLoc, NamedT);
6618     if (Result.isNull())
6619       return QualType();
6620   }
6621 
6622   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6623   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6624   NewTL.setQualifierLoc(QualifierLoc);
6625   return Result;
6626 }
6627 
6628 template<typename Derived>
6629 QualType TreeTransform<Derived>::TransformAttributedType(
6630                                                 TypeLocBuilder &TLB,
6631                                                 AttributedTypeLoc TL) {
6632   const AttributedType *oldType = TL.getTypePtr();
6633   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6634   if (modifiedType.isNull())
6635     return QualType();
6636 
6637   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6638   const Attr *oldAttr = TL.getAttr();
6639   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6640   if (oldAttr && !newAttr)
6641     return QualType();
6642 
6643   QualType result = TL.getType();
6644 
6645   // FIXME: dependent operand expressions?
6646   if (getDerived().AlwaysRebuild() ||
6647       modifiedType != oldType->getModifiedType()) {
6648     // TODO: this is really lame; we should really be rebuilding the
6649     // equivalent type from first principles.
6650     QualType equivalentType
6651       = getDerived().TransformType(oldType->getEquivalentType());
6652     if (equivalentType.isNull())
6653       return QualType();
6654 
6655     // Check whether we can add nullability; it is only represented as
6656     // type sugar, and therefore cannot be diagnosed in any other way.
6657     if (auto nullability = oldType->getImmediateNullability()) {
6658       if (!modifiedType->canHaveNullability()) {
6659         SemaRef.Diag(TL.getAttr()->getLocation(),
6660                      diag::err_nullability_nonpointer)
6661             << DiagNullabilityKind(*nullability, false) << modifiedType;
6662         return QualType();
6663       }
6664     }
6665 
6666     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6667                                                modifiedType,
6668                                                equivalentType);
6669   }
6670 
6671   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6672   newTL.setAttr(newAttr);
6673   return result;
6674 }
6675 
6676 template<typename Derived>
6677 QualType
6678 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6679                                            ParenTypeLoc TL) {
6680   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6681   if (Inner.isNull())
6682     return QualType();
6683 
6684   QualType Result = TL.getType();
6685   if (getDerived().AlwaysRebuild() ||
6686       Inner != TL.getInnerLoc().getType()) {
6687     Result = getDerived().RebuildParenType(Inner);
6688     if (Result.isNull())
6689       return QualType();
6690   }
6691 
6692   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6693   NewTL.setLParenLoc(TL.getLParenLoc());
6694   NewTL.setRParenLoc(TL.getRParenLoc());
6695   return Result;
6696 }
6697 
6698 template <typename Derived>
6699 QualType
6700 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6701                                                     MacroQualifiedTypeLoc TL) {
6702   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6703   if (Inner.isNull())
6704     return QualType();
6705 
6706   QualType Result = TL.getType();
6707   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6708     Result =
6709         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6710     if (Result.isNull())
6711       return QualType();
6712   }
6713 
6714   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6715   NewTL.setExpansionLoc(TL.getExpansionLoc());
6716   return Result;
6717 }
6718 
6719 template<typename Derived>
6720 QualType TreeTransform<Derived>::TransformDependentNameType(
6721     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6722   return TransformDependentNameType(TLB, TL, false);
6723 }
6724 
6725 template<typename Derived>
6726 QualType TreeTransform<Derived>::TransformDependentNameType(
6727     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6728   const DependentNameType *T = TL.getTypePtr();
6729 
6730   NestedNameSpecifierLoc QualifierLoc
6731     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6732   if (!QualifierLoc)
6733     return QualType();
6734 
6735   QualType Result
6736     = getDerived().RebuildDependentNameType(T->getKeyword(),
6737                                             TL.getElaboratedKeywordLoc(),
6738                                             QualifierLoc,
6739                                             T->getIdentifier(),
6740                                             TL.getNameLoc(),
6741                                             DeducedTSTContext);
6742   if (Result.isNull())
6743     return QualType();
6744 
6745   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6746     QualType NamedT = ElabT->getNamedType();
6747     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6748 
6749     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6750     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6751     NewTL.setQualifierLoc(QualifierLoc);
6752   } else {
6753     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6754     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6755     NewTL.setQualifierLoc(QualifierLoc);
6756     NewTL.setNameLoc(TL.getNameLoc());
6757   }
6758   return Result;
6759 }
6760 
6761 template<typename Derived>
6762 QualType TreeTransform<Derived>::
6763           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6764                                  DependentTemplateSpecializationTypeLoc TL) {
6765   NestedNameSpecifierLoc QualifierLoc;
6766   if (TL.getQualifierLoc()) {
6767     QualifierLoc
6768       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6769     if (!QualifierLoc)
6770       return QualType();
6771   }
6772 
6773   return getDerived()
6774            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6775 }
6776 
6777 template<typename Derived>
6778 QualType TreeTransform<Derived>::
6779 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6780                                    DependentTemplateSpecializationTypeLoc TL,
6781                                        NestedNameSpecifierLoc QualifierLoc) {
6782   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6783 
6784   TemplateArgumentListInfo NewTemplateArgs;
6785   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6786   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6787 
6788   typedef TemplateArgumentLocContainerIterator<
6789   DependentTemplateSpecializationTypeLoc> ArgIterator;
6790   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6791                                               ArgIterator(TL, TL.getNumArgs()),
6792                                               NewTemplateArgs))
6793     return QualType();
6794 
6795   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6796       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6797       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6798       /*AllowInjectedClassName*/ false);
6799   if (Result.isNull())
6800     return QualType();
6801 
6802   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6803     QualType NamedT = ElabT->getNamedType();
6804 
6805     // Copy information relevant to the template specialization.
6806     TemplateSpecializationTypeLoc NamedTL
6807       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6808     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6809     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6810     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6811     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6812     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6813       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6814 
6815     // Copy information relevant to the elaborated type.
6816     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6817     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6818     NewTL.setQualifierLoc(QualifierLoc);
6819   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6820     DependentTemplateSpecializationTypeLoc SpecTL
6821       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6822     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6823     SpecTL.setQualifierLoc(QualifierLoc);
6824     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6825     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6826     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6827     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6828     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6829       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6830   } else {
6831     TemplateSpecializationTypeLoc SpecTL
6832       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6833     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6834     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6835     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6836     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6837     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6838       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6839   }
6840   return Result;
6841 }
6842 
6843 template<typename Derived>
6844 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6845                                                       PackExpansionTypeLoc TL) {
6846   QualType Pattern
6847     = getDerived().TransformType(TLB, TL.getPatternLoc());
6848   if (Pattern.isNull())
6849     return QualType();
6850 
6851   QualType Result = TL.getType();
6852   if (getDerived().AlwaysRebuild() ||
6853       Pattern != TL.getPatternLoc().getType()) {
6854     Result = getDerived().RebuildPackExpansionType(Pattern,
6855                                            TL.getPatternLoc().getSourceRange(),
6856                                                    TL.getEllipsisLoc(),
6857                                            TL.getTypePtr()->getNumExpansions());
6858     if (Result.isNull())
6859       return QualType();
6860   }
6861 
6862   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6863   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6864   return Result;
6865 }
6866 
6867 template<typename Derived>
6868 QualType
6869 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6870                                                    ObjCInterfaceTypeLoc TL) {
6871   // ObjCInterfaceType is never dependent.
6872   TLB.pushFullCopy(TL);
6873   return TL.getType();
6874 }
6875 
6876 template<typename Derived>
6877 QualType
6878 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6879                                                    ObjCTypeParamTypeLoc TL) {
6880   const ObjCTypeParamType *T = TL.getTypePtr();
6881   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6882       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6883   if (!OTP)
6884     return QualType();
6885 
6886   QualType Result = TL.getType();
6887   if (getDerived().AlwaysRebuild() ||
6888       OTP != T->getDecl()) {
6889     Result = getDerived().RebuildObjCTypeParamType(OTP,
6890                  TL.getProtocolLAngleLoc(),
6891                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6892                                     TL.getNumProtocols()),
6893                  TL.getProtocolLocs(),
6894                  TL.getProtocolRAngleLoc());
6895     if (Result.isNull())
6896       return QualType();
6897   }
6898 
6899   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6900   if (TL.getNumProtocols()) {
6901     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6902     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6903       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6904     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6905   }
6906   return Result;
6907 }
6908 
6909 template<typename Derived>
6910 QualType
6911 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6912                                                 ObjCObjectTypeLoc TL) {
6913   // Transform base type.
6914   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6915   if (BaseType.isNull())
6916     return QualType();
6917 
6918   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6919 
6920   // Transform type arguments.
6921   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6922   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6923     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6924     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6925     QualType TypeArg = TypeArgInfo->getType();
6926     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6927       AnyChanged = true;
6928 
6929       // We have a pack expansion. Instantiate it.
6930       const auto *PackExpansion = PackExpansionLoc.getType()
6931                                     ->castAs<PackExpansionType>();
6932       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6933       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6934                                               Unexpanded);
6935       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6936 
6937       // Determine whether the set of unexpanded parameter packs can
6938       // and should be expanded.
6939       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6940       bool Expand = false;
6941       bool RetainExpansion = false;
6942       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6943       if (getDerived().TryExpandParameterPacks(
6944             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6945             Unexpanded, Expand, RetainExpansion, NumExpansions))
6946         return QualType();
6947 
6948       if (!Expand) {
6949         // We can't expand this pack expansion into separate arguments yet;
6950         // just substitute into the pattern and create a new pack expansion
6951         // type.
6952         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6953 
6954         TypeLocBuilder TypeArgBuilder;
6955         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6956         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6957                                                              PatternLoc);
6958         if (NewPatternType.isNull())
6959           return QualType();
6960 
6961         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6962                                       NewPatternType, NumExpansions);
6963         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6964         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6965         NewTypeArgInfos.push_back(
6966           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6967         continue;
6968       }
6969 
6970       // Substitute into the pack expansion pattern for each slice of the
6971       // pack.
6972       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6973         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6974 
6975         TypeLocBuilder TypeArgBuilder;
6976         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6977 
6978         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6979                                                          PatternLoc);
6980         if (NewTypeArg.isNull())
6981           return QualType();
6982 
6983         NewTypeArgInfos.push_back(
6984           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6985       }
6986 
6987       continue;
6988     }
6989 
6990     TypeLocBuilder TypeArgBuilder;
6991     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6992     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6993     if (NewTypeArg.isNull())
6994       return QualType();
6995 
6996     // If nothing changed, just keep the old TypeSourceInfo.
6997     if (NewTypeArg == TypeArg) {
6998       NewTypeArgInfos.push_back(TypeArgInfo);
6999       continue;
7000     }
7001 
7002     NewTypeArgInfos.push_back(
7003       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7004     AnyChanged = true;
7005   }
7006 
7007   QualType Result = TL.getType();
7008   if (getDerived().AlwaysRebuild() || AnyChanged) {
7009     // Rebuild the type.
7010     Result = getDerived().RebuildObjCObjectType(
7011         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7012         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7013         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7014         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7015 
7016     if (Result.isNull())
7017       return QualType();
7018   }
7019 
7020   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7021   NewT.setHasBaseTypeAsWritten(true);
7022   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7023   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7024     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7025   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7026   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7027   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7028     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7029   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7030   return Result;
7031 }
7032 
7033 template<typename Derived>
7034 QualType
7035 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7036                                                ObjCObjectPointerTypeLoc TL) {
7037   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7038   if (PointeeType.isNull())
7039     return QualType();
7040 
7041   QualType Result = TL.getType();
7042   if (getDerived().AlwaysRebuild() ||
7043       PointeeType != TL.getPointeeLoc().getType()) {
7044     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7045                                                        TL.getStarLoc());
7046     if (Result.isNull())
7047       return QualType();
7048   }
7049 
7050   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7051   NewT.setStarLoc(TL.getStarLoc());
7052   return Result;
7053 }
7054 
7055 //===----------------------------------------------------------------------===//
7056 // Statement transformation
7057 //===----------------------------------------------------------------------===//
7058 template<typename Derived>
7059 StmtResult
7060 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7061   return S;
7062 }
7063 
7064 template<typename Derived>
7065 StmtResult
7066 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7067   return getDerived().TransformCompoundStmt(S, false);
7068 }
7069 
7070 template<typename Derived>
7071 StmtResult
7072 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7073                                               bool IsStmtExpr) {
7074   Sema::CompoundScopeRAII CompoundScope(getSema());
7075 
7076   const Stmt *ExprResult = S->getStmtExprResult();
7077   bool SubStmtInvalid = false;
7078   bool SubStmtChanged = false;
7079   SmallVector<Stmt*, 8> Statements;
7080   for (auto *B : S->body()) {
7081     StmtResult Result = getDerived().TransformStmt(
7082         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7083 
7084     if (Result.isInvalid()) {
7085       // Immediately fail if this was a DeclStmt, since it's very
7086       // likely that this will cause problems for future statements.
7087       if (isa<DeclStmt>(B))
7088         return StmtError();
7089 
7090       // Otherwise, just keep processing substatements and fail later.
7091       SubStmtInvalid = true;
7092       continue;
7093     }
7094 
7095     SubStmtChanged = SubStmtChanged || Result.get() != B;
7096     Statements.push_back(Result.getAs<Stmt>());
7097   }
7098 
7099   if (SubStmtInvalid)
7100     return StmtError();
7101 
7102   if (!getDerived().AlwaysRebuild() &&
7103       !SubStmtChanged)
7104     return S;
7105 
7106   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7107                                           Statements,
7108                                           S->getRBracLoc(),
7109                                           IsStmtExpr);
7110 }
7111 
7112 template<typename Derived>
7113 StmtResult
7114 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7115   ExprResult LHS, RHS;
7116   {
7117     EnterExpressionEvaluationContext Unevaluated(
7118         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7119 
7120     // Transform the left-hand case value.
7121     LHS = getDerived().TransformExpr(S->getLHS());
7122     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7123     if (LHS.isInvalid())
7124       return StmtError();
7125 
7126     // Transform the right-hand case value (for the GNU case-range extension).
7127     RHS = getDerived().TransformExpr(S->getRHS());
7128     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7129     if (RHS.isInvalid())
7130       return StmtError();
7131   }
7132 
7133   // Build the case statement.
7134   // Case statements are always rebuilt so that they will attached to their
7135   // transformed switch statement.
7136   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7137                                                        LHS.get(),
7138                                                        S->getEllipsisLoc(),
7139                                                        RHS.get(),
7140                                                        S->getColonLoc());
7141   if (Case.isInvalid())
7142     return StmtError();
7143 
7144   // Transform the statement following the case
7145   StmtResult SubStmt =
7146       getDerived().TransformStmt(S->getSubStmt());
7147   if (SubStmt.isInvalid())
7148     return StmtError();
7149 
7150   // Attach the body to the case statement
7151   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7152 }
7153 
7154 template <typename Derived>
7155 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7156   // Transform the statement following the default case
7157   StmtResult SubStmt =
7158       getDerived().TransformStmt(S->getSubStmt());
7159   if (SubStmt.isInvalid())
7160     return StmtError();
7161 
7162   // Default statements are always rebuilt
7163   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7164                                          SubStmt.get());
7165 }
7166 
7167 template<typename Derived>
7168 StmtResult
7169 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7170   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7171   if (SubStmt.isInvalid())
7172     return StmtError();
7173 
7174   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7175                                         S->getDecl());
7176   if (!LD)
7177     return StmtError();
7178 
7179   // If we're transforming "in-place" (we're not creating new local
7180   // declarations), assume we're replacing the old label statement
7181   // and clear out the reference to it.
7182   if (LD == S->getDecl())
7183     S->getDecl()->setStmt(nullptr);
7184 
7185   // FIXME: Pass the real colon location in.
7186   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7187                                        cast<LabelDecl>(LD), SourceLocation(),
7188                                        SubStmt.get());
7189 }
7190 
7191 template <typename Derived>
7192 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7193   if (!R)
7194     return R;
7195 
7196   switch (R->getKind()) {
7197 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7198 #define ATTR(X)
7199 #define PRAGMA_SPELLING_ATTR(X)                                                \
7200   case attr::X:                                                                \
7201     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7202 #include "clang/Basic/AttrList.inc"
7203   default:
7204     return R;
7205   }
7206 }
7207 
7208 template <typename Derived>
7209 StmtResult
7210 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7211                                                 StmtDiscardKind SDK) {
7212   bool AttrsChanged = false;
7213   SmallVector<const Attr *, 1> Attrs;
7214 
7215   // Visit attributes and keep track if any are transformed.
7216   for (const auto *I : S->getAttrs()) {
7217     const Attr *R = getDerived().TransformAttr(I);
7218     AttrsChanged |= (I != R);
7219     Attrs.push_back(R);
7220   }
7221 
7222   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7223   if (SubStmt.isInvalid())
7224     return StmtError();
7225 
7226   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7227     return S;
7228 
7229   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7230                                             SubStmt.get());
7231 }
7232 
7233 template<typename Derived>
7234 StmtResult
7235 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7236   // Transform the initialization statement
7237   StmtResult Init = getDerived().TransformStmt(S->getInit());
7238   if (Init.isInvalid())
7239     return StmtError();
7240 
7241   // Transform the condition
7242   Sema::ConditionResult Cond = getDerived().TransformCondition(
7243       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7244       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7245                        : Sema::ConditionKind::Boolean);
7246   if (Cond.isInvalid())
7247     return StmtError();
7248 
7249   // If this is a constexpr if, determine which arm we should instantiate.
7250   llvm::Optional<bool> ConstexprConditionValue;
7251   if (S->isConstexpr())
7252     ConstexprConditionValue = Cond.getKnownValue();
7253 
7254   // Transform the "then" branch.
7255   StmtResult Then;
7256   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7257     Then = getDerived().TransformStmt(S->getThen());
7258     if (Then.isInvalid())
7259       return StmtError();
7260   } else {
7261     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7262   }
7263 
7264   // Transform the "else" branch.
7265   StmtResult Else;
7266   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7267     Else = getDerived().TransformStmt(S->getElse());
7268     if (Else.isInvalid())
7269       return StmtError();
7270   }
7271 
7272   if (!getDerived().AlwaysRebuild() &&
7273       Init.get() == S->getInit() &&
7274       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7275       Then.get() == S->getThen() &&
7276       Else.get() == S->getElse())
7277     return S;
7278 
7279   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
7280                                     Init.get(), Then.get(), S->getElseLoc(),
7281                                     Else.get());
7282 }
7283 
7284 template<typename Derived>
7285 StmtResult
7286 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7287   // Transform the initialization statement
7288   StmtResult Init = getDerived().TransformStmt(S->getInit());
7289   if (Init.isInvalid())
7290     return StmtError();
7291 
7292   // Transform the condition.
7293   Sema::ConditionResult Cond = getDerived().TransformCondition(
7294       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7295       Sema::ConditionKind::Switch);
7296   if (Cond.isInvalid())
7297     return StmtError();
7298 
7299   // Rebuild the switch statement.
7300   StmtResult Switch
7301     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
7302   if (Switch.isInvalid())
7303     return StmtError();
7304 
7305   // Transform the body of the switch statement.
7306   StmtResult Body = getDerived().TransformStmt(S->getBody());
7307   if (Body.isInvalid())
7308     return StmtError();
7309 
7310   // Complete the switch statement.
7311   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7312                                             Body.get());
7313 }
7314 
7315 template<typename Derived>
7316 StmtResult
7317 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7318   // Transform the condition
7319   Sema::ConditionResult Cond = getDerived().TransformCondition(
7320       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7321       Sema::ConditionKind::Boolean);
7322   if (Cond.isInvalid())
7323     return StmtError();
7324 
7325   // Transform the body
7326   StmtResult Body = getDerived().TransformStmt(S->getBody());
7327   if (Body.isInvalid())
7328     return StmtError();
7329 
7330   if (!getDerived().AlwaysRebuild() &&
7331       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7332       Body.get() == S->getBody())
7333     return Owned(S);
7334 
7335   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
7336 }
7337 
7338 template<typename Derived>
7339 StmtResult
7340 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7341   // Transform the body
7342   StmtResult Body = getDerived().TransformStmt(S->getBody());
7343   if (Body.isInvalid())
7344     return StmtError();
7345 
7346   // Transform the condition
7347   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7348   if (Cond.isInvalid())
7349     return StmtError();
7350 
7351   if (!getDerived().AlwaysRebuild() &&
7352       Cond.get() == S->getCond() &&
7353       Body.get() == S->getBody())
7354     return S;
7355 
7356   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7357                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7358                                     S->getRParenLoc());
7359 }
7360 
7361 template<typename Derived>
7362 StmtResult
7363 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7364   if (getSema().getLangOpts().OpenMP)
7365     getSema().startOpenMPLoop();
7366 
7367   // Transform the initialization statement
7368   StmtResult Init = getDerived().TransformStmt(S->getInit());
7369   if (Init.isInvalid())
7370     return StmtError();
7371 
7372   // In OpenMP loop region loop control variable must be captured and be
7373   // private. Perform analysis of first part (if any).
7374   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7375     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7376 
7377   // Transform the condition
7378   Sema::ConditionResult Cond = getDerived().TransformCondition(
7379       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7380       Sema::ConditionKind::Boolean);
7381   if (Cond.isInvalid())
7382     return StmtError();
7383 
7384   // Transform the increment
7385   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7386   if (Inc.isInvalid())
7387     return StmtError();
7388 
7389   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7390   if (S->getInc() && !FullInc.get())
7391     return StmtError();
7392 
7393   // Transform the body
7394   StmtResult Body = getDerived().TransformStmt(S->getBody());
7395   if (Body.isInvalid())
7396     return StmtError();
7397 
7398   if (!getDerived().AlwaysRebuild() &&
7399       Init.get() == S->getInit() &&
7400       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7401       Inc.get() == S->getInc() &&
7402       Body.get() == S->getBody())
7403     return S;
7404 
7405   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7406                                      Init.get(), Cond, FullInc,
7407                                      S->getRParenLoc(), Body.get());
7408 }
7409 
7410 template<typename Derived>
7411 StmtResult
7412 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7413   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7414                                         S->getLabel());
7415   if (!LD)
7416     return StmtError();
7417 
7418   // Goto statements must always be rebuilt, to resolve the label.
7419   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7420                                       cast<LabelDecl>(LD));
7421 }
7422 
7423 template<typename Derived>
7424 StmtResult
7425 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7426   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7427   if (Target.isInvalid())
7428     return StmtError();
7429   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7430 
7431   if (!getDerived().AlwaysRebuild() &&
7432       Target.get() == S->getTarget())
7433     return S;
7434 
7435   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7436                                               Target.get());
7437 }
7438 
7439 template<typename Derived>
7440 StmtResult
7441 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7442   return S;
7443 }
7444 
7445 template<typename Derived>
7446 StmtResult
7447 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7448   return S;
7449 }
7450 
7451 template<typename Derived>
7452 StmtResult
7453 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7454   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7455                                                         /*NotCopyInit*/false);
7456   if (Result.isInvalid())
7457     return StmtError();
7458 
7459   // FIXME: We always rebuild the return statement because there is no way
7460   // to tell whether the return type of the function has changed.
7461   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7462 }
7463 
7464 template<typename Derived>
7465 StmtResult
7466 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7467   bool DeclChanged = false;
7468   SmallVector<Decl *, 4> Decls;
7469   for (auto *D : S->decls()) {
7470     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7471     if (!Transformed)
7472       return StmtError();
7473 
7474     if (Transformed != D)
7475       DeclChanged = true;
7476 
7477     Decls.push_back(Transformed);
7478   }
7479 
7480   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7481     return S;
7482 
7483   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7484 }
7485 
7486 template<typename Derived>
7487 StmtResult
7488 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7489 
7490   SmallVector<Expr*, 8> Constraints;
7491   SmallVector<Expr*, 8> Exprs;
7492   SmallVector<IdentifierInfo *, 4> Names;
7493 
7494   ExprResult AsmString;
7495   SmallVector<Expr*, 8> Clobbers;
7496 
7497   bool ExprsChanged = false;
7498 
7499   // Go through the outputs.
7500   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7501     Names.push_back(S->getOutputIdentifier(I));
7502 
7503     // No need to transform the constraint literal.
7504     Constraints.push_back(S->getOutputConstraintLiteral(I));
7505 
7506     // Transform the output expr.
7507     Expr *OutputExpr = S->getOutputExpr(I);
7508     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7509     if (Result.isInvalid())
7510       return StmtError();
7511 
7512     ExprsChanged |= Result.get() != OutputExpr;
7513 
7514     Exprs.push_back(Result.get());
7515   }
7516 
7517   // Go through the inputs.
7518   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7519     Names.push_back(S->getInputIdentifier(I));
7520 
7521     // No need to transform the constraint literal.
7522     Constraints.push_back(S->getInputConstraintLiteral(I));
7523 
7524     // Transform the input expr.
7525     Expr *InputExpr = S->getInputExpr(I);
7526     ExprResult Result = getDerived().TransformExpr(InputExpr);
7527     if (Result.isInvalid())
7528       return StmtError();
7529 
7530     ExprsChanged |= Result.get() != InputExpr;
7531 
7532     Exprs.push_back(Result.get());
7533   }
7534 
7535   // Go through the Labels.
7536   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7537     Names.push_back(S->getLabelIdentifier(I));
7538 
7539     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7540     if (Result.isInvalid())
7541       return StmtError();
7542     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7543     Exprs.push_back(Result.get());
7544   }
7545   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7546     return S;
7547 
7548   // Go through the clobbers.
7549   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7550     Clobbers.push_back(S->getClobberStringLiteral(I));
7551 
7552   // No need to transform the asm string literal.
7553   AsmString = S->getAsmString();
7554   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7555                                         S->isVolatile(), S->getNumOutputs(),
7556                                         S->getNumInputs(), Names.data(),
7557                                         Constraints, Exprs, AsmString.get(),
7558                                         Clobbers, S->getNumLabels(),
7559                                         S->getRParenLoc());
7560 }
7561 
7562 template<typename Derived>
7563 StmtResult
7564 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7565   ArrayRef<Token> AsmToks =
7566     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7567 
7568   bool HadError = false, HadChange = false;
7569 
7570   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7571   SmallVector<Expr*, 8> TransformedExprs;
7572   TransformedExprs.reserve(SrcExprs.size());
7573   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7574     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7575     if (!Result.isUsable()) {
7576       HadError = true;
7577     } else {
7578       HadChange |= (Result.get() != SrcExprs[i]);
7579       TransformedExprs.push_back(Result.get());
7580     }
7581   }
7582 
7583   if (HadError) return StmtError();
7584   if (!HadChange && !getDerived().AlwaysRebuild())
7585     return Owned(S);
7586 
7587   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7588                                        AsmToks, S->getAsmString(),
7589                                        S->getNumOutputs(), S->getNumInputs(),
7590                                        S->getAllConstraints(), S->getClobbers(),
7591                                        TransformedExprs, S->getEndLoc());
7592 }
7593 
7594 // C++ Coroutines TS
7595 
7596 template<typename Derived>
7597 StmtResult
7598 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7599   auto *ScopeInfo = SemaRef.getCurFunction();
7600   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7601   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7602          ScopeInfo->NeedsCoroutineSuspends &&
7603          ScopeInfo->CoroutineSuspends.first == nullptr &&
7604          ScopeInfo->CoroutineSuspends.second == nullptr &&
7605          "expected clean scope info");
7606 
7607   // Set that we have (possibly-invalid) suspend points before we do anything
7608   // that may fail.
7609   ScopeInfo->setNeedsCoroutineSuspends(false);
7610 
7611   // We re-build the coroutine promise object (and the coroutine parameters its
7612   // type and constructor depend on) based on the types used in our current
7613   // function. We must do so, and set it on the current FunctionScopeInfo,
7614   // before attempting to transform the other parts of the coroutine body
7615   // statement, such as the implicit suspend statements (because those
7616   // statements reference the FunctionScopeInfo::CoroutinePromise).
7617   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7618     return StmtError();
7619   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7620   if (!Promise)
7621     return StmtError();
7622   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7623   ScopeInfo->CoroutinePromise = Promise;
7624 
7625   // Transform the implicit coroutine statements constructed using dependent
7626   // types during the previous parse: initial and final suspensions, the return
7627   // object, and others. We also transform the coroutine function's body.
7628   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7629   if (InitSuspend.isInvalid())
7630     return StmtError();
7631   StmtResult FinalSuspend =
7632       getDerived().TransformStmt(S->getFinalSuspendStmt());
7633   if (FinalSuspend.isInvalid())
7634     return StmtError();
7635   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7636   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7637 
7638   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7639   if (BodyRes.isInvalid())
7640     return StmtError();
7641 
7642   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7643   if (Builder.isInvalid())
7644     return StmtError();
7645 
7646   Expr *ReturnObject = S->getReturnValueInit();
7647   assert(ReturnObject && "the return object is expected to be valid");
7648   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7649                                                      /*NoCopyInit*/ false);
7650   if (Res.isInvalid())
7651     return StmtError();
7652   Builder.ReturnValue = Res.get();
7653 
7654   // If during the previous parse the coroutine still had a dependent promise
7655   // statement, we may need to build some implicit coroutine statements
7656   // (such as exception and fallthrough handlers) for the first time.
7657   if (S->hasDependentPromiseType()) {
7658     // We can only build these statements, however, if the current promise type
7659     // is not dependent.
7660     if (!Promise->getType()->isDependentType()) {
7661       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7662              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7663              "these nodes should not have been built yet");
7664       if (!Builder.buildDependentStatements())
7665         return StmtError();
7666     }
7667   } else {
7668     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7669       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7670       if (Res.isInvalid())
7671         return StmtError();
7672       Builder.OnFallthrough = Res.get();
7673     }
7674 
7675     if (auto *OnException = S->getExceptionHandler()) {
7676       StmtResult Res = getDerived().TransformStmt(OnException);
7677       if (Res.isInvalid())
7678         return StmtError();
7679       Builder.OnException = Res.get();
7680     }
7681 
7682     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7683       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7684       if (Res.isInvalid())
7685         return StmtError();
7686       Builder.ReturnStmtOnAllocFailure = Res.get();
7687     }
7688 
7689     // Transform any additional statements we may have already built
7690     assert(S->getAllocate() && S->getDeallocate() &&
7691            "allocation and deallocation calls must already be built");
7692     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7693     if (AllocRes.isInvalid())
7694       return StmtError();
7695     Builder.Allocate = AllocRes.get();
7696 
7697     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7698     if (DeallocRes.isInvalid())
7699       return StmtError();
7700     Builder.Deallocate = DeallocRes.get();
7701 
7702     assert(S->getResultDecl() && "ResultDecl must already be built");
7703     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7704     if (ResultDecl.isInvalid())
7705       return StmtError();
7706     Builder.ResultDecl = ResultDecl.get();
7707 
7708     if (auto *ReturnStmt = S->getReturnStmt()) {
7709       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7710       if (Res.isInvalid())
7711         return StmtError();
7712       Builder.ReturnStmt = Res.get();
7713     }
7714   }
7715 
7716   return getDerived().RebuildCoroutineBodyStmt(Builder);
7717 }
7718 
7719 template<typename Derived>
7720 StmtResult
7721 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7722   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7723                                                         /*NotCopyInit*/false);
7724   if (Result.isInvalid())
7725     return StmtError();
7726 
7727   // Always rebuild; we don't know if this needs to be injected into a new
7728   // context or if the promise type has changed.
7729   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7730                                           S->isImplicit());
7731 }
7732 
7733 template<typename Derived>
7734 ExprResult
7735 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7736   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7737                                                         /*NotCopyInit*/false);
7738   if (Result.isInvalid())
7739     return ExprError();
7740 
7741   // Always rebuild; we don't know if this needs to be injected into a new
7742   // context or if the promise type has changed.
7743   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7744                                          E->isImplicit());
7745 }
7746 
7747 template <typename Derived>
7748 ExprResult
7749 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7750   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7751                                                         /*NotCopyInit*/ false);
7752   if (OperandResult.isInvalid())
7753     return ExprError();
7754 
7755   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7756           E->getOperatorCoawaitLookup());
7757 
7758   if (LookupResult.isInvalid())
7759     return ExprError();
7760 
7761   // Always rebuild; we don't know if this needs to be injected into a new
7762   // context or if the promise type has changed.
7763   return getDerived().RebuildDependentCoawaitExpr(
7764       E->getKeywordLoc(), OperandResult.get(),
7765       cast<UnresolvedLookupExpr>(LookupResult.get()));
7766 }
7767 
7768 template<typename Derived>
7769 ExprResult
7770 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7771   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7772                                                         /*NotCopyInit*/false);
7773   if (Result.isInvalid())
7774     return ExprError();
7775 
7776   // Always rebuild; we don't know if this needs to be injected into a new
7777   // context or if the promise type has changed.
7778   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7779 }
7780 
7781 // Objective-C Statements.
7782 
7783 template<typename Derived>
7784 StmtResult
7785 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7786   // Transform the body of the @try.
7787   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7788   if (TryBody.isInvalid())
7789     return StmtError();
7790 
7791   // Transform the @catch statements (if present).
7792   bool AnyCatchChanged = false;
7793   SmallVector<Stmt*, 8> CatchStmts;
7794   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7795     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7796     if (Catch.isInvalid())
7797       return StmtError();
7798     if (Catch.get() != S->getCatchStmt(I))
7799       AnyCatchChanged = true;
7800     CatchStmts.push_back(Catch.get());
7801   }
7802 
7803   // Transform the @finally statement (if present).
7804   StmtResult Finally;
7805   if (S->getFinallyStmt()) {
7806     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7807     if (Finally.isInvalid())
7808       return StmtError();
7809   }
7810 
7811   // If nothing changed, just retain this statement.
7812   if (!getDerived().AlwaysRebuild() &&
7813       TryBody.get() == S->getTryBody() &&
7814       !AnyCatchChanged &&
7815       Finally.get() == S->getFinallyStmt())
7816     return S;
7817 
7818   // Build a new statement.
7819   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7820                                            CatchStmts, Finally.get());
7821 }
7822 
7823 template<typename Derived>
7824 StmtResult
7825 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7826   // Transform the @catch parameter, if there is one.
7827   VarDecl *Var = nullptr;
7828   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7829     TypeSourceInfo *TSInfo = nullptr;
7830     if (FromVar->getTypeSourceInfo()) {
7831       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7832       if (!TSInfo)
7833         return StmtError();
7834     }
7835 
7836     QualType T;
7837     if (TSInfo)
7838       T = TSInfo->getType();
7839     else {
7840       T = getDerived().TransformType(FromVar->getType());
7841       if (T.isNull())
7842         return StmtError();
7843     }
7844 
7845     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7846     if (!Var)
7847       return StmtError();
7848   }
7849 
7850   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7851   if (Body.isInvalid())
7852     return StmtError();
7853 
7854   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7855                                              S->getRParenLoc(),
7856                                              Var, Body.get());
7857 }
7858 
7859 template<typename Derived>
7860 StmtResult
7861 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7862   // Transform the body.
7863   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7864   if (Body.isInvalid())
7865     return StmtError();
7866 
7867   // If nothing changed, just retain this statement.
7868   if (!getDerived().AlwaysRebuild() &&
7869       Body.get() == S->getFinallyBody())
7870     return S;
7871 
7872   // Build a new statement.
7873   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7874                                                Body.get());
7875 }
7876 
7877 template<typename Derived>
7878 StmtResult
7879 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7880   ExprResult Operand;
7881   if (S->getThrowExpr()) {
7882     Operand = getDerived().TransformExpr(S->getThrowExpr());
7883     if (Operand.isInvalid())
7884       return StmtError();
7885   }
7886 
7887   if (!getDerived().AlwaysRebuild() &&
7888       Operand.get() == S->getThrowExpr())
7889     return S;
7890 
7891   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7892 }
7893 
7894 template<typename Derived>
7895 StmtResult
7896 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7897                                                   ObjCAtSynchronizedStmt *S) {
7898   // Transform the object we are locking.
7899   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7900   if (Object.isInvalid())
7901     return StmtError();
7902   Object =
7903     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7904                                                   Object.get());
7905   if (Object.isInvalid())
7906     return StmtError();
7907 
7908   // Transform the body.
7909   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7910   if (Body.isInvalid())
7911     return StmtError();
7912 
7913   // If nothing change, just retain the current statement.
7914   if (!getDerived().AlwaysRebuild() &&
7915       Object.get() == S->getSynchExpr() &&
7916       Body.get() == S->getSynchBody())
7917     return S;
7918 
7919   // Build a new statement.
7920   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7921                                                     Object.get(), Body.get());
7922 }
7923 
7924 template<typename Derived>
7925 StmtResult
7926 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7927                                               ObjCAutoreleasePoolStmt *S) {
7928   // Transform the body.
7929   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7930   if (Body.isInvalid())
7931     return StmtError();
7932 
7933   // If nothing changed, just retain this statement.
7934   if (!getDerived().AlwaysRebuild() &&
7935       Body.get() == S->getSubStmt())
7936     return S;
7937 
7938   // Build a new statement.
7939   return getDerived().RebuildObjCAutoreleasePoolStmt(
7940                         S->getAtLoc(), Body.get());
7941 }
7942 
7943 template<typename Derived>
7944 StmtResult
7945 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7946                                                   ObjCForCollectionStmt *S) {
7947   // Transform the element statement.
7948   StmtResult Element =
7949       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7950   if (Element.isInvalid())
7951     return StmtError();
7952 
7953   // Transform the collection expression.
7954   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7955   if (Collection.isInvalid())
7956     return StmtError();
7957 
7958   // Transform the body.
7959   StmtResult Body = getDerived().TransformStmt(S->getBody());
7960   if (Body.isInvalid())
7961     return StmtError();
7962 
7963   // If nothing changed, just retain this statement.
7964   if (!getDerived().AlwaysRebuild() &&
7965       Element.get() == S->getElement() &&
7966       Collection.get() == S->getCollection() &&
7967       Body.get() == S->getBody())
7968     return S;
7969 
7970   // Build a new statement.
7971   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7972                                                    Element.get(),
7973                                                    Collection.get(),
7974                                                    S->getRParenLoc(),
7975                                                    Body.get());
7976 }
7977 
7978 template <typename Derived>
7979 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7980   // Transform the exception declaration, if any.
7981   VarDecl *Var = nullptr;
7982   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7983     TypeSourceInfo *T =
7984         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7985     if (!T)
7986       return StmtError();
7987 
7988     Var = getDerived().RebuildExceptionDecl(
7989         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7990         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7991     if (!Var || Var->isInvalidDecl())
7992       return StmtError();
7993   }
7994 
7995   // Transform the actual exception handler.
7996   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7997   if (Handler.isInvalid())
7998     return StmtError();
7999 
8000   if (!getDerived().AlwaysRebuild() && !Var &&
8001       Handler.get() == S->getHandlerBlock())
8002     return S;
8003 
8004   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8005 }
8006 
8007 template <typename Derived>
8008 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8009   // Transform the try block itself.
8010   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8011   if (TryBlock.isInvalid())
8012     return StmtError();
8013 
8014   // Transform the handlers.
8015   bool HandlerChanged = false;
8016   SmallVector<Stmt *, 8> Handlers;
8017   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8018     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8019     if (Handler.isInvalid())
8020       return StmtError();
8021 
8022     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8023     Handlers.push_back(Handler.getAs<Stmt>());
8024   }
8025 
8026   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8027       !HandlerChanged)
8028     return S;
8029 
8030   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8031                                         Handlers);
8032 }
8033 
8034 template<typename Derived>
8035 StmtResult
8036 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8037   StmtResult Init =
8038       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8039   if (Init.isInvalid())
8040     return StmtError();
8041 
8042   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8043   if (Range.isInvalid())
8044     return StmtError();
8045 
8046   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8047   if (Begin.isInvalid())
8048     return StmtError();
8049   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8050   if (End.isInvalid())
8051     return StmtError();
8052 
8053   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8054   if (Cond.isInvalid())
8055     return StmtError();
8056   if (Cond.get())
8057     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8058   if (Cond.isInvalid())
8059     return StmtError();
8060   if (Cond.get())
8061     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8062 
8063   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8064   if (Inc.isInvalid())
8065     return StmtError();
8066   if (Inc.get())
8067     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8068 
8069   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8070   if (LoopVar.isInvalid())
8071     return StmtError();
8072 
8073   StmtResult NewStmt = S;
8074   if (getDerived().AlwaysRebuild() ||
8075       Init.get() != S->getInit() ||
8076       Range.get() != S->getRangeStmt() ||
8077       Begin.get() != S->getBeginStmt() ||
8078       End.get() != S->getEndStmt() ||
8079       Cond.get() != S->getCond() ||
8080       Inc.get() != S->getInc() ||
8081       LoopVar.get() != S->getLoopVarStmt()) {
8082     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8083                                                   S->getCoawaitLoc(), Init.get(),
8084                                                   S->getColonLoc(), Range.get(),
8085                                                   Begin.get(), End.get(),
8086                                                   Cond.get(),
8087                                                   Inc.get(), LoopVar.get(),
8088                                                   S->getRParenLoc());
8089     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8090       // Might not have attached any initializer to the loop variable.
8091       getSema().ActOnInitializerError(
8092           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8093       return StmtError();
8094     }
8095   }
8096 
8097   StmtResult Body = getDerived().TransformStmt(S->getBody());
8098   if (Body.isInvalid())
8099     return StmtError();
8100 
8101   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8102   // it now so we have a new statement to attach the body to.
8103   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8104     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8105                                                   S->getCoawaitLoc(), Init.get(),
8106                                                   S->getColonLoc(), Range.get(),
8107                                                   Begin.get(), End.get(),
8108                                                   Cond.get(),
8109                                                   Inc.get(), LoopVar.get(),
8110                                                   S->getRParenLoc());
8111     if (NewStmt.isInvalid())
8112       return StmtError();
8113   }
8114 
8115   if (NewStmt.get() == S)
8116     return S;
8117 
8118   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8119 }
8120 
8121 template<typename Derived>
8122 StmtResult
8123 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8124                                                     MSDependentExistsStmt *S) {
8125   // Transform the nested-name-specifier, if any.
8126   NestedNameSpecifierLoc QualifierLoc;
8127   if (S->getQualifierLoc()) {
8128     QualifierLoc
8129       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8130     if (!QualifierLoc)
8131       return StmtError();
8132   }
8133 
8134   // Transform the declaration name.
8135   DeclarationNameInfo NameInfo = S->getNameInfo();
8136   if (NameInfo.getName()) {
8137     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8138     if (!NameInfo.getName())
8139       return StmtError();
8140   }
8141 
8142   // Check whether anything changed.
8143   if (!getDerived().AlwaysRebuild() &&
8144       QualifierLoc == S->getQualifierLoc() &&
8145       NameInfo.getName() == S->getNameInfo().getName())
8146     return S;
8147 
8148   // Determine whether this name exists, if we can.
8149   CXXScopeSpec SS;
8150   SS.Adopt(QualifierLoc);
8151   bool Dependent = false;
8152   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8153   case Sema::IER_Exists:
8154     if (S->isIfExists())
8155       break;
8156 
8157     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8158 
8159   case Sema::IER_DoesNotExist:
8160     if (S->isIfNotExists())
8161       break;
8162 
8163     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8164 
8165   case Sema::IER_Dependent:
8166     Dependent = true;
8167     break;
8168 
8169   case Sema::IER_Error:
8170     return StmtError();
8171   }
8172 
8173   // We need to continue with the instantiation, so do so now.
8174   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8175   if (SubStmt.isInvalid())
8176     return StmtError();
8177 
8178   // If we have resolved the name, just transform to the substatement.
8179   if (!Dependent)
8180     return SubStmt;
8181 
8182   // The name is still dependent, so build a dependent expression again.
8183   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8184                                                    S->isIfExists(),
8185                                                    QualifierLoc,
8186                                                    NameInfo,
8187                                                    SubStmt.get());
8188 }
8189 
8190 template<typename Derived>
8191 ExprResult
8192 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8193   NestedNameSpecifierLoc QualifierLoc;
8194   if (E->getQualifierLoc()) {
8195     QualifierLoc
8196     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8197     if (!QualifierLoc)
8198       return ExprError();
8199   }
8200 
8201   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8202     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8203   if (!PD)
8204     return ExprError();
8205 
8206   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8207   if (Base.isInvalid())
8208     return ExprError();
8209 
8210   return new (SemaRef.getASTContext())
8211       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8212                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8213                         QualifierLoc, E->getMemberLoc());
8214 }
8215 
8216 template <typename Derived>
8217 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8218     MSPropertySubscriptExpr *E) {
8219   auto BaseRes = getDerived().TransformExpr(E->getBase());
8220   if (BaseRes.isInvalid())
8221     return ExprError();
8222   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8223   if (IdxRes.isInvalid())
8224     return ExprError();
8225 
8226   if (!getDerived().AlwaysRebuild() &&
8227       BaseRes.get() == E->getBase() &&
8228       IdxRes.get() == E->getIdx())
8229     return E;
8230 
8231   return getDerived().RebuildArraySubscriptExpr(
8232       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8233 }
8234 
8235 template <typename Derived>
8236 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8237   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8238   if (TryBlock.isInvalid())
8239     return StmtError();
8240 
8241   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8242   if (Handler.isInvalid())
8243     return StmtError();
8244 
8245   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8246       Handler.get() == S->getHandler())
8247     return S;
8248 
8249   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8250                                         TryBlock.get(), Handler.get());
8251 }
8252 
8253 template <typename Derived>
8254 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8255   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8256   if (Block.isInvalid())
8257     return StmtError();
8258 
8259   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8260 }
8261 
8262 template <typename Derived>
8263 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8264   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8265   if (FilterExpr.isInvalid())
8266     return StmtError();
8267 
8268   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8269   if (Block.isInvalid())
8270     return StmtError();
8271 
8272   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8273                                            Block.get());
8274 }
8275 
8276 template <typename Derived>
8277 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8278   if (isa<SEHFinallyStmt>(Handler))
8279     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8280   else
8281     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8282 }
8283 
8284 template<typename Derived>
8285 StmtResult
8286 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8287   return S;
8288 }
8289 
8290 //===----------------------------------------------------------------------===//
8291 // OpenMP directive transformation
8292 //===----------------------------------------------------------------------===//
8293 template <typename Derived>
8294 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8295     OMPExecutableDirective *D) {
8296 
8297   // Transform the clauses
8298   llvm::SmallVector<OMPClause *, 16> TClauses;
8299   ArrayRef<OMPClause *> Clauses = D->clauses();
8300   TClauses.reserve(Clauses.size());
8301   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8302        I != E; ++I) {
8303     if (*I) {
8304       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8305       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8306       getDerived().getSema().EndOpenMPClause();
8307       if (Clause)
8308         TClauses.push_back(Clause);
8309     } else {
8310       TClauses.push_back(nullptr);
8311     }
8312   }
8313   StmtResult AssociatedStmt;
8314   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8315     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8316                                                   /*CurScope=*/nullptr);
8317     StmtResult Body;
8318     {
8319       Sema::CompoundScopeRAII CompoundScope(getSema());
8320       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8321       Body = getDerived().TransformStmt(CS);
8322     }
8323     AssociatedStmt =
8324         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8325     if (AssociatedStmt.isInvalid()) {
8326       return StmtError();
8327     }
8328   }
8329   if (TClauses.size() != Clauses.size()) {
8330     return StmtError();
8331   }
8332 
8333   // Transform directive name for 'omp critical' directive.
8334   DeclarationNameInfo DirName;
8335   if (D->getDirectiveKind() == OMPD_critical) {
8336     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8337     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8338   }
8339   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8340   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8341     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8342   } else if (D->getDirectiveKind() == OMPD_cancel) {
8343     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8344   }
8345 
8346   return getDerived().RebuildOMPExecutableDirective(
8347       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8348       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8349 }
8350 
8351 template <typename Derived>
8352 StmtResult
8353 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8354   DeclarationNameInfo DirName;
8355   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8356                                              D->getBeginLoc());
8357   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8358   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8359   return Res;
8360 }
8361 
8362 template <typename Derived>
8363 StmtResult
8364 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8365   DeclarationNameInfo DirName;
8366   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8367                                              D->getBeginLoc());
8368   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8369   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8370   return Res;
8371 }
8372 
8373 template <typename Derived>
8374 StmtResult
8375 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8376   DeclarationNameInfo DirName;
8377   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8378                                              D->getBeginLoc());
8379   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8380   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8381   return Res;
8382 }
8383 
8384 template <typename Derived>
8385 StmtResult
8386 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8387   DeclarationNameInfo DirName;
8388   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8389                                              D->getBeginLoc());
8390   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8391   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8392   return Res;
8393 }
8394 
8395 template <typename Derived>
8396 StmtResult
8397 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8398   DeclarationNameInfo DirName;
8399   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8400                                              D->getBeginLoc());
8401   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8402   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8403   return Res;
8404 }
8405 
8406 template <typename Derived>
8407 StmtResult
8408 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8409   DeclarationNameInfo DirName;
8410   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8411                                              D->getBeginLoc());
8412   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8413   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8414   return Res;
8415 }
8416 
8417 template <typename Derived>
8418 StmtResult
8419 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8420   DeclarationNameInfo DirName;
8421   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8422                                              D->getBeginLoc());
8423   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8424   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8425   return Res;
8426 }
8427 
8428 template <typename Derived>
8429 StmtResult
8430 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8431   DeclarationNameInfo DirName;
8432   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8433                                              D->getBeginLoc());
8434   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8435   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8436   return Res;
8437 }
8438 
8439 template <typename Derived>
8440 StmtResult
8441 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8442   getDerived().getSema().StartOpenMPDSABlock(
8443       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8444   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8445   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8446   return Res;
8447 }
8448 
8449 template <typename Derived>
8450 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8451     OMPParallelForDirective *D) {
8452   DeclarationNameInfo DirName;
8453   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8454                                              nullptr, D->getBeginLoc());
8455   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8456   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8457   return Res;
8458 }
8459 
8460 template <typename Derived>
8461 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8462     OMPParallelForSimdDirective *D) {
8463   DeclarationNameInfo DirName;
8464   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8465                                              nullptr, D->getBeginLoc());
8466   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8467   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8468   return Res;
8469 }
8470 
8471 template <typename Derived>
8472 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8473     OMPParallelMasterDirective *D) {
8474   DeclarationNameInfo DirName;
8475   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8476                                              nullptr, D->getBeginLoc());
8477   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8478   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8479   return Res;
8480 }
8481 
8482 template <typename Derived>
8483 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8484     OMPParallelSectionsDirective *D) {
8485   DeclarationNameInfo DirName;
8486   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8487                                              nullptr, D->getBeginLoc());
8488   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8489   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8490   return Res;
8491 }
8492 
8493 template <typename Derived>
8494 StmtResult
8495 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8496   DeclarationNameInfo DirName;
8497   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8498                                              D->getBeginLoc());
8499   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8500   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8501   return Res;
8502 }
8503 
8504 template <typename Derived>
8505 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8506     OMPTaskyieldDirective *D) {
8507   DeclarationNameInfo DirName;
8508   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8509                                              D->getBeginLoc());
8510   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8511   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8512   return Res;
8513 }
8514 
8515 template <typename Derived>
8516 StmtResult
8517 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8518   DeclarationNameInfo DirName;
8519   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8520                                              D->getBeginLoc());
8521   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8522   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8523   return Res;
8524 }
8525 
8526 template <typename Derived>
8527 StmtResult
8528 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8529   DeclarationNameInfo DirName;
8530   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8531                                              D->getBeginLoc());
8532   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8533   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8534   return Res;
8535 }
8536 
8537 template <typename Derived>
8538 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8539     OMPTaskgroupDirective *D) {
8540   DeclarationNameInfo DirName;
8541   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8542                                              D->getBeginLoc());
8543   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8544   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8545   return Res;
8546 }
8547 
8548 template <typename Derived>
8549 StmtResult
8550 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8551   DeclarationNameInfo DirName;
8552   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8553                                              D->getBeginLoc());
8554   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8555   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8556   return Res;
8557 }
8558 
8559 template <typename Derived>
8560 StmtResult
8561 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8562   DeclarationNameInfo DirName;
8563   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8564                                              D->getBeginLoc());
8565   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8566   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8567   return Res;
8568 }
8569 
8570 template <typename Derived>
8571 StmtResult
8572 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8573   DeclarationNameInfo DirName;
8574   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8575                                              D->getBeginLoc());
8576   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8577   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8578   return Res;
8579 }
8580 
8581 template <typename Derived>
8582 StmtResult
8583 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8584   DeclarationNameInfo DirName;
8585   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8586                                              D->getBeginLoc());
8587   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8588   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8589   return Res;
8590 }
8591 
8592 template <typename Derived>
8593 StmtResult
8594 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8595   DeclarationNameInfo DirName;
8596   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8597                                              D->getBeginLoc());
8598   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8599   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8600   return Res;
8601 }
8602 
8603 template <typename Derived>
8604 StmtResult
8605 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8606   DeclarationNameInfo DirName;
8607   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8608                                              D->getBeginLoc());
8609   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8610   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8611   return Res;
8612 }
8613 
8614 template <typename Derived>
8615 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8616     OMPTargetDataDirective *D) {
8617   DeclarationNameInfo DirName;
8618   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8619                                              D->getBeginLoc());
8620   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8621   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8622   return Res;
8623 }
8624 
8625 template <typename Derived>
8626 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8627     OMPTargetEnterDataDirective *D) {
8628   DeclarationNameInfo DirName;
8629   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8630                                              nullptr, D->getBeginLoc());
8631   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8632   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8633   return Res;
8634 }
8635 
8636 template <typename Derived>
8637 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8638     OMPTargetExitDataDirective *D) {
8639   DeclarationNameInfo DirName;
8640   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8641                                              nullptr, D->getBeginLoc());
8642   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8643   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8644   return Res;
8645 }
8646 
8647 template <typename Derived>
8648 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8649     OMPTargetParallelDirective *D) {
8650   DeclarationNameInfo DirName;
8651   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8652                                              nullptr, D->getBeginLoc());
8653   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8654   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8655   return Res;
8656 }
8657 
8658 template <typename Derived>
8659 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8660     OMPTargetParallelForDirective *D) {
8661   DeclarationNameInfo DirName;
8662   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8663                                              nullptr, D->getBeginLoc());
8664   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8665   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8666   return Res;
8667 }
8668 
8669 template <typename Derived>
8670 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8671     OMPTargetUpdateDirective *D) {
8672   DeclarationNameInfo DirName;
8673   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8674                                              nullptr, D->getBeginLoc());
8675   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8676   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8677   return Res;
8678 }
8679 
8680 template <typename Derived>
8681 StmtResult
8682 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8683   DeclarationNameInfo DirName;
8684   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8685                                              D->getBeginLoc());
8686   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8687   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8688   return Res;
8689 }
8690 
8691 template <typename Derived>
8692 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8693     OMPCancellationPointDirective *D) {
8694   DeclarationNameInfo DirName;
8695   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8696                                              nullptr, D->getBeginLoc());
8697   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8698   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8699   return Res;
8700 }
8701 
8702 template <typename Derived>
8703 StmtResult
8704 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8705   DeclarationNameInfo DirName;
8706   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8707                                              D->getBeginLoc());
8708   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8709   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8710   return Res;
8711 }
8712 
8713 template <typename Derived>
8714 StmtResult
8715 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8716   DeclarationNameInfo DirName;
8717   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8718                                              D->getBeginLoc());
8719   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8720   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8721   return Res;
8722 }
8723 
8724 template <typename Derived>
8725 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8726     OMPTaskLoopSimdDirective *D) {
8727   DeclarationNameInfo DirName;
8728   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8729                                              nullptr, D->getBeginLoc());
8730   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8731   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8732   return Res;
8733 }
8734 
8735 template <typename Derived>
8736 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8737     OMPMasterTaskLoopDirective *D) {
8738   DeclarationNameInfo DirName;
8739   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8740                                              nullptr, D->getBeginLoc());
8741   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8742   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8743   return Res;
8744 }
8745 
8746 template <typename Derived>
8747 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8748     OMPMasterTaskLoopSimdDirective *D) {
8749   DeclarationNameInfo DirName;
8750   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8751                                              nullptr, D->getBeginLoc());
8752   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8753   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8754   return Res;
8755 }
8756 
8757 template <typename Derived>
8758 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8759     OMPParallelMasterTaskLoopDirective *D) {
8760   DeclarationNameInfo DirName;
8761   getDerived().getSema().StartOpenMPDSABlock(
8762       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8763   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8764   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8765   return Res;
8766 }
8767 
8768 template <typename Derived>
8769 StmtResult
8770 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8771     OMPParallelMasterTaskLoopSimdDirective *D) {
8772   DeclarationNameInfo DirName;
8773   getDerived().getSema().StartOpenMPDSABlock(
8774       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8775   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8776   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8777   return Res;
8778 }
8779 
8780 template <typename Derived>
8781 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8782     OMPDistributeDirective *D) {
8783   DeclarationNameInfo DirName;
8784   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8785                                              D->getBeginLoc());
8786   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8787   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8788   return Res;
8789 }
8790 
8791 template <typename Derived>
8792 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8793     OMPDistributeParallelForDirective *D) {
8794   DeclarationNameInfo DirName;
8795   getDerived().getSema().StartOpenMPDSABlock(
8796       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8797   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8798   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8799   return Res;
8800 }
8801 
8802 template <typename Derived>
8803 StmtResult
8804 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8805     OMPDistributeParallelForSimdDirective *D) {
8806   DeclarationNameInfo DirName;
8807   getDerived().getSema().StartOpenMPDSABlock(
8808       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8809   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8810   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8811   return Res;
8812 }
8813 
8814 template <typename Derived>
8815 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8816     OMPDistributeSimdDirective *D) {
8817   DeclarationNameInfo DirName;
8818   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8819                                              nullptr, D->getBeginLoc());
8820   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8821   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8822   return Res;
8823 }
8824 
8825 template <typename Derived>
8826 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8827     OMPTargetParallelForSimdDirective *D) {
8828   DeclarationNameInfo DirName;
8829   getDerived().getSema().StartOpenMPDSABlock(
8830       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8831   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8832   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8833   return Res;
8834 }
8835 
8836 template <typename Derived>
8837 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8838     OMPTargetSimdDirective *D) {
8839   DeclarationNameInfo DirName;
8840   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8841                                              D->getBeginLoc());
8842   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8843   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8844   return Res;
8845 }
8846 
8847 template <typename Derived>
8848 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8849     OMPTeamsDistributeDirective *D) {
8850   DeclarationNameInfo DirName;
8851   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8852                                              nullptr, D->getBeginLoc());
8853   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8854   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8855   return Res;
8856 }
8857 
8858 template <typename Derived>
8859 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8860     OMPTeamsDistributeSimdDirective *D) {
8861   DeclarationNameInfo DirName;
8862   getDerived().getSema().StartOpenMPDSABlock(
8863       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8864   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8865   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8866   return Res;
8867 }
8868 
8869 template <typename Derived>
8870 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8871     OMPTeamsDistributeParallelForSimdDirective *D) {
8872   DeclarationNameInfo DirName;
8873   getDerived().getSema().StartOpenMPDSABlock(
8874       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8875       D->getBeginLoc());
8876   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8877   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8878   return Res;
8879 }
8880 
8881 template <typename Derived>
8882 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8883     OMPTeamsDistributeParallelForDirective *D) {
8884   DeclarationNameInfo DirName;
8885   getDerived().getSema().StartOpenMPDSABlock(
8886       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8887   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8888   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8889   return Res;
8890 }
8891 
8892 template <typename Derived>
8893 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8894     OMPTargetTeamsDirective *D) {
8895   DeclarationNameInfo DirName;
8896   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8897                                              nullptr, D->getBeginLoc());
8898   auto Res = getDerived().TransformOMPExecutableDirective(D);
8899   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8900   return Res;
8901 }
8902 
8903 template <typename Derived>
8904 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8905     OMPTargetTeamsDistributeDirective *D) {
8906   DeclarationNameInfo DirName;
8907   getDerived().getSema().StartOpenMPDSABlock(
8908       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8909   auto Res = getDerived().TransformOMPExecutableDirective(D);
8910   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8911   return Res;
8912 }
8913 
8914 template <typename Derived>
8915 StmtResult
8916 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8917     OMPTargetTeamsDistributeParallelForDirective *D) {
8918   DeclarationNameInfo DirName;
8919   getDerived().getSema().StartOpenMPDSABlock(
8920       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8921       D->getBeginLoc());
8922   auto Res = getDerived().TransformOMPExecutableDirective(D);
8923   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8924   return Res;
8925 }
8926 
8927 template <typename Derived>
8928 StmtResult TreeTransform<Derived>::
8929     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8930         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8931   DeclarationNameInfo DirName;
8932   getDerived().getSema().StartOpenMPDSABlock(
8933       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8934       D->getBeginLoc());
8935   auto Res = getDerived().TransformOMPExecutableDirective(D);
8936   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8937   return Res;
8938 }
8939 
8940 template <typename Derived>
8941 StmtResult
8942 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8943     OMPTargetTeamsDistributeSimdDirective *D) {
8944   DeclarationNameInfo DirName;
8945   getDerived().getSema().StartOpenMPDSABlock(
8946       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8947   auto Res = getDerived().TransformOMPExecutableDirective(D);
8948   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8949   return Res;
8950 }
8951 
8952 
8953 //===----------------------------------------------------------------------===//
8954 // OpenMP clause transformation
8955 //===----------------------------------------------------------------------===//
8956 template <typename Derived>
8957 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8958   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8959   if (Cond.isInvalid())
8960     return nullptr;
8961   return getDerived().RebuildOMPIfClause(
8962       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8963       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8964 }
8965 
8966 template <typename Derived>
8967 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8968   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8969   if (Cond.isInvalid())
8970     return nullptr;
8971   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8972                                             C->getLParenLoc(), C->getEndLoc());
8973 }
8974 
8975 template <typename Derived>
8976 OMPClause *
8977 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8978   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8979   if (NumThreads.isInvalid())
8980     return nullptr;
8981   return getDerived().RebuildOMPNumThreadsClause(
8982       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8983 }
8984 
8985 template <typename Derived>
8986 OMPClause *
8987 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8988   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8989   if (E.isInvalid())
8990     return nullptr;
8991   return getDerived().RebuildOMPSafelenClause(
8992       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8993 }
8994 
8995 template <typename Derived>
8996 OMPClause *
8997 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8998   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8999   if (E.isInvalid())
9000     return nullptr;
9001   return getDerived().RebuildOMPAllocatorClause(
9002       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9003 }
9004 
9005 template <typename Derived>
9006 OMPClause *
9007 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9008   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9009   if (E.isInvalid())
9010     return nullptr;
9011   return getDerived().RebuildOMPSimdlenClause(
9012       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9013 }
9014 
9015 template <typename Derived>
9016 OMPClause *
9017 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9018   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9019   if (E.isInvalid())
9020     return nullptr;
9021   return getDerived().RebuildOMPCollapseClause(
9022       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9023 }
9024 
9025 template <typename Derived>
9026 OMPClause *
9027 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9028   return getDerived().RebuildOMPDefaultClause(
9029       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9030       C->getLParenLoc(), C->getEndLoc());
9031 }
9032 
9033 template <typename Derived>
9034 OMPClause *
9035 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9036   return getDerived().RebuildOMPProcBindClause(
9037       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9038       C->getLParenLoc(), C->getEndLoc());
9039 }
9040 
9041 template <typename Derived>
9042 OMPClause *
9043 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9044   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9045   if (E.isInvalid())
9046     return nullptr;
9047   return getDerived().RebuildOMPScheduleClause(
9048       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9049       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9050       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9051       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9052 }
9053 
9054 template <typename Derived>
9055 OMPClause *
9056 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9057   ExprResult E;
9058   if (auto *Num = C->getNumForLoops()) {
9059     E = getDerived().TransformExpr(Num);
9060     if (E.isInvalid())
9061       return nullptr;
9062   }
9063   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9064                                               C->getLParenLoc(), E.get());
9065 }
9066 
9067 template <typename Derived>
9068 OMPClause *
9069 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9070   ExprResult E;
9071   if (Expr *Evt = C->getEventHandler()) {
9072     E = getDerived().TransformExpr(Evt);
9073     if (E.isInvalid())
9074       return nullptr;
9075   }
9076   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9077                                              C->getLParenLoc(), C->getEndLoc());
9078 }
9079 
9080 template <typename Derived>
9081 OMPClause *
9082 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9083   // No need to rebuild this clause, no template-dependent parameters.
9084   return C;
9085 }
9086 
9087 template <typename Derived>
9088 OMPClause *
9089 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9090   // No need to rebuild this clause, no template-dependent parameters.
9091   return C;
9092 }
9093 
9094 template <typename Derived>
9095 OMPClause *
9096 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9097   // No need to rebuild this clause, no template-dependent parameters.
9098   return C;
9099 }
9100 
9101 template <typename Derived>
9102 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9103   // No need to rebuild this clause, no template-dependent parameters.
9104   return C;
9105 }
9106 
9107 template <typename Derived>
9108 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9109   // No need to rebuild this clause, no template-dependent parameters.
9110   return C;
9111 }
9112 
9113 template <typename Derived>
9114 OMPClause *
9115 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9116   // No need to rebuild this clause, no template-dependent parameters.
9117   return C;
9118 }
9119 
9120 template <typename Derived>
9121 OMPClause *
9122 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9123   // No need to rebuild this clause, no template-dependent parameters.
9124   return C;
9125 }
9126 
9127 template <typename Derived>
9128 OMPClause *
9129 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9130   // No need to rebuild this clause, no template-dependent parameters.
9131   return C;
9132 }
9133 
9134 template <typename Derived>
9135 OMPClause *
9136 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9137   // No need to rebuild this clause, no template-dependent parameters.
9138   return C;
9139 }
9140 
9141 template <typename Derived>
9142 OMPClause *
9143 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9144   // No need to rebuild this clause, no template-dependent parameters.
9145   return C;
9146 }
9147 
9148 template <typename Derived>
9149 OMPClause *
9150 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9151   // No need to rebuild this clause, no template-dependent parameters.
9152   return C;
9153 }
9154 
9155 template <typename Derived>
9156 OMPClause *
9157 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9158   // No need to rebuild this clause, no template-dependent parameters.
9159   return C;
9160 }
9161 
9162 template <typename Derived>
9163 OMPClause *
9164 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9165   // No need to rebuild this clause, no template-dependent parameters.
9166   return C;
9167 }
9168 
9169 template <typename Derived>
9170 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9171   // No need to rebuild this clause, no template-dependent parameters.
9172   return C;
9173 }
9174 
9175 template <typename Derived>
9176 OMPClause *
9177 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9178   // No need to rebuild this clause, no template-dependent parameters.
9179   return C;
9180 }
9181 
9182 template <typename Derived>
9183 OMPClause *
9184 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9185   // No need to rebuild this clause, no template-dependent parameters.
9186   return C;
9187 }
9188 
9189 template <typename Derived>
9190 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9191     OMPUnifiedAddressClause *C) {
9192   llvm_unreachable("unified_address clause cannot appear in dependent context");
9193 }
9194 
9195 template <typename Derived>
9196 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9197     OMPUnifiedSharedMemoryClause *C) {
9198   llvm_unreachable(
9199       "unified_shared_memory clause cannot appear in dependent context");
9200 }
9201 
9202 template <typename Derived>
9203 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9204     OMPReverseOffloadClause *C) {
9205   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9206 }
9207 
9208 template <typename Derived>
9209 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9210     OMPDynamicAllocatorsClause *C) {
9211   llvm_unreachable(
9212       "dynamic_allocators clause cannot appear in dependent context");
9213 }
9214 
9215 template <typename Derived>
9216 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9217     OMPAtomicDefaultMemOrderClause *C) {
9218   llvm_unreachable(
9219       "atomic_default_mem_order clause cannot appear in dependent context");
9220 }
9221 
9222 template <typename Derived>
9223 OMPClause *
9224 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9225   llvm::SmallVector<Expr *, 16> Vars;
9226   Vars.reserve(C->varlist_size());
9227   for (auto *VE : C->varlists()) {
9228     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9229     if (EVar.isInvalid())
9230       return nullptr;
9231     Vars.push_back(EVar.get());
9232   }
9233   return getDerived().RebuildOMPPrivateClause(
9234       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9235 }
9236 
9237 template <typename Derived>
9238 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9239     OMPFirstprivateClause *C) {
9240   llvm::SmallVector<Expr *, 16> Vars;
9241   Vars.reserve(C->varlist_size());
9242   for (auto *VE : C->varlists()) {
9243     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9244     if (EVar.isInvalid())
9245       return nullptr;
9246     Vars.push_back(EVar.get());
9247   }
9248   return getDerived().RebuildOMPFirstprivateClause(
9249       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9250 }
9251 
9252 template <typename Derived>
9253 OMPClause *
9254 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9255   llvm::SmallVector<Expr *, 16> Vars;
9256   Vars.reserve(C->varlist_size());
9257   for (auto *VE : C->varlists()) {
9258     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9259     if (EVar.isInvalid())
9260       return nullptr;
9261     Vars.push_back(EVar.get());
9262   }
9263   return getDerived().RebuildOMPLastprivateClause(
9264       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9265       C->getLParenLoc(), C->getEndLoc());
9266 }
9267 
9268 template <typename Derived>
9269 OMPClause *
9270 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9271   llvm::SmallVector<Expr *, 16> Vars;
9272   Vars.reserve(C->varlist_size());
9273   for (auto *VE : C->varlists()) {
9274     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9275     if (EVar.isInvalid())
9276       return nullptr;
9277     Vars.push_back(EVar.get());
9278   }
9279   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9280                                              C->getLParenLoc(), C->getEndLoc());
9281 }
9282 
9283 template <typename Derived>
9284 OMPClause *
9285 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9286   llvm::SmallVector<Expr *, 16> Vars;
9287   Vars.reserve(C->varlist_size());
9288   for (auto *VE : C->varlists()) {
9289     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9290     if (EVar.isInvalid())
9291       return nullptr;
9292     Vars.push_back(EVar.get());
9293   }
9294   CXXScopeSpec ReductionIdScopeSpec;
9295   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9296 
9297   DeclarationNameInfo NameInfo = C->getNameInfo();
9298   if (NameInfo.getName()) {
9299     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9300     if (!NameInfo.getName())
9301       return nullptr;
9302   }
9303   // Build a list of all UDR decls with the same names ranged by the Scopes.
9304   // The Scope boundary is a duplication of the previous decl.
9305   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9306   for (auto *E : C->reduction_ops()) {
9307     // Transform all the decls.
9308     if (E) {
9309       auto *ULE = cast<UnresolvedLookupExpr>(E);
9310       UnresolvedSet<8> Decls;
9311       for (auto *D : ULE->decls()) {
9312         NamedDecl *InstD =
9313             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9314         Decls.addDecl(InstD, InstD->getAccess());
9315       }
9316       UnresolvedReductions.push_back(
9317        UnresolvedLookupExpr::Create(
9318           SemaRef.Context, /*NamingClass=*/nullptr,
9319           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9320           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9321           Decls.begin(), Decls.end()));
9322     } else
9323       UnresolvedReductions.push_back(nullptr);
9324   }
9325   return getDerived().RebuildOMPReductionClause(
9326       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9327       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9328       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9329 }
9330 
9331 template <typename Derived>
9332 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9333     OMPTaskReductionClause *C) {
9334   llvm::SmallVector<Expr *, 16> Vars;
9335   Vars.reserve(C->varlist_size());
9336   for (auto *VE : C->varlists()) {
9337     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9338     if (EVar.isInvalid())
9339       return nullptr;
9340     Vars.push_back(EVar.get());
9341   }
9342   CXXScopeSpec ReductionIdScopeSpec;
9343   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9344 
9345   DeclarationNameInfo NameInfo = C->getNameInfo();
9346   if (NameInfo.getName()) {
9347     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9348     if (!NameInfo.getName())
9349       return nullptr;
9350   }
9351   // Build a list of all UDR decls with the same names ranged by the Scopes.
9352   // The Scope boundary is a duplication of the previous decl.
9353   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9354   for (auto *E : C->reduction_ops()) {
9355     // Transform all the decls.
9356     if (E) {
9357       auto *ULE = cast<UnresolvedLookupExpr>(E);
9358       UnresolvedSet<8> Decls;
9359       for (auto *D : ULE->decls()) {
9360         NamedDecl *InstD =
9361             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9362         Decls.addDecl(InstD, InstD->getAccess());
9363       }
9364       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9365           SemaRef.Context, /*NamingClass=*/nullptr,
9366           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9367           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9368     } else
9369       UnresolvedReductions.push_back(nullptr);
9370   }
9371   return getDerived().RebuildOMPTaskReductionClause(
9372       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9373       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9374 }
9375 
9376 template <typename Derived>
9377 OMPClause *
9378 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9379   llvm::SmallVector<Expr *, 16> Vars;
9380   Vars.reserve(C->varlist_size());
9381   for (auto *VE : C->varlists()) {
9382     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9383     if (EVar.isInvalid())
9384       return nullptr;
9385     Vars.push_back(EVar.get());
9386   }
9387   CXXScopeSpec ReductionIdScopeSpec;
9388   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9389 
9390   DeclarationNameInfo NameInfo = C->getNameInfo();
9391   if (NameInfo.getName()) {
9392     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9393     if (!NameInfo.getName())
9394       return nullptr;
9395   }
9396   // Build a list of all UDR decls with the same names ranged by the Scopes.
9397   // The Scope boundary is a duplication of the previous decl.
9398   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9399   for (auto *E : C->reduction_ops()) {
9400     // Transform all the decls.
9401     if (E) {
9402       auto *ULE = cast<UnresolvedLookupExpr>(E);
9403       UnresolvedSet<8> Decls;
9404       for (auto *D : ULE->decls()) {
9405         NamedDecl *InstD =
9406             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9407         Decls.addDecl(InstD, InstD->getAccess());
9408       }
9409       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9410           SemaRef.Context, /*NamingClass=*/nullptr,
9411           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9412           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9413     } else
9414       UnresolvedReductions.push_back(nullptr);
9415   }
9416   return getDerived().RebuildOMPInReductionClause(
9417       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9418       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9419 }
9420 
9421 template <typename Derived>
9422 OMPClause *
9423 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9424   llvm::SmallVector<Expr *, 16> Vars;
9425   Vars.reserve(C->varlist_size());
9426   for (auto *VE : C->varlists()) {
9427     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9428     if (EVar.isInvalid())
9429       return nullptr;
9430     Vars.push_back(EVar.get());
9431   }
9432   ExprResult Step = getDerived().TransformExpr(C->getStep());
9433   if (Step.isInvalid())
9434     return nullptr;
9435   return getDerived().RebuildOMPLinearClause(
9436       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9437       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9438 }
9439 
9440 template <typename Derived>
9441 OMPClause *
9442 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9443   llvm::SmallVector<Expr *, 16> Vars;
9444   Vars.reserve(C->varlist_size());
9445   for (auto *VE : C->varlists()) {
9446     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9447     if (EVar.isInvalid())
9448       return nullptr;
9449     Vars.push_back(EVar.get());
9450   }
9451   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9452   if (Alignment.isInvalid())
9453     return nullptr;
9454   return getDerived().RebuildOMPAlignedClause(
9455       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9456       C->getColonLoc(), C->getEndLoc());
9457 }
9458 
9459 template <typename Derived>
9460 OMPClause *
9461 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9462   llvm::SmallVector<Expr *, 16> Vars;
9463   Vars.reserve(C->varlist_size());
9464   for (auto *VE : C->varlists()) {
9465     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9466     if (EVar.isInvalid())
9467       return nullptr;
9468     Vars.push_back(EVar.get());
9469   }
9470   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9471                                              C->getLParenLoc(), C->getEndLoc());
9472 }
9473 
9474 template <typename Derived>
9475 OMPClause *
9476 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9477   llvm::SmallVector<Expr *, 16> Vars;
9478   Vars.reserve(C->varlist_size());
9479   for (auto *VE : C->varlists()) {
9480     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9481     if (EVar.isInvalid())
9482       return nullptr;
9483     Vars.push_back(EVar.get());
9484   }
9485   return getDerived().RebuildOMPCopyprivateClause(
9486       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9487 }
9488 
9489 template <typename Derived>
9490 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9491   llvm::SmallVector<Expr *, 16> Vars;
9492   Vars.reserve(C->varlist_size());
9493   for (auto *VE : C->varlists()) {
9494     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9495     if (EVar.isInvalid())
9496       return nullptr;
9497     Vars.push_back(EVar.get());
9498   }
9499   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9500                                             C->getLParenLoc(), C->getEndLoc());
9501 }
9502 
9503 template <typename Derived>
9504 OMPClause *
9505 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9506   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9507   if (E.isInvalid())
9508     return nullptr;
9509   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9510                                              C->getLParenLoc(), C->getEndLoc());
9511 }
9512 
9513 template <typename Derived>
9514 OMPClause *
9515 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9516   llvm::SmallVector<Expr *, 16> Vars;
9517   Expr *DepModifier = C->getModifier();
9518   if (DepModifier) {
9519     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9520     if (DepModRes.isInvalid())
9521       return nullptr;
9522     DepModifier = DepModRes.get();
9523   }
9524   Vars.reserve(C->varlist_size());
9525   for (auto *VE : C->varlists()) {
9526     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9527     if (EVar.isInvalid())
9528       return nullptr;
9529     Vars.push_back(EVar.get());
9530   }
9531   return getDerived().RebuildOMPDependClause(
9532       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9533       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9534       C->getEndLoc());
9535 }
9536 
9537 template <typename Derived>
9538 OMPClause *
9539 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9540   ExprResult E = getDerived().TransformExpr(C->getDevice());
9541   if (E.isInvalid())
9542     return nullptr;
9543   return getDerived().RebuildOMPDeviceClause(
9544       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9545       C->getModifierLoc(), C->getEndLoc());
9546 }
9547 
9548 template <typename Derived, class T>
9549 bool transformOMPMappableExprListClause(
9550     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9551     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9552     DeclarationNameInfo &MapperIdInfo,
9553     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9554   // Transform expressions in the list.
9555   Vars.reserve(C->varlist_size());
9556   for (auto *VE : C->varlists()) {
9557     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9558     if (EVar.isInvalid())
9559       return true;
9560     Vars.push_back(EVar.get());
9561   }
9562   // Transform mapper scope specifier and identifier.
9563   NestedNameSpecifierLoc QualifierLoc;
9564   if (C->getMapperQualifierLoc()) {
9565     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9566         C->getMapperQualifierLoc());
9567     if (!QualifierLoc)
9568       return true;
9569   }
9570   MapperIdScopeSpec.Adopt(QualifierLoc);
9571   MapperIdInfo = C->getMapperIdInfo();
9572   if (MapperIdInfo.getName()) {
9573     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9574     if (!MapperIdInfo.getName())
9575       return true;
9576   }
9577   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9578   // the previous user-defined mapper lookup in dependent environment.
9579   for (auto *E : C->mapperlists()) {
9580     // Transform all the decls.
9581     if (E) {
9582       auto *ULE = cast<UnresolvedLookupExpr>(E);
9583       UnresolvedSet<8> Decls;
9584       for (auto *D : ULE->decls()) {
9585         NamedDecl *InstD =
9586             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9587         Decls.addDecl(InstD, InstD->getAccess());
9588       }
9589       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9590           TT.getSema().Context, /*NamingClass=*/nullptr,
9591           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9592           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9593           Decls.end()));
9594     } else {
9595       UnresolvedMappers.push_back(nullptr);
9596     }
9597   }
9598   return false;
9599 }
9600 
9601 template <typename Derived>
9602 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9603   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9604   llvm::SmallVector<Expr *, 16> Vars;
9605   CXXScopeSpec MapperIdScopeSpec;
9606   DeclarationNameInfo MapperIdInfo;
9607   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9608   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9609           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9610     return nullptr;
9611   return getDerived().RebuildOMPMapClause(
9612       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9613       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9614       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9615 }
9616 
9617 template <typename Derived>
9618 OMPClause *
9619 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9620   Expr *Allocator = C->getAllocator();
9621   if (Allocator) {
9622     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9623     if (AllocatorRes.isInvalid())
9624       return nullptr;
9625     Allocator = AllocatorRes.get();
9626   }
9627   llvm::SmallVector<Expr *, 16> Vars;
9628   Vars.reserve(C->varlist_size());
9629   for (auto *VE : C->varlists()) {
9630     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9631     if (EVar.isInvalid())
9632       return nullptr;
9633     Vars.push_back(EVar.get());
9634   }
9635   return getDerived().RebuildOMPAllocateClause(
9636       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9637       C->getEndLoc());
9638 }
9639 
9640 template <typename Derived>
9641 OMPClause *
9642 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9643   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9644   if (E.isInvalid())
9645     return nullptr;
9646   return getDerived().RebuildOMPNumTeamsClause(
9647       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9648 }
9649 
9650 template <typename Derived>
9651 OMPClause *
9652 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9653   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9654   if (E.isInvalid())
9655     return nullptr;
9656   return getDerived().RebuildOMPThreadLimitClause(
9657       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9658 }
9659 
9660 template <typename Derived>
9661 OMPClause *
9662 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9663   ExprResult E = getDerived().TransformExpr(C->getPriority());
9664   if (E.isInvalid())
9665     return nullptr;
9666   return getDerived().RebuildOMPPriorityClause(
9667       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9668 }
9669 
9670 template <typename Derived>
9671 OMPClause *
9672 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9673   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9674   if (E.isInvalid())
9675     return nullptr;
9676   return getDerived().RebuildOMPGrainsizeClause(
9677       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9678 }
9679 
9680 template <typename Derived>
9681 OMPClause *
9682 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9683   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9684   if (E.isInvalid())
9685     return nullptr;
9686   return getDerived().RebuildOMPNumTasksClause(
9687       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9688 }
9689 
9690 template <typename Derived>
9691 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9692   ExprResult E = getDerived().TransformExpr(C->getHint());
9693   if (E.isInvalid())
9694     return nullptr;
9695   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9696                                            C->getLParenLoc(), C->getEndLoc());
9697 }
9698 
9699 template <typename Derived>
9700 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9701     OMPDistScheduleClause *C) {
9702   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9703   if (E.isInvalid())
9704     return nullptr;
9705   return getDerived().RebuildOMPDistScheduleClause(
9706       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9707       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9708 }
9709 
9710 template <typename Derived>
9711 OMPClause *
9712 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9713   // Rebuild Defaultmap Clause since we need to invoke the checking of
9714   // defaultmap(none:variable-category) after template initialization.
9715   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9716                                                  C->getDefaultmapKind(),
9717                                                  C->getBeginLoc(),
9718                                                  C->getLParenLoc(),
9719                                                  C->getDefaultmapModifierLoc(),
9720                                                  C->getDefaultmapKindLoc(),
9721                                                  C->getEndLoc());
9722 }
9723 
9724 template <typename Derived>
9725 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9726   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9727   llvm::SmallVector<Expr *, 16> Vars;
9728   CXXScopeSpec MapperIdScopeSpec;
9729   DeclarationNameInfo MapperIdInfo;
9730   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9731   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9732           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9733     return nullptr;
9734   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9735                                          Locs, UnresolvedMappers);
9736 }
9737 
9738 template <typename Derived>
9739 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9740   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9741   llvm::SmallVector<Expr *, 16> Vars;
9742   CXXScopeSpec MapperIdScopeSpec;
9743   DeclarationNameInfo MapperIdInfo;
9744   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9745   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9746           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9747     return nullptr;
9748   return getDerived().RebuildOMPFromClause(
9749       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9750 }
9751 
9752 template <typename Derived>
9753 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9754     OMPUseDevicePtrClause *C) {
9755   llvm::SmallVector<Expr *, 16> Vars;
9756   Vars.reserve(C->varlist_size());
9757   for (auto *VE : C->varlists()) {
9758     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9759     if (EVar.isInvalid())
9760       return nullptr;
9761     Vars.push_back(EVar.get());
9762   }
9763   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9764   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9765 }
9766 
9767 template <typename Derived>
9768 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
9769     OMPUseDeviceAddrClause *C) {
9770   llvm::SmallVector<Expr *, 16> Vars;
9771   Vars.reserve(C->varlist_size());
9772   for (auto *VE : C->varlists()) {
9773     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9774     if (EVar.isInvalid())
9775       return nullptr;
9776     Vars.push_back(EVar.get());
9777   }
9778   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9779   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
9780 }
9781 
9782 template <typename Derived>
9783 OMPClause *
9784 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9785   llvm::SmallVector<Expr *, 16> Vars;
9786   Vars.reserve(C->varlist_size());
9787   for (auto *VE : C->varlists()) {
9788     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9789     if (EVar.isInvalid())
9790       return nullptr;
9791     Vars.push_back(EVar.get());
9792   }
9793   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9794   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9795 }
9796 
9797 template <typename Derived>
9798 OMPClause *
9799 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9800   llvm::SmallVector<Expr *, 16> Vars;
9801   Vars.reserve(C->varlist_size());
9802   for (auto *VE : C->varlists()) {
9803     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9804     if (EVar.isInvalid())
9805       return nullptr;
9806     Vars.push_back(EVar.get());
9807   }
9808   return getDerived().RebuildOMPNontemporalClause(
9809       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9810 }
9811 
9812 template <typename Derived>
9813 OMPClause *
9814 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
9815   llvm::SmallVector<Expr *, 16> Vars;
9816   Vars.reserve(C->varlist_size());
9817   for (auto *VE : C->varlists()) {
9818     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9819     if (EVar.isInvalid())
9820       return nullptr;
9821     Vars.push_back(EVar.get());
9822   }
9823   return getDerived().RebuildOMPInclusiveClause(
9824       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9825 }
9826 
9827 template <typename Derived>
9828 OMPClause *
9829 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
9830   llvm::SmallVector<Expr *, 16> Vars;
9831   Vars.reserve(C->varlist_size());
9832   for (auto *VE : C->varlists()) {
9833     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9834     if (EVar.isInvalid())
9835       return nullptr;
9836     Vars.push_back(EVar.get());
9837   }
9838   return getDerived().RebuildOMPExclusiveClause(
9839       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9840 }
9841 
9842 template <typename Derived>
9843 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
9844     OMPUsesAllocatorsClause *C) {
9845   SmallVector<Sema::UsesAllocatorsData, 16> Data;
9846   Data.reserve(C->getNumberOfAllocators());
9847   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
9848     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
9849     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
9850     if (Allocator.isInvalid())
9851       continue;
9852     ExprResult AllocatorTraits;
9853     if (Expr *AT = D.AllocatorTraits) {
9854       AllocatorTraits = getDerived().TransformExpr(AT);
9855       if (AllocatorTraits.isInvalid())
9856         continue;
9857     }
9858     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
9859     NewD.Allocator = Allocator.get();
9860     NewD.AllocatorTraits = AllocatorTraits.get();
9861     NewD.LParenLoc = D.LParenLoc;
9862     NewD.RParenLoc = D.RParenLoc;
9863   }
9864   return getDerived().RebuildOMPUsesAllocatorsClause(
9865       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9866 }
9867 
9868 template <typename Derived>
9869 OMPClause *
9870 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
9871   SmallVector<Expr *, 4> Locators;
9872   Locators.reserve(C->varlist_size());
9873   ExprResult ModifierRes;
9874   if (Expr *Modifier = C->getModifier()) {
9875     ModifierRes = getDerived().TransformExpr(Modifier);
9876     if (ModifierRes.isInvalid())
9877       return nullptr;
9878   }
9879   for (Expr *E : C->varlists()) {
9880     ExprResult Locator = getDerived().TransformExpr(E);
9881     if (Locator.isInvalid())
9882       continue;
9883     Locators.push_back(Locator.get());
9884   }
9885   return getDerived().RebuildOMPAffinityClause(
9886       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
9887       ModifierRes.get(), Locators);
9888 }
9889 
9890 template <typename Derived>
9891 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9892   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9893                                             C->getBeginLoc(), C->getLParenLoc(),
9894                                             C->getEndLoc());
9895 }
9896 
9897 //===----------------------------------------------------------------------===//
9898 // Expression transformation
9899 //===----------------------------------------------------------------------===//
9900 template<typename Derived>
9901 ExprResult
9902 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9903   return TransformExpr(E->getSubExpr());
9904 }
9905 
9906 template<typename Derived>
9907 ExprResult
9908 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9909   if (!E->isTypeDependent())
9910     return E;
9911 
9912   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9913                                             E->getIdentKind());
9914 }
9915 
9916 template<typename Derived>
9917 ExprResult
9918 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9919   NestedNameSpecifierLoc QualifierLoc;
9920   if (E->getQualifierLoc()) {
9921     QualifierLoc
9922       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9923     if (!QualifierLoc)
9924       return ExprError();
9925   }
9926 
9927   ValueDecl *ND
9928     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9929                                                          E->getDecl()));
9930   if (!ND)
9931     return ExprError();
9932 
9933   NamedDecl *Found = ND;
9934   if (E->getFoundDecl() != E->getDecl()) {
9935     Found = cast_or_null<NamedDecl>(
9936         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9937     if (!Found)
9938       return ExprError();
9939   }
9940 
9941   DeclarationNameInfo NameInfo = E->getNameInfo();
9942   if (NameInfo.getName()) {
9943     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9944     if (!NameInfo.getName())
9945       return ExprError();
9946   }
9947 
9948   if (!getDerived().AlwaysRebuild() &&
9949       QualifierLoc == E->getQualifierLoc() &&
9950       ND == E->getDecl() &&
9951       Found == E->getFoundDecl() &&
9952       NameInfo.getName() == E->getDecl()->getDeclName() &&
9953       !E->hasExplicitTemplateArgs()) {
9954 
9955     // Mark it referenced in the new context regardless.
9956     // FIXME: this is a bit instantiation-specific.
9957     SemaRef.MarkDeclRefReferenced(E);
9958 
9959     return E;
9960   }
9961 
9962   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9963   if (E->hasExplicitTemplateArgs()) {
9964     TemplateArgs = &TransArgs;
9965     TransArgs.setLAngleLoc(E->getLAngleLoc());
9966     TransArgs.setRAngleLoc(E->getRAngleLoc());
9967     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9968                                                 E->getNumTemplateArgs(),
9969                                                 TransArgs))
9970       return ExprError();
9971   }
9972 
9973   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9974                                          Found, TemplateArgs);
9975 }
9976 
9977 template<typename Derived>
9978 ExprResult
9979 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9980   return E;
9981 }
9982 
9983 template <typename Derived>
9984 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9985     FixedPointLiteral *E) {
9986   return E;
9987 }
9988 
9989 template<typename Derived>
9990 ExprResult
9991 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9992   return E;
9993 }
9994 
9995 template<typename Derived>
9996 ExprResult
9997 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9998   return E;
9999 }
10000 
10001 template<typename Derived>
10002 ExprResult
10003 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10004   return E;
10005 }
10006 
10007 template<typename Derived>
10008 ExprResult
10009 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10010   return E;
10011 }
10012 
10013 template<typename Derived>
10014 ExprResult
10015 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10016   if (FunctionDecl *FD = E->getDirectCallee())
10017     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10018   return SemaRef.MaybeBindToTemporary(E);
10019 }
10020 
10021 template<typename Derived>
10022 ExprResult
10023 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10024   ExprResult ControllingExpr =
10025     getDerived().TransformExpr(E->getControllingExpr());
10026   if (ControllingExpr.isInvalid())
10027     return ExprError();
10028 
10029   SmallVector<Expr *, 4> AssocExprs;
10030   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10031   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10032     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10033     if (TSI) {
10034       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10035       if (!AssocType)
10036         return ExprError();
10037       AssocTypes.push_back(AssocType);
10038     } else {
10039       AssocTypes.push_back(nullptr);
10040     }
10041 
10042     ExprResult AssocExpr =
10043         getDerived().TransformExpr(Assoc.getAssociationExpr());
10044     if (AssocExpr.isInvalid())
10045       return ExprError();
10046     AssocExprs.push_back(AssocExpr.get());
10047   }
10048 
10049   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10050                                                   E->getDefaultLoc(),
10051                                                   E->getRParenLoc(),
10052                                                   ControllingExpr.get(),
10053                                                   AssocTypes,
10054                                                   AssocExprs);
10055 }
10056 
10057 template<typename Derived>
10058 ExprResult
10059 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10060   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10061   if (SubExpr.isInvalid())
10062     return ExprError();
10063 
10064   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10065     return E;
10066 
10067   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10068                                        E->getRParen());
10069 }
10070 
10071 /// The operand of a unary address-of operator has special rules: it's
10072 /// allowed to refer to a non-static member of a class even if there's no 'this'
10073 /// object available.
10074 template<typename Derived>
10075 ExprResult
10076 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10077   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10078     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10079   else
10080     return getDerived().TransformExpr(E);
10081 }
10082 
10083 template<typename Derived>
10084 ExprResult
10085 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10086   ExprResult SubExpr;
10087   if (E->getOpcode() == UO_AddrOf)
10088     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10089   else
10090     SubExpr = TransformExpr(E->getSubExpr());
10091   if (SubExpr.isInvalid())
10092     return ExprError();
10093 
10094   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10095     return E;
10096 
10097   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10098                                            E->getOpcode(),
10099                                            SubExpr.get());
10100 }
10101 
10102 template<typename Derived>
10103 ExprResult
10104 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10105   // Transform the type.
10106   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10107   if (!Type)
10108     return ExprError();
10109 
10110   // Transform all of the components into components similar to what the
10111   // parser uses.
10112   // FIXME: It would be slightly more efficient in the non-dependent case to
10113   // just map FieldDecls, rather than requiring the rebuilder to look for
10114   // the fields again. However, __builtin_offsetof is rare enough in
10115   // template code that we don't care.
10116   bool ExprChanged = false;
10117   typedef Sema::OffsetOfComponent Component;
10118   SmallVector<Component, 4> Components;
10119   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10120     const OffsetOfNode &ON = E->getComponent(I);
10121     Component Comp;
10122     Comp.isBrackets = true;
10123     Comp.LocStart = ON.getSourceRange().getBegin();
10124     Comp.LocEnd = ON.getSourceRange().getEnd();
10125     switch (ON.getKind()) {
10126     case OffsetOfNode::Array: {
10127       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10128       ExprResult Index = getDerived().TransformExpr(FromIndex);
10129       if (Index.isInvalid())
10130         return ExprError();
10131 
10132       ExprChanged = ExprChanged || Index.get() != FromIndex;
10133       Comp.isBrackets = true;
10134       Comp.U.E = Index.get();
10135       break;
10136     }
10137 
10138     case OffsetOfNode::Field:
10139     case OffsetOfNode::Identifier:
10140       Comp.isBrackets = false;
10141       Comp.U.IdentInfo = ON.getFieldName();
10142       if (!Comp.U.IdentInfo)
10143         continue;
10144 
10145       break;
10146 
10147     case OffsetOfNode::Base:
10148       // Will be recomputed during the rebuild.
10149       continue;
10150     }
10151 
10152     Components.push_back(Comp);
10153   }
10154 
10155   // If nothing changed, retain the existing expression.
10156   if (!getDerived().AlwaysRebuild() &&
10157       Type == E->getTypeSourceInfo() &&
10158       !ExprChanged)
10159     return E;
10160 
10161   // Build a new offsetof expression.
10162   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10163                                           Components, E->getRParenLoc());
10164 }
10165 
10166 template<typename Derived>
10167 ExprResult
10168 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10169   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10170          "opaque value expression requires transformation");
10171   return E;
10172 }
10173 
10174 template<typename Derived>
10175 ExprResult
10176 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10177   return E;
10178 }
10179 
10180 template <typename Derived>
10181 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10182   llvm::SmallVector<Expr *, 8> Children;
10183   bool Changed = false;
10184   for (Expr *C : E->subExpressions()) {
10185     ExprResult NewC = getDerived().TransformExpr(C);
10186     if (NewC.isInvalid())
10187       return ExprError();
10188     Children.push_back(NewC.get());
10189 
10190     Changed |= NewC.get() != C;
10191   }
10192   if (!getDerived().AlwaysRebuild() && !Changed)
10193     return E;
10194   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10195                                           Children);
10196 }
10197 
10198 template<typename Derived>
10199 ExprResult
10200 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10201   // Rebuild the syntactic form.  The original syntactic form has
10202   // opaque-value expressions in it, so strip those away and rebuild
10203   // the result.  This is a really awful way of doing this, but the
10204   // better solution (rebuilding the semantic expressions and
10205   // rebinding OVEs as necessary) doesn't work; we'd need
10206   // TreeTransform to not strip away implicit conversions.
10207   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10208   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10209   if (result.isInvalid()) return ExprError();
10210 
10211   // If that gives us a pseudo-object result back, the pseudo-object
10212   // expression must have been an lvalue-to-rvalue conversion which we
10213   // should reapply.
10214   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10215     result = SemaRef.checkPseudoObjectRValue(result.get());
10216 
10217   return result;
10218 }
10219 
10220 template<typename Derived>
10221 ExprResult
10222 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10223                                                 UnaryExprOrTypeTraitExpr *E) {
10224   if (E->isArgumentType()) {
10225     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10226 
10227     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10228     if (!NewT)
10229       return ExprError();
10230 
10231     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10232       return E;
10233 
10234     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10235                                                     E->getKind(),
10236                                                     E->getSourceRange());
10237   }
10238 
10239   // C++0x [expr.sizeof]p1:
10240   //   The operand is either an expression, which is an unevaluated operand
10241   //   [...]
10242   EnterExpressionEvaluationContext Unevaluated(
10243       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10244       Sema::ReuseLambdaContextDecl);
10245 
10246   // Try to recover if we have something like sizeof(T::X) where X is a type.
10247   // Notably, there must be *exactly* one set of parens if X is a type.
10248   TypeSourceInfo *RecoveryTSI = nullptr;
10249   ExprResult SubExpr;
10250   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10251   if (auto *DRE =
10252           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10253     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10254         PE, DRE, false, &RecoveryTSI);
10255   else
10256     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10257 
10258   if (RecoveryTSI) {
10259     return getDerived().RebuildUnaryExprOrTypeTrait(
10260         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10261   } else if (SubExpr.isInvalid())
10262     return ExprError();
10263 
10264   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10265     return E;
10266 
10267   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10268                                                   E->getOperatorLoc(),
10269                                                   E->getKind(),
10270                                                   E->getSourceRange());
10271 }
10272 
10273 template<typename Derived>
10274 ExprResult
10275 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10276   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10277   if (LHS.isInvalid())
10278     return ExprError();
10279 
10280   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10281   if (RHS.isInvalid())
10282     return ExprError();
10283 
10284 
10285   if (!getDerived().AlwaysRebuild() &&
10286       LHS.get() == E->getLHS() &&
10287       RHS.get() == E->getRHS())
10288     return E;
10289 
10290   return getDerived().RebuildArraySubscriptExpr(
10291       LHS.get(),
10292       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10293 }
10294 
10295 template <typename Derived>
10296 ExprResult
10297 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10298   ExprResult Base = getDerived().TransformExpr(E->getBase());
10299   if (Base.isInvalid())
10300     return ExprError();
10301 
10302   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10303   if (RowIdx.isInvalid())
10304     return ExprError();
10305 
10306   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10307   if (ColumnIdx.isInvalid())
10308     return ExprError();
10309 
10310   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10311       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10312     return E;
10313 
10314   return getDerived().RebuildMatrixSubscriptExpr(
10315       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10316 }
10317 
10318 template <typename Derived>
10319 ExprResult
10320 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10321   ExprResult Base = getDerived().TransformExpr(E->getBase());
10322   if (Base.isInvalid())
10323     return ExprError();
10324 
10325   ExprResult LowerBound;
10326   if (E->getLowerBound()) {
10327     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10328     if (LowerBound.isInvalid())
10329       return ExprError();
10330   }
10331 
10332   ExprResult Length;
10333   if (E->getLength()) {
10334     Length = getDerived().TransformExpr(E->getLength());
10335     if (Length.isInvalid())
10336       return ExprError();
10337   }
10338 
10339   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10340       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10341     return E;
10342 
10343   return getDerived().RebuildOMPArraySectionExpr(
10344       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
10345       Length.get(), E->getRBracketLoc());
10346 }
10347 
10348 template <typename Derived>
10349 ExprResult
10350 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10351   ExprResult Base = getDerived().TransformExpr(E->getBase());
10352   if (Base.isInvalid())
10353     return ExprError();
10354 
10355   SmallVector<Expr *, 4> Dims;
10356   bool ErrorFound = false;
10357   for (Expr *Dim : E->getDimensions()) {
10358     ExprResult DimRes = getDerived().TransformExpr(Dim);
10359     if (DimRes.isInvalid()) {
10360       ErrorFound = true;
10361       continue;
10362     }
10363     Dims.push_back(DimRes.get());
10364   }
10365 
10366   if (ErrorFound)
10367     return ExprError();
10368   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10369                                                  E->getRParenLoc(), Dims,
10370                                                  E->getBracketsRanges());
10371 }
10372 
10373 template <typename Derived>
10374 ExprResult
10375 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10376   unsigned NumIterators = E->numOfIterators();
10377   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10378 
10379   bool ErrorFound = false;
10380   bool NeedToRebuild = getDerived().AlwaysRebuild();
10381   for (unsigned I = 0; I < NumIterators; ++I) {
10382     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10383     Data[I].DeclIdent = D->getIdentifier();
10384     Data[I].DeclIdentLoc = D->getLocation();
10385     if (D->getLocation() == D->getBeginLoc()) {
10386       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10387              "Implicit type must be int.");
10388     } else {
10389       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10390       QualType DeclTy = getDerived().TransformType(D->getType());
10391       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10392     }
10393     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10394     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10395     ExprResult End = getDerived().TransformExpr(Range.End);
10396     ExprResult Step = getDerived().TransformExpr(Range.Step);
10397     ErrorFound = ErrorFound ||
10398                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10399                                                !Data[I].Type.get().isNull())) ||
10400                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10401     if (ErrorFound)
10402       continue;
10403     Data[I].Range.Begin = Begin.get();
10404     Data[I].Range.End = End.get();
10405     Data[I].Range.Step = Step.get();
10406     Data[I].AssignLoc = E->getAssignLoc(I);
10407     Data[I].ColonLoc = E->getColonLoc(I);
10408     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10409     NeedToRebuild =
10410         NeedToRebuild ||
10411         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10412                                        D->getType().getTypePtrOrNull()) ||
10413         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10414         Range.Step != Data[I].Range.Step;
10415   }
10416   if (ErrorFound)
10417     return ExprError();
10418   if (!NeedToRebuild)
10419     return E;
10420 
10421   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10422       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10423   if (!Res.isUsable())
10424     return Res;
10425   auto *IE = cast<OMPIteratorExpr>(Res.get());
10426   for (unsigned I = 0; I < NumIterators; ++I)
10427     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10428                                       IE->getIteratorDecl(I));
10429   return Res;
10430 }
10431 
10432 template<typename Derived>
10433 ExprResult
10434 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10435   // Transform the callee.
10436   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10437   if (Callee.isInvalid())
10438     return ExprError();
10439 
10440   // Transform arguments.
10441   bool ArgChanged = false;
10442   SmallVector<Expr*, 8> Args;
10443   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10444                                   &ArgChanged))
10445     return ExprError();
10446 
10447   if (!getDerived().AlwaysRebuild() &&
10448       Callee.get() == E->getCallee() &&
10449       !ArgChanged)
10450     return SemaRef.MaybeBindToTemporary(E);
10451 
10452   // FIXME: Wrong source location information for the '('.
10453   SourceLocation FakeLParenLoc
10454     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10455   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10456                                       Args,
10457                                       E->getRParenLoc());
10458 }
10459 
10460 template<typename Derived>
10461 ExprResult
10462 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10463   ExprResult Base = getDerived().TransformExpr(E->getBase());
10464   if (Base.isInvalid())
10465     return ExprError();
10466 
10467   NestedNameSpecifierLoc QualifierLoc;
10468   if (E->hasQualifier()) {
10469     QualifierLoc
10470       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10471 
10472     if (!QualifierLoc)
10473       return ExprError();
10474   }
10475   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10476 
10477   ValueDecl *Member
10478     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10479                                                          E->getMemberDecl()));
10480   if (!Member)
10481     return ExprError();
10482 
10483   NamedDecl *FoundDecl = E->getFoundDecl();
10484   if (FoundDecl == E->getMemberDecl()) {
10485     FoundDecl = Member;
10486   } else {
10487     FoundDecl = cast_or_null<NamedDecl>(
10488                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10489     if (!FoundDecl)
10490       return ExprError();
10491   }
10492 
10493   if (!getDerived().AlwaysRebuild() &&
10494       Base.get() == E->getBase() &&
10495       QualifierLoc == E->getQualifierLoc() &&
10496       Member == E->getMemberDecl() &&
10497       FoundDecl == E->getFoundDecl() &&
10498       !E->hasExplicitTemplateArgs()) {
10499 
10500     // Mark it referenced in the new context regardless.
10501     // FIXME: this is a bit instantiation-specific.
10502     SemaRef.MarkMemberReferenced(E);
10503 
10504     return E;
10505   }
10506 
10507   TemplateArgumentListInfo TransArgs;
10508   if (E->hasExplicitTemplateArgs()) {
10509     TransArgs.setLAngleLoc(E->getLAngleLoc());
10510     TransArgs.setRAngleLoc(E->getRAngleLoc());
10511     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10512                                                 E->getNumTemplateArgs(),
10513                                                 TransArgs))
10514       return ExprError();
10515   }
10516 
10517   // FIXME: Bogus source location for the operator
10518   SourceLocation FakeOperatorLoc =
10519       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10520 
10521   // FIXME: to do this check properly, we will need to preserve the
10522   // first-qualifier-in-scope here, just in case we had a dependent
10523   // base (and therefore couldn't do the check) and a
10524   // nested-name-qualifier (and therefore could do the lookup).
10525   NamedDecl *FirstQualifierInScope = nullptr;
10526   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10527   if (MemberNameInfo.getName()) {
10528     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10529     if (!MemberNameInfo.getName())
10530       return ExprError();
10531   }
10532 
10533   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10534                                         E->isArrow(),
10535                                         QualifierLoc,
10536                                         TemplateKWLoc,
10537                                         MemberNameInfo,
10538                                         Member,
10539                                         FoundDecl,
10540                                         (E->hasExplicitTemplateArgs()
10541                                            ? &TransArgs : nullptr),
10542                                         FirstQualifierInScope);
10543 }
10544 
10545 template<typename Derived>
10546 ExprResult
10547 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10548   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10549   if (LHS.isInvalid())
10550     return ExprError();
10551 
10552   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10553   if (RHS.isInvalid())
10554     return ExprError();
10555 
10556   if (!getDerived().AlwaysRebuild() &&
10557       LHS.get() == E->getLHS() &&
10558       RHS.get() == E->getRHS())
10559     return E;
10560 
10561   if (E->isCompoundAssignmentOp())
10562     // FPFeatures has already been established from trailing storage
10563     return getDerived().RebuildBinaryOperator(
10564         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10565   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10566   getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts());
10567 
10568   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10569                                             LHS.get(), RHS.get());
10570 }
10571 
10572 template <typename Derived>
10573 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10574     CXXRewrittenBinaryOperator *E) {
10575   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10576 
10577   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10578   if (LHS.isInvalid())
10579     return ExprError();
10580 
10581   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10582   if (RHS.isInvalid())
10583     return ExprError();
10584 
10585   if (!getDerived().AlwaysRebuild() &&
10586       LHS.get() == Decomp.LHS &&
10587       RHS.get() == Decomp.RHS)
10588     return E;
10589 
10590   // Extract the already-resolved callee declarations so that we can restrict
10591   // ourselves to using them as the unqualified lookup results when rebuilding.
10592   UnresolvedSet<2> UnqualLookups;
10593   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10594                             const_cast<Expr *>(Decomp.InnerBinOp)};
10595   for (Expr *PossibleBinOp : PossibleBinOps) {
10596     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10597     if (!Op)
10598       continue;
10599     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10600     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10601       continue;
10602 
10603     // Transform the callee in case we built a call to a local extern
10604     // declaration.
10605     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10606         E->getOperatorLoc(), Callee->getFoundDecl()));
10607     if (!Found)
10608       return ExprError();
10609     UnqualLookups.addDecl(Found);
10610   }
10611 
10612   return getDerived().RebuildCXXRewrittenBinaryOperator(
10613       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10614 }
10615 
10616 template<typename Derived>
10617 ExprResult
10618 TreeTransform<Derived>::TransformCompoundAssignOperator(
10619                                                       CompoundAssignOperator *E) {
10620   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10621   getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts());
10622   return getDerived().TransformBinaryOperator(E);
10623 }
10624 
10625 template<typename Derived>
10626 ExprResult TreeTransform<Derived>::
10627 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10628   // Just rebuild the common and RHS expressions and see whether we
10629   // get any changes.
10630 
10631   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10632   if (commonExpr.isInvalid())
10633     return ExprError();
10634 
10635   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10636   if (rhs.isInvalid())
10637     return ExprError();
10638 
10639   if (!getDerived().AlwaysRebuild() &&
10640       commonExpr.get() == e->getCommon() &&
10641       rhs.get() == e->getFalseExpr())
10642     return e;
10643 
10644   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10645                                                  e->getQuestionLoc(),
10646                                                  nullptr,
10647                                                  e->getColonLoc(),
10648                                                  rhs.get());
10649 }
10650 
10651 template<typename Derived>
10652 ExprResult
10653 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10654   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10655   if (Cond.isInvalid())
10656     return ExprError();
10657 
10658   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10659   if (LHS.isInvalid())
10660     return ExprError();
10661 
10662   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10663   if (RHS.isInvalid())
10664     return ExprError();
10665 
10666   if (!getDerived().AlwaysRebuild() &&
10667       Cond.get() == E->getCond() &&
10668       LHS.get() == E->getLHS() &&
10669       RHS.get() == E->getRHS())
10670     return E;
10671 
10672   return getDerived().RebuildConditionalOperator(Cond.get(),
10673                                                  E->getQuestionLoc(),
10674                                                  LHS.get(),
10675                                                  E->getColonLoc(),
10676                                                  RHS.get());
10677 }
10678 
10679 template<typename Derived>
10680 ExprResult
10681 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10682   // Implicit casts are eliminated during transformation, since they
10683   // will be recomputed by semantic analysis after transformation.
10684   return getDerived().TransformExpr(E->getSubExprAsWritten());
10685 }
10686 
10687 template<typename Derived>
10688 ExprResult
10689 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10690   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10691   if (!Type)
10692     return ExprError();
10693 
10694   ExprResult SubExpr
10695     = getDerived().TransformExpr(E->getSubExprAsWritten());
10696   if (SubExpr.isInvalid())
10697     return ExprError();
10698 
10699   if (!getDerived().AlwaysRebuild() &&
10700       Type == E->getTypeInfoAsWritten() &&
10701       SubExpr.get() == E->getSubExpr())
10702     return E;
10703 
10704   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10705                                             Type,
10706                                             E->getRParenLoc(),
10707                                             SubExpr.get());
10708 }
10709 
10710 template<typename Derived>
10711 ExprResult
10712 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10713   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10714   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10715   if (!NewT)
10716     return ExprError();
10717 
10718   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10719   if (Init.isInvalid())
10720     return ExprError();
10721 
10722   if (!getDerived().AlwaysRebuild() &&
10723       OldT == NewT &&
10724       Init.get() == E->getInitializer())
10725     return SemaRef.MaybeBindToTemporary(E);
10726 
10727   // Note: the expression type doesn't necessarily match the
10728   // type-as-written, but that's okay, because it should always be
10729   // derivable from the initializer.
10730 
10731   return getDerived().RebuildCompoundLiteralExpr(
10732       E->getLParenLoc(), NewT,
10733       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10734 }
10735 
10736 template<typename Derived>
10737 ExprResult
10738 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10739   ExprResult Base = getDerived().TransformExpr(E->getBase());
10740   if (Base.isInvalid())
10741     return ExprError();
10742 
10743   if (!getDerived().AlwaysRebuild() &&
10744       Base.get() == E->getBase())
10745     return E;
10746 
10747   // FIXME: Bad source location
10748   SourceLocation FakeOperatorLoc =
10749       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10750   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10751                                                   E->getAccessorLoc(),
10752                                                   E->getAccessor());
10753 }
10754 
10755 template<typename Derived>
10756 ExprResult
10757 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10758   if (InitListExpr *Syntactic = E->getSyntacticForm())
10759     E = Syntactic;
10760 
10761   bool InitChanged = false;
10762 
10763   EnterExpressionEvaluationContext Context(
10764       getSema(), EnterExpressionEvaluationContext::InitList);
10765 
10766   SmallVector<Expr*, 4> Inits;
10767   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10768                                   Inits, &InitChanged))
10769     return ExprError();
10770 
10771   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10772     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10773     // in some cases. We can't reuse it in general, because the syntactic and
10774     // semantic forms are linked, and we can't know that semantic form will
10775     // match even if the syntactic form does.
10776   }
10777 
10778   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10779                                       E->getRBraceLoc());
10780 }
10781 
10782 template<typename Derived>
10783 ExprResult
10784 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10785   Designation Desig;
10786 
10787   // transform the initializer value
10788   ExprResult Init = getDerived().TransformExpr(E->getInit());
10789   if (Init.isInvalid())
10790     return ExprError();
10791 
10792   // transform the designators.
10793   SmallVector<Expr*, 4> ArrayExprs;
10794   bool ExprChanged = false;
10795   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10796     if (D.isFieldDesignator()) {
10797       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10798                                                D.getDotLoc(),
10799                                                D.getFieldLoc()));
10800       if (D.getField()) {
10801         FieldDecl *Field = cast_or_null<FieldDecl>(
10802             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10803         if (Field != D.getField())
10804           // Rebuild the expression when the transformed FieldDecl is
10805           // different to the already assigned FieldDecl.
10806           ExprChanged = true;
10807       } else {
10808         // Ensure that the designator expression is rebuilt when there isn't
10809         // a resolved FieldDecl in the designator as we don't want to assign
10810         // a FieldDecl to a pattern designator that will be instantiated again.
10811         ExprChanged = true;
10812       }
10813       continue;
10814     }
10815 
10816     if (D.isArrayDesignator()) {
10817       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10818       if (Index.isInvalid())
10819         return ExprError();
10820 
10821       Desig.AddDesignator(
10822           Designator::getArray(Index.get(), D.getLBracketLoc()));
10823 
10824       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10825       ArrayExprs.push_back(Index.get());
10826       continue;
10827     }
10828 
10829     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10830     ExprResult Start
10831       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10832     if (Start.isInvalid())
10833       return ExprError();
10834 
10835     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10836     if (End.isInvalid())
10837       return ExprError();
10838 
10839     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10840                                                   End.get(),
10841                                                   D.getLBracketLoc(),
10842                                                   D.getEllipsisLoc()));
10843 
10844     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10845                   End.get() != E->getArrayRangeEnd(D);
10846 
10847     ArrayExprs.push_back(Start.get());
10848     ArrayExprs.push_back(End.get());
10849   }
10850 
10851   if (!getDerived().AlwaysRebuild() &&
10852       Init.get() == E->getInit() &&
10853       !ExprChanged)
10854     return E;
10855 
10856   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10857                                                 E->getEqualOrColonLoc(),
10858                                                 E->usesGNUSyntax(), Init.get());
10859 }
10860 
10861 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10862 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10863 template<typename Derived>
10864 ExprResult
10865 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10866     DesignatedInitUpdateExpr *E) {
10867   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10868                    "initializer");
10869   return ExprError();
10870 }
10871 
10872 template<typename Derived>
10873 ExprResult
10874 TreeTransform<Derived>::TransformNoInitExpr(
10875     NoInitExpr *E) {
10876   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10877   return ExprError();
10878 }
10879 
10880 template<typename Derived>
10881 ExprResult
10882 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10883   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10884   return ExprError();
10885 }
10886 
10887 template<typename Derived>
10888 ExprResult
10889 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10890   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10891   return ExprError();
10892 }
10893 
10894 template<typename Derived>
10895 ExprResult
10896 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10897                                                      ImplicitValueInitExpr *E) {
10898   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10899 
10900   // FIXME: Will we ever have proper type location here? Will we actually
10901   // need to transform the type?
10902   QualType T = getDerived().TransformType(E->getType());
10903   if (T.isNull())
10904     return ExprError();
10905 
10906   if (!getDerived().AlwaysRebuild() &&
10907       T == E->getType())
10908     return E;
10909 
10910   return getDerived().RebuildImplicitValueInitExpr(T);
10911 }
10912 
10913 template<typename Derived>
10914 ExprResult
10915 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10916   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10917   if (!TInfo)
10918     return ExprError();
10919 
10920   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10921   if (SubExpr.isInvalid())
10922     return ExprError();
10923 
10924   if (!getDerived().AlwaysRebuild() &&
10925       TInfo == E->getWrittenTypeInfo() &&
10926       SubExpr.get() == E->getSubExpr())
10927     return E;
10928 
10929   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10930                                        TInfo, E->getRParenLoc());
10931 }
10932 
10933 template<typename Derived>
10934 ExprResult
10935 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10936   bool ArgumentChanged = false;
10937   SmallVector<Expr*, 4> Inits;
10938   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10939                      &ArgumentChanged))
10940     return ExprError();
10941 
10942   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10943                                            Inits,
10944                                            E->getRParenLoc());
10945 }
10946 
10947 /// Transform an address-of-label expression.
10948 ///
10949 /// By default, the transformation of an address-of-label expression always
10950 /// rebuilds the expression, so that the label identifier can be resolved to
10951 /// the corresponding label statement by semantic analysis.
10952 template<typename Derived>
10953 ExprResult
10954 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10955   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10956                                         E->getLabel());
10957   if (!LD)
10958     return ExprError();
10959 
10960   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10961                                            cast<LabelDecl>(LD));
10962 }
10963 
10964 template<typename Derived>
10965 ExprResult
10966 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10967   SemaRef.ActOnStartStmtExpr();
10968   StmtResult SubStmt
10969     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10970   if (SubStmt.isInvalid()) {
10971     SemaRef.ActOnStmtExprError();
10972     return ExprError();
10973   }
10974 
10975   unsigned OldDepth = E->getTemplateDepth();
10976   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
10977 
10978   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
10979       SubStmt.get() == E->getSubStmt()) {
10980     // Calling this an 'error' is unintuitive, but it does the right thing.
10981     SemaRef.ActOnStmtExprError();
10982     return SemaRef.MaybeBindToTemporary(E);
10983   }
10984 
10985   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
10986                                       E->getRParenLoc(), NewDepth);
10987 }
10988 
10989 template<typename Derived>
10990 ExprResult
10991 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10992   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10993   if (Cond.isInvalid())
10994     return ExprError();
10995 
10996   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10997   if (LHS.isInvalid())
10998     return ExprError();
10999 
11000   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11001   if (RHS.isInvalid())
11002     return ExprError();
11003 
11004   if (!getDerived().AlwaysRebuild() &&
11005       Cond.get() == E->getCond() &&
11006       LHS.get() == E->getLHS() &&
11007       RHS.get() == E->getRHS())
11008     return E;
11009 
11010   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11011                                         Cond.get(), LHS.get(), RHS.get(),
11012                                         E->getRParenLoc());
11013 }
11014 
11015 template<typename Derived>
11016 ExprResult
11017 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11018   return E;
11019 }
11020 
11021 template<typename Derived>
11022 ExprResult
11023 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11024   switch (E->getOperator()) {
11025   case OO_New:
11026   case OO_Delete:
11027   case OO_Array_New:
11028   case OO_Array_Delete:
11029     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11030 
11031   case OO_Call: {
11032     // This is a call to an object's operator().
11033     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11034 
11035     // Transform the object itself.
11036     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11037     if (Object.isInvalid())
11038       return ExprError();
11039 
11040     // FIXME: Poor location information
11041     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11042         static_cast<Expr *>(Object.get())->getEndLoc());
11043 
11044     // Transform the call arguments.
11045     SmallVector<Expr*, 8> Args;
11046     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11047                                     Args))
11048       return ExprError();
11049 
11050     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11051                                         E->getEndLoc());
11052   }
11053 
11054 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11055   case OO_##Name:
11056 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11057 #include "clang/Basic/OperatorKinds.def"
11058   case OO_Subscript:
11059     // Handled below.
11060     break;
11061 
11062   case OO_Conditional:
11063     llvm_unreachable("conditional operator is not actually overloadable");
11064 
11065   case OO_None:
11066   case NUM_OVERLOADED_OPERATORS:
11067     llvm_unreachable("not an overloaded operator?");
11068   }
11069 
11070   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11071   if (Callee.isInvalid())
11072     return ExprError();
11073 
11074   ExprResult First;
11075   if (E->getOperator() == OO_Amp)
11076     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11077   else
11078     First = getDerived().TransformExpr(E->getArg(0));
11079   if (First.isInvalid())
11080     return ExprError();
11081 
11082   ExprResult Second;
11083   if (E->getNumArgs() == 2) {
11084     Second = getDerived().TransformExpr(E->getArg(1));
11085     if (Second.isInvalid())
11086       return ExprError();
11087   }
11088 
11089   if (!getDerived().AlwaysRebuild() &&
11090       Callee.get() == E->getCallee() &&
11091       First.get() == E->getArg(0) &&
11092       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11093     return SemaRef.MaybeBindToTemporary(E);
11094 
11095   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11096   getSema().CurFPFeatures = E->getFPFeatures();
11097 
11098   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11099                                                  E->getOperatorLoc(),
11100                                                  Callee.get(),
11101                                                  First.get(),
11102                                                  Second.get());
11103 }
11104 
11105 template<typename Derived>
11106 ExprResult
11107 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11108   return getDerived().TransformCallExpr(E);
11109 }
11110 
11111 template <typename Derived>
11112 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11113   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11114                          getSema().CurContext != E->getParentContext();
11115 
11116   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11117     return E;
11118 
11119   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11120                                            E->getEndLoc(),
11121                                            getSema().CurContext);
11122 }
11123 
11124 template<typename Derived>
11125 ExprResult
11126 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11127   // Transform the callee.
11128   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11129   if (Callee.isInvalid())
11130     return ExprError();
11131 
11132   // Transform exec config.
11133   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11134   if (EC.isInvalid())
11135     return ExprError();
11136 
11137   // Transform arguments.
11138   bool ArgChanged = false;
11139   SmallVector<Expr*, 8> Args;
11140   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11141                                   &ArgChanged))
11142     return ExprError();
11143 
11144   if (!getDerived().AlwaysRebuild() &&
11145       Callee.get() == E->getCallee() &&
11146       !ArgChanged)
11147     return SemaRef.MaybeBindToTemporary(E);
11148 
11149   // FIXME: Wrong source location information for the '('.
11150   SourceLocation FakeLParenLoc
11151     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11152   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11153                                       Args,
11154                                       E->getRParenLoc(), EC.get());
11155 }
11156 
11157 template<typename Derived>
11158 ExprResult
11159 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11160   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11161   if (!Type)
11162     return ExprError();
11163 
11164   ExprResult SubExpr
11165     = getDerived().TransformExpr(E->getSubExprAsWritten());
11166   if (SubExpr.isInvalid())
11167     return ExprError();
11168 
11169   if (!getDerived().AlwaysRebuild() &&
11170       Type == E->getTypeInfoAsWritten() &&
11171       SubExpr.get() == E->getSubExpr())
11172     return E;
11173   return getDerived().RebuildCXXNamedCastExpr(
11174       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11175       Type, E->getAngleBrackets().getEnd(),
11176       // FIXME. this should be '(' location
11177       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11178 }
11179 
11180 template<typename Derived>
11181 ExprResult
11182 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11183   TypeSourceInfo *TSI =
11184       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11185   if (!TSI)
11186     return ExprError();
11187 
11188   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11189   if (Sub.isInvalid())
11190     return ExprError();
11191 
11192   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11193                                                 Sub.get(), BCE->getEndLoc());
11194 }
11195 
11196 template<typename Derived>
11197 ExprResult
11198 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11199   return getDerived().TransformCXXNamedCastExpr(E);
11200 }
11201 
11202 template<typename Derived>
11203 ExprResult
11204 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11205   return getDerived().TransformCXXNamedCastExpr(E);
11206 }
11207 
11208 template<typename Derived>
11209 ExprResult
11210 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11211                                                       CXXReinterpretCastExpr *E) {
11212   return getDerived().TransformCXXNamedCastExpr(E);
11213 }
11214 
11215 template<typename Derived>
11216 ExprResult
11217 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11218   return getDerived().TransformCXXNamedCastExpr(E);
11219 }
11220 
11221 template<typename Derived>
11222 ExprResult
11223 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11224   return getDerived().TransformCXXNamedCastExpr(E);
11225 }
11226 
11227 template<typename Derived>
11228 ExprResult
11229 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11230                                                      CXXFunctionalCastExpr *E) {
11231   TypeSourceInfo *Type =
11232       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11233   if (!Type)
11234     return ExprError();
11235 
11236   ExprResult SubExpr
11237     = getDerived().TransformExpr(E->getSubExprAsWritten());
11238   if (SubExpr.isInvalid())
11239     return ExprError();
11240 
11241   if (!getDerived().AlwaysRebuild() &&
11242       Type == E->getTypeInfoAsWritten() &&
11243       SubExpr.get() == E->getSubExpr())
11244     return E;
11245 
11246   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11247                                                    E->getLParenLoc(),
11248                                                    SubExpr.get(),
11249                                                    E->getRParenLoc(),
11250                                                    E->isListInitialization());
11251 }
11252 
11253 template<typename Derived>
11254 ExprResult
11255 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11256   if (E->isTypeOperand()) {
11257     TypeSourceInfo *TInfo
11258       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11259     if (!TInfo)
11260       return ExprError();
11261 
11262     if (!getDerived().AlwaysRebuild() &&
11263         TInfo == E->getTypeOperandSourceInfo())
11264       return E;
11265 
11266     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11267                                              TInfo, E->getEndLoc());
11268   }
11269 
11270   // We don't know whether the subexpression is potentially evaluated until
11271   // after we perform semantic analysis.  We speculatively assume it is
11272   // unevaluated; it will get fixed later if the subexpression is in fact
11273   // potentially evaluated.
11274   EnterExpressionEvaluationContext Unevaluated(
11275       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11276       Sema::ReuseLambdaContextDecl);
11277 
11278   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11279   if (SubExpr.isInvalid())
11280     return ExprError();
11281 
11282   if (!getDerived().AlwaysRebuild() &&
11283       SubExpr.get() == E->getExprOperand())
11284     return E;
11285 
11286   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11287                                            SubExpr.get(), E->getEndLoc());
11288 }
11289 
11290 template<typename Derived>
11291 ExprResult
11292 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11293   if (E->isTypeOperand()) {
11294     TypeSourceInfo *TInfo
11295       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11296     if (!TInfo)
11297       return ExprError();
11298 
11299     if (!getDerived().AlwaysRebuild() &&
11300         TInfo == E->getTypeOperandSourceInfo())
11301       return E;
11302 
11303     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11304                                              TInfo, E->getEndLoc());
11305   }
11306 
11307   EnterExpressionEvaluationContext Unevaluated(
11308       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11309 
11310   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11311   if (SubExpr.isInvalid())
11312     return ExprError();
11313 
11314   if (!getDerived().AlwaysRebuild() &&
11315       SubExpr.get() == E->getExprOperand())
11316     return E;
11317 
11318   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11319                                            SubExpr.get(), E->getEndLoc());
11320 }
11321 
11322 template<typename Derived>
11323 ExprResult
11324 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11325   return E;
11326 }
11327 
11328 template<typename Derived>
11329 ExprResult
11330 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11331                                                      CXXNullPtrLiteralExpr *E) {
11332   return E;
11333 }
11334 
11335 template<typename Derived>
11336 ExprResult
11337 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11338   QualType T = getSema().getCurrentThisType();
11339 
11340   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11341     // Mark it referenced in the new context regardless.
11342     // FIXME: this is a bit instantiation-specific.
11343     getSema().MarkThisReferenced(E);
11344     return E;
11345   }
11346 
11347   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11348 }
11349 
11350 template<typename Derived>
11351 ExprResult
11352 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11353   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11354   if (SubExpr.isInvalid())
11355     return ExprError();
11356 
11357   if (!getDerived().AlwaysRebuild() &&
11358       SubExpr.get() == E->getSubExpr())
11359     return E;
11360 
11361   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11362                                           E->isThrownVariableInScope());
11363 }
11364 
11365 template<typename Derived>
11366 ExprResult
11367 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11368   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11369       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11370   if (!Param)
11371     return ExprError();
11372 
11373   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11374       E->getUsedContext() == SemaRef.CurContext)
11375     return E;
11376 
11377   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11378 }
11379 
11380 template<typename Derived>
11381 ExprResult
11382 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11383   FieldDecl *Field = cast_or_null<FieldDecl>(
11384       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11385   if (!Field)
11386     return ExprError();
11387 
11388   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11389       E->getUsedContext() == SemaRef.CurContext)
11390     return E;
11391 
11392   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11393 }
11394 
11395 template<typename Derived>
11396 ExprResult
11397 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11398                                                     CXXScalarValueInitExpr *E) {
11399   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11400   if (!T)
11401     return ExprError();
11402 
11403   if (!getDerived().AlwaysRebuild() &&
11404       T == E->getTypeSourceInfo())
11405     return E;
11406 
11407   return getDerived().RebuildCXXScalarValueInitExpr(T,
11408                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11409                                                     E->getRParenLoc());
11410 }
11411 
11412 template<typename Derived>
11413 ExprResult
11414 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11415   // Transform the type that we're allocating
11416   TypeSourceInfo *AllocTypeInfo =
11417       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11418   if (!AllocTypeInfo)
11419     return ExprError();
11420 
11421   // Transform the size of the array we're allocating (if any).
11422   Optional<Expr *> ArraySize;
11423   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11424     ExprResult NewArraySize;
11425     if (*OldArraySize) {
11426       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11427       if (NewArraySize.isInvalid())
11428         return ExprError();
11429     }
11430     ArraySize = NewArraySize.get();
11431   }
11432 
11433   // Transform the placement arguments (if any).
11434   bool ArgumentChanged = false;
11435   SmallVector<Expr*, 8> PlacementArgs;
11436   if (getDerived().TransformExprs(E->getPlacementArgs(),
11437                                   E->getNumPlacementArgs(), true,
11438                                   PlacementArgs, &ArgumentChanged))
11439     return ExprError();
11440 
11441   // Transform the initializer (if any).
11442   Expr *OldInit = E->getInitializer();
11443   ExprResult NewInit;
11444   if (OldInit)
11445     NewInit = getDerived().TransformInitializer(OldInit, true);
11446   if (NewInit.isInvalid())
11447     return ExprError();
11448 
11449   // Transform new operator and delete operator.
11450   FunctionDecl *OperatorNew = nullptr;
11451   if (E->getOperatorNew()) {
11452     OperatorNew = cast_or_null<FunctionDecl>(
11453         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11454     if (!OperatorNew)
11455       return ExprError();
11456   }
11457 
11458   FunctionDecl *OperatorDelete = nullptr;
11459   if (E->getOperatorDelete()) {
11460     OperatorDelete = cast_or_null<FunctionDecl>(
11461         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11462     if (!OperatorDelete)
11463       return ExprError();
11464   }
11465 
11466   if (!getDerived().AlwaysRebuild() &&
11467       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11468       ArraySize == E->getArraySize() &&
11469       NewInit.get() == OldInit &&
11470       OperatorNew == E->getOperatorNew() &&
11471       OperatorDelete == E->getOperatorDelete() &&
11472       !ArgumentChanged) {
11473     // Mark any declarations we need as referenced.
11474     // FIXME: instantiation-specific.
11475     if (OperatorNew)
11476       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11477     if (OperatorDelete)
11478       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11479 
11480     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11481       QualType ElementType
11482         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11483       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11484         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11485         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11486           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11487         }
11488       }
11489     }
11490 
11491     return E;
11492   }
11493 
11494   QualType AllocType = AllocTypeInfo->getType();
11495   if (!ArraySize) {
11496     // If no array size was specified, but the new expression was
11497     // instantiated with an array type (e.g., "new T" where T is
11498     // instantiated with "int[4]"), extract the outer bound from the
11499     // array type as our array size. We do this with constant and
11500     // dependently-sized array types.
11501     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11502     if (!ArrayT) {
11503       // Do nothing
11504     } else if (const ConstantArrayType *ConsArrayT
11505                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11506       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11507                                          SemaRef.Context.getSizeType(),
11508                                          /*FIXME:*/ E->getBeginLoc());
11509       AllocType = ConsArrayT->getElementType();
11510     } else if (const DependentSizedArrayType *DepArrayT
11511                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11512       if (DepArrayT->getSizeExpr()) {
11513         ArraySize = DepArrayT->getSizeExpr();
11514         AllocType = DepArrayT->getElementType();
11515       }
11516     }
11517   }
11518 
11519   return getDerived().RebuildCXXNewExpr(
11520       E->getBeginLoc(), E->isGlobalNew(),
11521       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11522       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11523       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11524 }
11525 
11526 template<typename Derived>
11527 ExprResult
11528 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11529   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11530   if (Operand.isInvalid())
11531     return ExprError();
11532 
11533   // Transform the delete operator, if known.
11534   FunctionDecl *OperatorDelete = nullptr;
11535   if (E->getOperatorDelete()) {
11536     OperatorDelete = cast_or_null<FunctionDecl>(
11537         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11538     if (!OperatorDelete)
11539       return ExprError();
11540   }
11541 
11542   if (!getDerived().AlwaysRebuild() &&
11543       Operand.get() == E->getArgument() &&
11544       OperatorDelete == E->getOperatorDelete()) {
11545     // Mark any declarations we need as referenced.
11546     // FIXME: instantiation-specific.
11547     if (OperatorDelete)
11548       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11549 
11550     if (!E->getArgument()->isTypeDependent()) {
11551       QualType Destroyed = SemaRef.Context.getBaseElementType(
11552                                                          E->getDestroyedType());
11553       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11554         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11555         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11556                                        SemaRef.LookupDestructor(Record));
11557       }
11558     }
11559 
11560     return E;
11561   }
11562 
11563   return getDerived().RebuildCXXDeleteExpr(
11564       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11565 }
11566 
11567 template<typename Derived>
11568 ExprResult
11569 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11570                                                      CXXPseudoDestructorExpr *E) {
11571   ExprResult Base = getDerived().TransformExpr(E->getBase());
11572   if (Base.isInvalid())
11573     return ExprError();
11574 
11575   ParsedType ObjectTypePtr;
11576   bool MayBePseudoDestructor = false;
11577   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11578                                               E->getOperatorLoc(),
11579                                         E->isArrow()? tok::arrow : tok::period,
11580                                               ObjectTypePtr,
11581                                               MayBePseudoDestructor);
11582   if (Base.isInvalid())
11583     return ExprError();
11584 
11585   QualType ObjectType = ObjectTypePtr.get();
11586   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11587   if (QualifierLoc) {
11588     QualifierLoc
11589       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11590     if (!QualifierLoc)
11591       return ExprError();
11592   }
11593   CXXScopeSpec SS;
11594   SS.Adopt(QualifierLoc);
11595 
11596   PseudoDestructorTypeStorage Destroyed;
11597   if (E->getDestroyedTypeInfo()) {
11598     TypeSourceInfo *DestroyedTypeInfo
11599       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11600                                                 ObjectType, nullptr, SS);
11601     if (!DestroyedTypeInfo)
11602       return ExprError();
11603     Destroyed = DestroyedTypeInfo;
11604   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11605     // We aren't likely to be able to resolve the identifier down to a type
11606     // now anyway, so just retain the identifier.
11607     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11608                                             E->getDestroyedTypeLoc());
11609   } else {
11610     // Look for a destructor known with the given name.
11611     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11612                                               *E->getDestroyedTypeIdentifier(),
11613                                                 E->getDestroyedTypeLoc(),
11614                                                 /*Scope=*/nullptr,
11615                                                 SS, ObjectTypePtr,
11616                                                 false);
11617     if (!T)
11618       return ExprError();
11619 
11620     Destroyed
11621       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11622                                                  E->getDestroyedTypeLoc());
11623   }
11624 
11625   TypeSourceInfo *ScopeTypeInfo = nullptr;
11626   if (E->getScopeTypeInfo()) {
11627     CXXScopeSpec EmptySS;
11628     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11629                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11630     if (!ScopeTypeInfo)
11631       return ExprError();
11632   }
11633 
11634   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11635                                                      E->getOperatorLoc(),
11636                                                      E->isArrow(),
11637                                                      SS,
11638                                                      ScopeTypeInfo,
11639                                                      E->getColonColonLoc(),
11640                                                      E->getTildeLoc(),
11641                                                      Destroyed);
11642 }
11643 
11644 template <typename Derived>
11645 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11646                                                         bool RequiresADL,
11647                                                         LookupResult &R) {
11648   // Transform all the decls.
11649   bool AllEmptyPacks = true;
11650   for (auto *OldD : Old->decls()) {
11651     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11652     if (!InstD) {
11653       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11654       // This can happen because of dependent hiding.
11655       if (isa<UsingShadowDecl>(OldD))
11656         continue;
11657       else {
11658         R.clear();
11659         return true;
11660       }
11661     }
11662 
11663     // Expand using pack declarations.
11664     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11665     ArrayRef<NamedDecl*> Decls = SingleDecl;
11666     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11667       Decls = UPD->expansions();
11668 
11669     // Expand using declarations.
11670     for (auto *D : Decls) {
11671       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11672         for (auto *SD : UD->shadows())
11673           R.addDecl(SD);
11674       } else {
11675         R.addDecl(D);
11676       }
11677     }
11678 
11679     AllEmptyPacks &= Decls.empty();
11680   };
11681 
11682   // C++ [temp.res]/8.4.2:
11683   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11684   //   a name in the template definition found a using-declaration, but the
11685   //   lookup in the corresponding scope in the instantiation odoes not find
11686   //   any declarations because the using-declaration was a pack expansion and
11687   //   the corresponding pack is empty
11688   if (AllEmptyPacks && !RequiresADL) {
11689     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11690         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11691     return true;
11692   }
11693 
11694   // Resolve a kind, but don't do any further analysis.  If it's
11695   // ambiguous, the callee needs to deal with it.
11696   R.resolveKind();
11697   return false;
11698 }
11699 
11700 template<typename Derived>
11701 ExprResult
11702 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11703                                                   UnresolvedLookupExpr *Old) {
11704   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11705                  Sema::LookupOrdinaryName);
11706 
11707   // Transform the declaration set.
11708   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11709     return ExprError();
11710 
11711   // Rebuild the nested-name qualifier, if present.
11712   CXXScopeSpec SS;
11713   if (Old->getQualifierLoc()) {
11714     NestedNameSpecifierLoc QualifierLoc
11715       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11716     if (!QualifierLoc)
11717       return ExprError();
11718 
11719     SS.Adopt(QualifierLoc);
11720   }
11721 
11722   if (Old->getNamingClass()) {
11723     CXXRecordDecl *NamingClass
11724       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11725                                                             Old->getNameLoc(),
11726                                                         Old->getNamingClass()));
11727     if (!NamingClass) {
11728       R.clear();
11729       return ExprError();
11730     }
11731 
11732     R.setNamingClass(NamingClass);
11733   }
11734 
11735   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11736 
11737   // If we have neither explicit template arguments, nor the template keyword,
11738   // it's a normal declaration name or member reference.
11739   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11740     NamedDecl *D = R.getAsSingle<NamedDecl>();
11741     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11742     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11743     // give a good diagnostic.
11744     if (D && D->isCXXInstanceMember()) {
11745       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11746                                                      /*TemplateArgs=*/nullptr,
11747                                                      /*Scope=*/nullptr);
11748     }
11749 
11750     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11751   }
11752 
11753   // If we have template arguments, rebuild them, then rebuild the
11754   // templateid expression.
11755   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11756   if (Old->hasExplicitTemplateArgs() &&
11757       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11758                                               Old->getNumTemplateArgs(),
11759                                               TransArgs)) {
11760     R.clear();
11761     return ExprError();
11762   }
11763 
11764   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11765                                             Old->requiresADL(), &TransArgs);
11766 }
11767 
11768 template<typename Derived>
11769 ExprResult
11770 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11771   bool ArgChanged = false;
11772   SmallVector<TypeSourceInfo *, 4> Args;
11773   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11774     TypeSourceInfo *From = E->getArg(I);
11775     TypeLoc FromTL = From->getTypeLoc();
11776     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11777       TypeLocBuilder TLB;
11778       TLB.reserve(FromTL.getFullDataSize());
11779       QualType To = getDerived().TransformType(TLB, FromTL);
11780       if (To.isNull())
11781         return ExprError();
11782 
11783       if (To == From->getType())
11784         Args.push_back(From);
11785       else {
11786         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11787         ArgChanged = true;
11788       }
11789       continue;
11790     }
11791 
11792     ArgChanged = true;
11793 
11794     // We have a pack expansion. Instantiate it.
11795     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11796     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11797     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11798     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11799 
11800     // Determine whether the set of unexpanded parameter packs can and should
11801     // be expanded.
11802     bool Expand = true;
11803     bool RetainExpansion = false;
11804     Optional<unsigned> OrigNumExpansions =
11805         ExpansionTL.getTypePtr()->getNumExpansions();
11806     Optional<unsigned> NumExpansions = OrigNumExpansions;
11807     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11808                                              PatternTL.getSourceRange(),
11809                                              Unexpanded,
11810                                              Expand, RetainExpansion,
11811                                              NumExpansions))
11812       return ExprError();
11813 
11814     if (!Expand) {
11815       // The transform has determined that we should perform a simple
11816       // transformation on the pack expansion, producing another pack
11817       // expansion.
11818       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11819 
11820       TypeLocBuilder TLB;
11821       TLB.reserve(From->getTypeLoc().getFullDataSize());
11822 
11823       QualType To = getDerived().TransformType(TLB, PatternTL);
11824       if (To.isNull())
11825         return ExprError();
11826 
11827       To = getDerived().RebuildPackExpansionType(To,
11828                                                  PatternTL.getSourceRange(),
11829                                                  ExpansionTL.getEllipsisLoc(),
11830                                                  NumExpansions);
11831       if (To.isNull())
11832         return ExprError();
11833 
11834       PackExpansionTypeLoc ToExpansionTL
11835         = TLB.push<PackExpansionTypeLoc>(To);
11836       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11837       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11838       continue;
11839     }
11840 
11841     // Expand the pack expansion by substituting for each argument in the
11842     // pack(s).
11843     for (unsigned I = 0; I != *NumExpansions; ++I) {
11844       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11845       TypeLocBuilder TLB;
11846       TLB.reserve(PatternTL.getFullDataSize());
11847       QualType To = getDerived().TransformType(TLB, PatternTL);
11848       if (To.isNull())
11849         return ExprError();
11850 
11851       if (To->containsUnexpandedParameterPack()) {
11852         To = getDerived().RebuildPackExpansionType(To,
11853                                                    PatternTL.getSourceRange(),
11854                                                    ExpansionTL.getEllipsisLoc(),
11855                                                    NumExpansions);
11856         if (To.isNull())
11857           return ExprError();
11858 
11859         PackExpansionTypeLoc ToExpansionTL
11860           = TLB.push<PackExpansionTypeLoc>(To);
11861         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11862       }
11863 
11864       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11865     }
11866 
11867     if (!RetainExpansion)
11868       continue;
11869 
11870     // If we're supposed to retain a pack expansion, do so by temporarily
11871     // forgetting the partially-substituted parameter pack.
11872     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11873 
11874     TypeLocBuilder TLB;
11875     TLB.reserve(From->getTypeLoc().getFullDataSize());
11876 
11877     QualType To = getDerived().TransformType(TLB, PatternTL);
11878     if (To.isNull())
11879       return ExprError();
11880 
11881     To = getDerived().RebuildPackExpansionType(To,
11882                                                PatternTL.getSourceRange(),
11883                                                ExpansionTL.getEllipsisLoc(),
11884                                                NumExpansions);
11885     if (To.isNull())
11886       return ExprError();
11887 
11888     PackExpansionTypeLoc ToExpansionTL
11889       = TLB.push<PackExpansionTypeLoc>(To);
11890     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11891     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11892   }
11893 
11894   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11895     return E;
11896 
11897   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11898                                        E->getEndLoc());
11899 }
11900 
11901 template<typename Derived>
11902 ExprResult
11903 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11904                                                  ConceptSpecializationExpr *E) {
11905   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11906   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11907   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11908                                               Old->NumTemplateArgs, TransArgs))
11909     return ExprError();
11910 
11911   return getDerived().RebuildConceptSpecializationExpr(
11912       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11913       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11914       &TransArgs);
11915 }
11916 
11917 template<typename Derived>
11918 ExprResult
11919 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11920   SmallVector<ParmVarDecl*, 4> TransParams;
11921   SmallVector<QualType, 4> TransParamTypes;
11922   Sema::ExtParameterInfoBuilder ExtParamInfos;
11923 
11924   // C++2a [expr.prim.req]p2
11925   // Expressions appearing within a requirement-body are unevaluated operands.
11926   EnterExpressionEvaluationContext Ctx(
11927       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11928 
11929   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11930       getSema().Context, getSema().CurContext,
11931       E->getBody()->getBeginLoc());
11932 
11933   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11934 
11935   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11936                                                E->getLocalParameters(),
11937                                                /*ParamTypes=*/nullptr,
11938                                                /*ParamInfos=*/nullptr,
11939                                                TransParamTypes, &TransParams,
11940                                                ExtParamInfos))
11941     return ExprError();
11942 
11943   for (ParmVarDecl *Param : TransParams)
11944     Param->setDeclContext(Body);
11945 
11946   SmallVector<concepts::Requirement *, 4> TransReqs;
11947   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
11948                                                      TransReqs))
11949     return ExprError();
11950 
11951   for (concepts::Requirement *Req : TransReqs) {
11952     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
11953       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
11954         ER->getReturnTypeRequirement()
11955                 .getTypeConstraintTemplateParameterList()->getParam(0)
11956                 ->setDeclContext(Body);
11957       }
11958     }
11959   }
11960 
11961   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
11962                                           TransParams, TransReqs,
11963                                           E->getRBraceLoc());
11964 }
11965 
11966 template<typename Derived>
11967 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
11968     ArrayRef<concepts::Requirement *> Reqs,
11969     SmallVectorImpl<concepts::Requirement *> &Transformed) {
11970   for (concepts::Requirement *Req : Reqs) {
11971     concepts::Requirement *TransReq = nullptr;
11972     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
11973       TransReq = getDerived().TransformTypeRequirement(TypeReq);
11974     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
11975       TransReq = getDerived().TransformExprRequirement(ExprReq);
11976     else
11977       TransReq = getDerived().TransformNestedRequirement(
11978                      cast<concepts::NestedRequirement>(Req));
11979     if (!TransReq)
11980       return true;
11981     Transformed.push_back(TransReq);
11982   }
11983   return false;
11984 }
11985 
11986 template<typename Derived>
11987 concepts::TypeRequirement *
11988 TreeTransform<Derived>::TransformTypeRequirement(
11989     concepts::TypeRequirement *Req) {
11990   if (Req->isSubstitutionFailure()) {
11991     if (getDerived().AlwaysRebuild())
11992       return getDerived().RebuildTypeRequirement(
11993               Req->getSubstitutionDiagnostic());
11994     return Req;
11995   }
11996   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
11997   if (!TransType)
11998     return nullptr;
11999   return getDerived().RebuildTypeRequirement(TransType);
12000 }
12001 
12002 template<typename Derived>
12003 concepts::ExprRequirement *
12004 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12005   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12006   if (Req->isExprSubstitutionFailure())
12007     TransExpr = Req->getExprSubstitutionDiagnostic();
12008   else {
12009     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12010     if (TransExprRes.isInvalid())
12011       return nullptr;
12012     TransExpr = TransExprRes.get();
12013   }
12014 
12015   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12016   const auto &RetReq = Req->getReturnTypeRequirement();
12017   if (RetReq.isEmpty())
12018     TransRetReq.emplace();
12019   else if (RetReq.isSubstitutionFailure())
12020     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12021   else if (RetReq.isTypeConstraint()) {
12022     TemplateParameterList *OrigTPL =
12023         RetReq.getTypeConstraintTemplateParameterList();
12024     TemplateParameterList *TPL =
12025         getDerived().TransformTemplateParameterList(OrigTPL);
12026     if (!TPL)
12027       return nullptr;
12028     TransRetReq.emplace(TPL);
12029   }
12030   assert(TransRetReq.hasValue() &&
12031          "All code paths leading here must set TransRetReq");
12032   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12033     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12034                                                Req->getNoexceptLoc(),
12035                                                std::move(*TransRetReq));
12036   return getDerived().RebuildExprRequirement(
12037       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12038       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12039 }
12040 
12041 template<typename Derived>
12042 concepts::NestedRequirement *
12043 TreeTransform<Derived>::TransformNestedRequirement(
12044     concepts::NestedRequirement *Req) {
12045   if (Req->isSubstitutionFailure()) {
12046     if (getDerived().AlwaysRebuild())
12047       return getDerived().RebuildNestedRequirement(
12048           Req->getSubstitutionDiagnostic());
12049     return Req;
12050   }
12051   ExprResult TransConstraint =
12052       getDerived().TransformExpr(Req->getConstraintExpr());
12053   if (TransConstraint.isInvalid())
12054     return nullptr;
12055   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12056 }
12057 
12058 template<typename Derived>
12059 ExprResult
12060 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12061   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12062   if (!T)
12063     return ExprError();
12064 
12065   if (!getDerived().AlwaysRebuild() &&
12066       T == E->getQueriedTypeSourceInfo())
12067     return E;
12068 
12069   ExprResult SubExpr;
12070   {
12071     EnterExpressionEvaluationContext Unevaluated(
12072         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12073     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12074     if (SubExpr.isInvalid())
12075       return ExprError();
12076 
12077     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12078       return E;
12079   }
12080 
12081   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12082                                             SubExpr.get(), E->getEndLoc());
12083 }
12084 
12085 template<typename Derived>
12086 ExprResult
12087 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12088   ExprResult SubExpr;
12089   {
12090     EnterExpressionEvaluationContext Unevaluated(
12091         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12092     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12093     if (SubExpr.isInvalid())
12094       return ExprError();
12095 
12096     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12097       return E;
12098   }
12099 
12100   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12101                                              SubExpr.get(), E->getEndLoc());
12102 }
12103 
12104 template <typename Derived>
12105 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12106     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12107     TypeSourceInfo **RecoveryTSI) {
12108   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12109       DRE, AddrTaken, RecoveryTSI);
12110 
12111   // Propagate both errors and recovered types, which return ExprEmpty.
12112   if (!NewDRE.isUsable())
12113     return NewDRE;
12114 
12115   // We got an expr, wrap it up in parens.
12116   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12117     return PE;
12118   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12119                                        PE->getRParen());
12120 }
12121 
12122 template <typename Derived>
12123 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12124     DependentScopeDeclRefExpr *E) {
12125   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12126                                             nullptr);
12127 }
12128 
12129 template<typename Derived>
12130 ExprResult
12131 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12132                                                DependentScopeDeclRefExpr *E,
12133                                                bool IsAddressOfOperand,
12134                                                TypeSourceInfo **RecoveryTSI) {
12135   assert(E->getQualifierLoc());
12136   NestedNameSpecifierLoc QualifierLoc
12137   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12138   if (!QualifierLoc)
12139     return ExprError();
12140   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12141 
12142   // TODO: If this is a conversion-function-id, verify that the
12143   // destination type name (if present) resolves the same way after
12144   // instantiation as it did in the local scope.
12145 
12146   DeclarationNameInfo NameInfo
12147     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12148   if (!NameInfo.getName())
12149     return ExprError();
12150 
12151   if (!E->hasExplicitTemplateArgs()) {
12152     if (!getDerived().AlwaysRebuild() &&
12153         QualifierLoc == E->getQualifierLoc() &&
12154         // Note: it is sufficient to compare the Name component of NameInfo:
12155         // if name has not changed, DNLoc has not changed either.
12156         NameInfo.getName() == E->getDeclName())
12157       return E;
12158 
12159     return getDerived().RebuildDependentScopeDeclRefExpr(
12160         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12161         IsAddressOfOperand, RecoveryTSI);
12162   }
12163 
12164   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12165   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12166                                               E->getNumTemplateArgs(),
12167                                               TransArgs))
12168     return ExprError();
12169 
12170   return getDerived().RebuildDependentScopeDeclRefExpr(
12171       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12172       RecoveryTSI);
12173 }
12174 
12175 template<typename Derived>
12176 ExprResult
12177 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12178   // CXXConstructExprs other than for list-initialization and
12179   // CXXTemporaryObjectExpr are always implicit, so when we have
12180   // a 1-argument construction we just transform that argument.
12181   if (getDerived().AllowSkippingCXXConstructExpr() &&
12182       ((E->getNumArgs() == 1 ||
12183         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12184        (!getDerived().DropCallArgument(E->getArg(0))) &&
12185        !E->isListInitialization()))
12186     return getDerived().TransformExpr(E->getArg(0));
12187 
12188   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12189 
12190   QualType T = getDerived().TransformType(E->getType());
12191   if (T.isNull())
12192     return ExprError();
12193 
12194   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12195       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12196   if (!Constructor)
12197     return ExprError();
12198 
12199   bool ArgumentChanged = false;
12200   SmallVector<Expr*, 8> Args;
12201   {
12202     EnterExpressionEvaluationContext Context(
12203         getSema(), EnterExpressionEvaluationContext::InitList,
12204         E->isListInitialization());
12205     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12206                                     &ArgumentChanged))
12207       return ExprError();
12208   }
12209 
12210   if (!getDerived().AlwaysRebuild() &&
12211       T == E->getType() &&
12212       Constructor == E->getConstructor() &&
12213       !ArgumentChanged) {
12214     // Mark the constructor as referenced.
12215     // FIXME: Instantiation-specific
12216     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12217     return E;
12218   }
12219 
12220   return getDerived().RebuildCXXConstructExpr(
12221       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12222       E->hadMultipleCandidates(), E->isListInitialization(),
12223       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12224       E->getConstructionKind(), E->getParenOrBraceRange());
12225 }
12226 
12227 template<typename Derived>
12228 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12229     CXXInheritedCtorInitExpr *E) {
12230   QualType T = getDerived().TransformType(E->getType());
12231   if (T.isNull())
12232     return ExprError();
12233 
12234   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12235       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12236   if (!Constructor)
12237     return ExprError();
12238 
12239   if (!getDerived().AlwaysRebuild() &&
12240       T == E->getType() &&
12241       Constructor == E->getConstructor()) {
12242     // Mark the constructor as referenced.
12243     // FIXME: Instantiation-specific
12244     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12245     return E;
12246   }
12247 
12248   return getDerived().RebuildCXXInheritedCtorInitExpr(
12249       T, E->getLocation(), Constructor,
12250       E->constructsVBase(), E->inheritedFromVBase());
12251 }
12252 
12253 /// Transform a C++ temporary-binding expression.
12254 ///
12255 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12256 /// transform the subexpression and return that.
12257 template<typename Derived>
12258 ExprResult
12259 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12260   return getDerived().TransformExpr(E->getSubExpr());
12261 }
12262 
12263 /// Transform a C++ expression that contains cleanups that should
12264 /// be run after the expression is evaluated.
12265 ///
12266 /// Since ExprWithCleanups nodes are implicitly generated, we
12267 /// just transform the subexpression and return that.
12268 template<typename Derived>
12269 ExprResult
12270 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12271   return getDerived().TransformExpr(E->getSubExpr());
12272 }
12273 
12274 template<typename Derived>
12275 ExprResult
12276 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12277                                                     CXXTemporaryObjectExpr *E) {
12278   TypeSourceInfo *T =
12279       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12280   if (!T)
12281     return ExprError();
12282 
12283   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12284       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12285   if (!Constructor)
12286     return ExprError();
12287 
12288   bool ArgumentChanged = false;
12289   SmallVector<Expr*, 8> Args;
12290   Args.reserve(E->getNumArgs());
12291   {
12292     EnterExpressionEvaluationContext Context(
12293         getSema(), EnterExpressionEvaluationContext::InitList,
12294         E->isListInitialization());
12295     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12296                        &ArgumentChanged))
12297       return ExprError();
12298   }
12299 
12300   if (!getDerived().AlwaysRebuild() &&
12301       T == E->getTypeSourceInfo() &&
12302       Constructor == E->getConstructor() &&
12303       !ArgumentChanged) {
12304     // FIXME: Instantiation-specific
12305     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12306     return SemaRef.MaybeBindToTemporary(E);
12307   }
12308 
12309   // FIXME: We should just pass E->isListInitialization(), but we're not
12310   // prepared to handle list-initialization without a child InitListExpr.
12311   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12312   return getDerived().RebuildCXXTemporaryObjectExpr(
12313       T, LParenLoc, Args, E->getEndLoc(),
12314       /*ListInitialization=*/LParenLoc.isInvalid());
12315 }
12316 
12317 template<typename Derived>
12318 ExprResult
12319 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12320   // Transform any init-capture expressions before entering the scope of the
12321   // lambda body, because they are not semantically within that scope.
12322   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12323   struct TransformedInitCapture {
12324     // The location of the ... if the result is retaining a pack expansion.
12325     SourceLocation EllipsisLoc;
12326     // Zero or more expansions of the init-capture.
12327     SmallVector<InitCaptureInfoTy, 4> Expansions;
12328   };
12329   SmallVector<TransformedInitCapture, 4> InitCaptures;
12330   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12331   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12332                                     CEnd = E->capture_end();
12333        C != CEnd; ++C) {
12334     if (!E->isInitCapture(C))
12335       continue;
12336 
12337     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12338     VarDecl *OldVD = C->getCapturedVar();
12339 
12340     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12341                                 Optional<unsigned> NumExpansions) {
12342       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12343           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12344 
12345       if (NewExprInitResult.isInvalid()) {
12346         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12347         return;
12348       }
12349       Expr *NewExprInit = NewExprInitResult.get();
12350 
12351       QualType NewInitCaptureType =
12352           getSema().buildLambdaInitCaptureInitialization(
12353               C->getLocation(), OldVD->getType()->isReferenceType(),
12354               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12355               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12356               NewExprInit);
12357       Result.Expansions.push_back(
12358           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12359     };
12360 
12361     // If this is an init-capture pack, consider expanding the pack now.
12362     if (OldVD->isParameterPack()) {
12363       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12364                                              ->getTypeLoc()
12365                                              .castAs<PackExpansionTypeLoc>();
12366       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12367       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12368 
12369       // Determine whether the set of unexpanded parameter packs can and should
12370       // be expanded.
12371       bool Expand = true;
12372       bool RetainExpansion = false;
12373       Optional<unsigned> OrigNumExpansions =
12374           ExpansionTL.getTypePtr()->getNumExpansions();
12375       Optional<unsigned> NumExpansions = OrigNumExpansions;
12376       if (getDerived().TryExpandParameterPacks(
12377               ExpansionTL.getEllipsisLoc(),
12378               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12379               RetainExpansion, NumExpansions))
12380         return ExprError();
12381       if (Expand) {
12382         for (unsigned I = 0; I != *NumExpansions; ++I) {
12383           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12384           SubstInitCapture(SourceLocation(), None);
12385         }
12386       }
12387       if (!Expand || RetainExpansion) {
12388         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12389         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12390         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12391       }
12392     } else {
12393       SubstInitCapture(SourceLocation(), None);
12394     }
12395   }
12396 
12397   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12398   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12399 
12400   // Transform the template parameters, and add them to the current
12401   // instantiation scope. The null case is handled correctly.
12402   auto TPL = getDerived().TransformTemplateParameterList(
12403       E->getTemplateParameterList());
12404   LSI->GLTemplateParameterList = TPL;
12405 
12406   // Transform the type of the original lambda's call operator.
12407   // The transformation MUST be done in the CurrentInstantiationScope since
12408   // it introduces a mapping of the original to the newly created
12409   // transformed parameters.
12410   TypeSourceInfo *NewCallOpTSI = nullptr;
12411   {
12412     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12413     FunctionProtoTypeLoc OldCallOpFPTL =
12414         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12415 
12416     TypeLocBuilder NewCallOpTLBuilder;
12417     SmallVector<QualType, 4> ExceptionStorage;
12418     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12419     QualType NewCallOpType = TransformFunctionProtoType(
12420         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12421         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12422           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12423                                               ExceptionStorage, Changed);
12424         });
12425     if (NewCallOpType.isNull())
12426       return ExprError();
12427     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12428                                                         NewCallOpType);
12429   }
12430 
12431   // Transform the trailing requires clause
12432   ExprResult NewTrailingRequiresClause;
12433   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12434     // FIXME: Concepts: Substitution into requires clause should only happen
12435     //                  when checking satisfaction.
12436     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12437 
12438   // Create the local class that will describe the lambda.
12439   // FIXME: KnownDependent below is wrong when substituting inside a templated
12440   // context that isn't a DeclContext (such as a variable template).
12441   CXXRecordDecl *OldClass = E->getLambdaClass();
12442   CXXRecordDecl *Class
12443     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12444                                         NewCallOpTSI,
12445                                         /*KnownDependent=*/false,
12446                                         E->getCaptureDefault());
12447   getDerived().transformedLocalDecl(OldClass, {Class});
12448 
12449   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
12450   if (getDerived().ReplacingOriginal())
12451     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
12452                                OldClass->hasKnownLambdaInternalLinkage(),
12453                                OldClass->getLambdaContextDecl());
12454 
12455   // Build the call operator.
12456   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12457       Class, E->getIntroducerRange(), NewCallOpTSI,
12458       E->getCallOperator()->getEndLoc(),
12459       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12460       E->getCallOperator()->getConstexprKind(),
12461       NewTrailingRequiresClause.get());
12462 
12463   LSI->CallOperator = NewCallOperator;
12464 
12465   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12466   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12467 
12468   // Number the lambda for linkage purposes if necessary.
12469   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12470 
12471   // Introduce the context of the call operator.
12472   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12473                                  /*NewThisContext*/false);
12474 
12475   // Enter the scope of the lambda.
12476   getSema().buildLambdaScope(LSI, NewCallOperator,
12477                              E->getIntroducerRange(),
12478                              E->getCaptureDefault(),
12479                              E->getCaptureDefaultLoc(),
12480                              E->hasExplicitParameters(),
12481                              E->hasExplicitResultType(),
12482                              E->isMutable());
12483 
12484   bool Invalid = false;
12485 
12486   // Transform captures.
12487   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12488                                  CEnd = E->capture_end();
12489        C != CEnd; ++C) {
12490     // When we hit the first implicit capture, tell Sema that we've finished
12491     // the list of explicit captures.
12492     if (C->isImplicit())
12493       break;
12494 
12495     // Capturing 'this' is trivial.
12496     if (C->capturesThis()) {
12497       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12498                                     /*BuildAndDiagnose*/ true, nullptr,
12499                                     C->getCaptureKind() == LCK_StarThis);
12500       continue;
12501     }
12502     // Captured expression will be recaptured during captured variables
12503     // rebuilding.
12504     if (C->capturesVLAType())
12505       continue;
12506 
12507     // Rebuild init-captures, including the implied field declaration.
12508     if (E->isInitCapture(C)) {
12509       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12510 
12511       VarDecl *OldVD = C->getCapturedVar();
12512       llvm::SmallVector<Decl*, 4> NewVDs;
12513 
12514       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12515         ExprResult Init = Info.first;
12516         QualType InitQualType = Info.second;
12517         if (Init.isInvalid() || InitQualType.isNull()) {
12518           Invalid = true;
12519           break;
12520         }
12521         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12522             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12523             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12524         if (!NewVD) {
12525           Invalid = true;
12526           break;
12527         }
12528         NewVDs.push_back(NewVD);
12529         getSema().addInitCapture(LSI, NewVD);
12530       }
12531 
12532       if (Invalid)
12533         break;
12534 
12535       getDerived().transformedLocalDecl(OldVD, NewVDs);
12536       continue;
12537     }
12538 
12539     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12540 
12541     // Determine the capture kind for Sema.
12542     Sema::TryCaptureKind Kind
12543       = C->isImplicit()? Sema::TryCapture_Implicit
12544                        : C->getCaptureKind() == LCK_ByCopy
12545                            ? Sema::TryCapture_ExplicitByVal
12546                            : Sema::TryCapture_ExplicitByRef;
12547     SourceLocation EllipsisLoc;
12548     if (C->isPackExpansion()) {
12549       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12550       bool ShouldExpand = false;
12551       bool RetainExpansion = false;
12552       Optional<unsigned> NumExpansions;
12553       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12554                                                C->getLocation(),
12555                                                Unexpanded,
12556                                                ShouldExpand, RetainExpansion,
12557                                                NumExpansions)) {
12558         Invalid = true;
12559         continue;
12560       }
12561 
12562       if (ShouldExpand) {
12563         // The transform has determined that we should perform an expansion;
12564         // transform and capture each of the arguments.
12565         // expansion of the pattern. Do so.
12566         VarDecl *Pack = C->getCapturedVar();
12567         for (unsigned I = 0; I != *NumExpansions; ++I) {
12568           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12569           VarDecl *CapturedVar
12570             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12571                                                                Pack));
12572           if (!CapturedVar) {
12573             Invalid = true;
12574             continue;
12575           }
12576 
12577           // Capture the transformed variable.
12578           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12579         }
12580 
12581         // FIXME: Retain a pack expansion if RetainExpansion is true.
12582 
12583         continue;
12584       }
12585 
12586       EllipsisLoc = C->getEllipsisLoc();
12587     }
12588 
12589     // Transform the captured variable.
12590     VarDecl *CapturedVar
12591       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12592                                                          C->getCapturedVar()));
12593     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12594       Invalid = true;
12595       continue;
12596     }
12597 
12598     // Capture the transformed variable.
12599     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12600                                  EllipsisLoc);
12601   }
12602   getSema().finishLambdaExplicitCaptures(LSI);
12603 
12604   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12605   // evaluation context even if we're not transforming the function body.
12606   getSema().PushExpressionEvaluationContext(
12607       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12608 
12609   // Instantiate the body of the lambda expression.
12610   StmtResult Body =
12611       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12612 
12613   // ActOnLambda* will pop the function scope for us.
12614   FuncScopeCleanup.disable();
12615 
12616   if (Body.isInvalid()) {
12617     SavedContext.pop();
12618     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12619                                /*IsInstantiation=*/true);
12620     return ExprError();
12621   }
12622 
12623   // Copy the LSI before ActOnFinishFunctionBody removes it.
12624   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12625   // the call operator.
12626   auto LSICopy = *LSI;
12627   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12628                                     /*IsInstantiation*/ true);
12629   SavedContext.pop();
12630 
12631   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12632                                    &LSICopy);
12633 }
12634 
12635 template<typename Derived>
12636 StmtResult
12637 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12638   return TransformStmt(S);
12639 }
12640 
12641 template<typename Derived>
12642 StmtResult
12643 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12644   // Transform captures.
12645   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12646                                  CEnd = E->capture_end();
12647        C != CEnd; ++C) {
12648     // When we hit the first implicit capture, tell Sema that we've finished
12649     // the list of explicit captures.
12650     if (!C->isImplicit())
12651       continue;
12652 
12653     // Capturing 'this' is trivial.
12654     if (C->capturesThis()) {
12655       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12656                                     /*BuildAndDiagnose*/ true, nullptr,
12657                                     C->getCaptureKind() == LCK_StarThis);
12658       continue;
12659     }
12660     // Captured expression will be recaptured during captured variables
12661     // rebuilding.
12662     if (C->capturesVLAType())
12663       continue;
12664 
12665     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12666     assert(!E->isInitCapture(C) && "implicit init-capture?");
12667 
12668     // Transform the captured variable.
12669     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12670         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12671     if (!CapturedVar || CapturedVar->isInvalidDecl())
12672       return StmtError();
12673 
12674     // Capture the transformed variable.
12675     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12676   }
12677 
12678   return S;
12679 }
12680 
12681 template<typename Derived>
12682 ExprResult
12683 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12684                                                   CXXUnresolvedConstructExpr *E) {
12685   TypeSourceInfo *T =
12686       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12687   if (!T)
12688     return ExprError();
12689 
12690   bool ArgumentChanged = false;
12691   SmallVector<Expr*, 8> Args;
12692   Args.reserve(E->arg_size());
12693   {
12694     EnterExpressionEvaluationContext Context(
12695         getSema(), EnterExpressionEvaluationContext::InitList,
12696         E->isListInitialization());
12697     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12698                                     &ArgumentChanged))
12699       return ExprError();
12700   }
12701 
12702   if (!getDerived().AlwaysRebuild() &&
12703       T == E->getTypeSourceInfo() &&
12704       !ArgumentChanged)
12705     return E;
12706 
12707   // FIXME: we're faking the locations of the commas
12708   return getDerived().RebuildCXXUnresolvedConstructExpr(
12709       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12710 }
12711 
12712 template<typename Derived>
12713 ExprResult
12714 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12715                                              CXXDependentScopeMemberExpr *E) {
12716   // Transform the base of the expression.
12717   ExprResult Base((Expr*) nullptr);
12718   Expr *OldBase;
12719   QualType BaseType;
12720   QualType ObjectType;
12721   if (!E->isImplicitAccess()) {
12722     OldBase = E->getBase();
12723     Base = getDerived().TransformExpr(OldBase);
12724     if (Base.isInvalid())
12725       return ExprError();
12726 
12727     // Start the member reference and compute the object's type.
12728     ParsedType ObjectTy;
12729     bool MayBePseudoDestructor = false;
12730     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12731                                                 E->getOperatorLoc(),
12732                                       E->isArrow()? tok::arrow : tok::period,
12733                                                 ObjectTy,
12734                                                 MayBePseudoDestructor);
12735     if (Base.isInvalid())
12736       return ExprError();
12737 
12738     ObjectType = ObjectTy.get();
12739     BaseType = ((Expr*) Base.get())->getType();
12740   } else {
12741     OldBase = nullptr;
12742     BaseType = getDerived().TransformType(E->getBaseType());
12743     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12744   }
12745 
12746   // Transform the first part of the nested-name-specifier that qualifies
12747   // the member name.
12748   NamedDecl *FirstQualifierInScope
12749     = getDerived().TransformFirstQualifierInScope(
12750                                             E->getFirstQualifierFoundInScope(),
12751                                             E->getQualifierLoc().getBeginLoc());
12752 
12753   NestedNameSpecifierLoc QualifierLoc;
12754   if (E->getQualifier()) {
12755     QualifierLoc
12756       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12757                                                      ObjectType,
12758                                                      FirstQualifierInScope);
12759     if (!QualifierLoc)
12760       return ExprError();
12761   }
12762 
12763   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12764 
12765   // TODO: If this is a conversion-function-id, verify that the
12766   // destination type name (if present) resolves the same way after
12767   // instantiation as it did in the local scope.
12768 
12769   DeclarationNameInfo NameInfo
12770     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12771   if (!NameInfo.getName())
12772     return ExprError();
12773 
12774   if (!E->hasExplicitTemplateArgs()) {
12775     // This is a reference to a member without an explicitly-specified
12776     // template argument list. Optimize for this common case.
12777     if (!getDerived().AlwaysRebuild() &&
12778         Base.get() == OldBase &&
12779         BaseType == E->getBaseType() &&
12780         QualifierLoc == E->getQualifierLoc() &&
12781         NameInfo.getName() == E->getMember() &&
12782         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12783       return E;
12784 
12785     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12786                                                        BaseType,
12787                                                        E->isArrow(),
12788                                                        E->getOperatorLoc(),
12789                                                        QualifierLoc,
12790                                                        TemplateKWLoc,
12791                                                        FirstQualifierInScope,
12792                                                        NameInfo,
12793                                                        /*TemplateArgs*/nullptr);
12794   }
12795 
12796   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12797   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12798                                               E->getNumTemplateArgs(),
12799                                               TransArgs))
12800     return ExprError();
12801 
12802   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12803                                                      BaseType,
12804                                                      E->isArrow(),
12805                                                      E->getOperatorLoc(),
12806                                                      QualifierLoc,
12807                                                      TemplateKWLoc,
12808                                                      FirstQualifierInScope,
12809                                                      NameInfo,
12810                                                      &TransArgs);
12811 }
12812 
12813 template<typename Derived>
12814 ExprResult
12815 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12816   // Transform the base of the expression.
12817   ExprResult Base((Expr*) nullptr);
12818   QualType BaseType;
12819   if (!Old->isImplicitAccess()) {
12820     Base = getDerived().TransformExpr(Old->getBase());
12821     if (Base.isInvalid())
12822       return ExprError();
12823     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12824                                                      Old->isArrow());
12825     if (Base.isInvalid())
12826       return ExprError();
12827     BaseType = Base.get()->getType();
12828   } else {
12829     BaseType = getDerived().TransformType(Old->getBaseType());
12830   }
12831 
12832   NestedNameSpecifierLoc QualifierLoc;
12833   if (Old->getQualifierLoc()) {
12834     QualifierLoc
12835     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12836     if (!QualifierLoc)
12837       return ExprError();
12838   }
12839 
12840   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12841 
12842   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12843                  Sema::LookupOrdinaryName);
12844 
12845   // Transform the declaration set.
12846   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12847     return ExprError();
12848 
12849   // Determine the naming class.
12850   if (Old->getNamingClass()) {
12851     CXXRecordDecl *NamingClass
12852       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12853                                                           Old->getMemberLoc(),
12854                                                         Old->getNamingClass()));
12855     if (!NamingClass)
12856       return ExprError();
12857 
12858     R.setNamingClass(NamingClass);
12859   }
12860 
12861   TemplateArgumentListInfo TransArgs;
12862   if (Old->hasExplicitTemplateArgs()) {
12863     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12864     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12865     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12866                                                 Old->getNumTemplateArgs(),
12867                                                 TransArgs))
12868       return ExprError();
12869   }
12870 
12871   // FIXME: to do this check properly, we will need to preserve the
12872   // first-qualifier-in-scope here, just in case we had a dependent
12873   // base (and therefore couldn't do the check) and a
12874   // nested-name-qualifier (and therefore could do the lookup).
12875   NamedDecl *FirstQualifierInScope = nullptr;
12876 
12877   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12878                                                   BaseType,
12879                                                   Old->getOperatorLoc(),
12880                                                   Old->isArrow(),
12881                                                   QualifierLoc,
12882                                                   TemplateKWLoc,
12883                                                   FirstQualifierInScope,
12884                                                   R,
12885                                               (Old->hasExplicitTemplateArgs()
12886                                                   ? &TransArgs : nullptr));
12887 }
12888 
12889 template<typename Derived>
12890 ExprResult
12891 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12892   EnterExpressionEvaluationContext Unevaluated(
12893       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12894   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12895   if (SubExpr.isInvalid())
12896     return ExprError();
12897 
12898   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12899     return E;
12900 
12901   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12902 }
12903 
12904 template<typename Derived>
12905 ExprResult
12906 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12907   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12908   if (Pattern.isInvalid())
12909     return ExprError();
12910 
12911   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12912     return E;
12913 
12914   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12915                                            E->getNumExpansions());
12916 }
12917 
12918 template<typename Derived>
12919 ExprResult
12920 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12921   // If E is not value-dependent, then nothing will change when we transform it.
12922   // Note: This is an instantiation-centric view.
12923   if (!E->isValueDependent())
12924     return E;
12925 
12926   EnterExpressionEvaluationContext Unevaluated(
12927       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12928 
12929   ArrayRef<TemplateArgument> PackArgs;
12930   TemplateArgument ArgStorage;
12931 
12932   // Find the argument list to transform.
12933   if (E->isPartiallySubstituted()) {
12934     PackArgs = E->getPartialArguments();
12935   } else if (E->isValueDependent()) {
12936     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12937     bool ShouldExpand = false;
12938     bool RetainExpansion = false;
12939     Optional<unsigned> NumExpansions;
12940     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12941                                              Unexpanded,
12942                                              ShouldExpand, RetainExpansion,
12943                                              NumExpansions))
12944       return ExprError();
12945 
12946     // If we need to expand the pack, build a template argument from it and
12947     // expand that.
12948     if (ShouldExpand) {
12949       auto *Pack = E->getPack();
12950       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
12951         ArgStorage = getSema().Context.getPackExpansionType(
12952             getSema().Context.getTypeDeclType(TTPD), None);
12953       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
12954         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
12955       } else {
12956         auto *VD = cast<ValueDecl>(Pack);
12957         ExprResult DRE = getSema().BuildDeclRefExpr(
12958             VD, VD->getType().getNonLValueExprType(getSema().Context),
12959             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
12960             E->getPackLoc());
12961         if (DRE.isInvalid())
12962           return ExprError();
12963         ArgStorage = new (getSema().Context) PackExpansionExpr(
12964             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
12965       }
12966       PackArgs = ArgStorage;
12967     }
12968   }
12969 
12970   // If we're not expanding the pack, just transform the decl.
12971   if (!PackArgs.size()) {
12972     auto *Pack = cast_or_null<NamedDecl>(
12973         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
12974     if (!Pack)
12975       return ExprError();
12976     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
12977                                               E->getPackLoc(),
12978                                               E->getRParenLoc(), None, None);
12979   }
12980 
12981   // Try to compute the result without performing a partial substitution.
12982   Optional<unsigned> Result = 0;
12983   for (const TemplateArgument &Arg : PackArgs) {
12984     if (!Arg.isPackExpansion()) {
12985       Result = *Result + 1;
12986       continue;
12987     }
12988 
12989     TemplateArgumentLoc ArgLoc;
12990     InventTemplateArgumentLoc(Arg, ArgLoc);
12991 
12992     // Find the pattern of the pack expansion.
12993     SourceLocation Ellipsis;
12994     Optional<unsigned> OrigNumExpansions;
12995     TemplateArgumentLoc Pattern =
12996         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
12997                                                           OrigNumExpansions);
12998 
12999     // Substitute under the pack expansion. Do not expand the pack (yet).
13000     TemplateArgumentLoc OutPattern;
13001     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13002     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13003                                                /*Uneval*/ true))
13004       return true;
13005 
13006     // See if we can determine the number of arguments from the result.
13007     Optional<unsigned> NumExpansions =
13008         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13009     if (!NumExpansions) {
13010       // No: we must be in an alias template expansion, and we're going to need
13011       // to actually expand the packs.
13012       Result = None;
13013       break;
13014     }
13015 
13016     Result = *Result + *NumExpansions;
13017   }
13018 
13019   // Common case: we could determine the number of expansions without
13020   // substituting.
13021   if (Result)
13022     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13023                                               E->getPackLoc(),
13024                                               E->getRParenLoc(), *Result, None);
13025 
13026   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13027                                                E->getPackLoc());
13028   {
13029     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13030     typedef TemplateArgumentLocInventIterator<
13031         Derived, const TemplateArgument*> PackLocIterator;
13032     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13033                                    PackLocIterator(*this, PackArgs.end()),
13034                                    TransformedPackArgs, /*Uneval*/true))
13035       return ExprError();
13036   }
13037 
13038   // Check whether we managed to fully-expand the pack.
13039   // FIXME: Is it possible for us to do so and not hit the early exit path?
13040   SmallVector<TemplateArgument, 8> Args;
13041   bool PartialSubstitution = false;
13042   for (auto &Loc : TransformedPackArgs.arguments()) {
13043     Args.push_back(Loc.getArgument());
13044     if (Loc.getArgument().isPackExpansion())
13045       PartialSubstitution = true;
13046   }
13047 
13048   if (PartialSubstitution)
13049     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13050                                               E->getPackLoc(),
13051                                               E->getRParenLoc(), None, Args);
13052 
13053   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13054                                             E->getPackLoc(), E->getRParenLoc(),
13055                                             Args.size(), None);
13056 }
13057 
13058 template<typename Derived>
13059 ExprResult
13060 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13061                                           SubstNonTypeTemplateParmPackExpr *E) {
13062   // Default behavior is to do nothing with this transformation.
13063   return E;
13064 }
13065 
13066 template<typename Derived>
13067 ExprResult
13068 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13069                                           SubstNonTypeTemplateParmExpr *E) {
13070   // Default behavior is to do nothing with this transformation.
13071   return E;
13072 }
13073 
13074 template<typename Derived>
13075 ExprResult
13076 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13077   // Default behavior is to do nothing with this transformation.
13078   return E;
13079 }
13080 
13081 template<typename Derived>
13082 ExprResult
13083 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13084                                                   MaterializeTemporaryExpr *E) {
13085   return getDerived().TransformExpr(E->getSubExpr());
13086 }
13087 
13088 template<typename Derived>
13089 ExprResult
13090 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13091   Expr *Pattern = E->getPattern();
13092 
13093   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13094   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13095   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13096 
13097   // Determine whether the set of unexpanded parameter packs can and should
13098   // be expanded.
13099   bool Expand = true;
13100   bool RetainExpansion = false;
13101   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13102                      NumExpansions = OrigNumExpansions;
13103   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13104                                            Pattern->getSourceRange(),
13105                                            Unexpanded,
13106                                            Expand, RetainExpansion,
13107                                            NumExpansions))
13108     return true;
13109 
13110   if (!Expand) {
13111     // Do not expand any packs here, just transform and rebuild a fold
13112     // expression.
13113     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13114 
13115     ExprResult LHS =
13116         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13117     if (LHS.isInvalid())
13118       return true;
13119 
13120     ExprResult RHS =
13121         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13122     if (RHS.isInvalid())
13123       return true;
13124 
13125     if (!getDerived().AlwaysRebuild() &&
13126         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13127       return E;
13128 
13129     return getDerived().RebuildCXXFoldExpr(
13130         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
13131         RHS.get(), E->getEndLoc(), NumExpansions);
13132   }
13133 
13134   // The transform has determined that we should perform an elementwise
13135   // expansion of the pattern. Do so.
13136   ExprResult Result = getDerived().TransformExpr(E->getInit());
13137   if (Result.isInvalid())
13138     return true;
13139   bool LeftFold = E->isLeftFold();
13140 
13141   // If we're retaining an expansion for a right fold, it is the innermost
13142   // component and takes the init (if any).
13143   if (!LeftFold && RetainExpansion) {
13144     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13145 
13146     ExprResult Out = getDerived().TransformExpr(Pattern);
13147     if (Out.isInvalid())
13148       return true;
13149 
13150     Result = getDerived().RebuildCXXFoldExpr(
13151         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
13152         Result.get(), E->getEndLoc(), OrigNumExpansions);
13153     if (Result.isInvalid())
13154       return true;
13155   }
13156 
13157   for (unsigned I = 0; I != *NumExpansions; ++I) {
13158     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13159         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13160     ExprResult Out = getDerived().TransformExpr(Pattern);
13161     if (Out.isInvalid())
13162       return true;
13163 
13164     if (Out.get()->containsUnexpandedParameterPack()) {
13165       // We still have a pack; retain a pack expansion for this slice.
13166       Result = getDerived().RebuildCXXFoldExpr(
13167           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13168           E->getOperator(), E->getEllipsisLoc(),
13169           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13170           OrigNumExpansions);
13171     } else if (Result.isUsable()) {
13172       // We've got down to a single element; build a binary operator.
13173       Result = getDerived().RebuildBinaryOperator(
13174           E->getEllipsisLoc(), E->getOperator(),
13175           LeftFold ? Result.get() : Out.get(),
13176           LeftFold ? Out.get() : Result.get());
13177     } else
13178       Result = Out;
13179 
13180     if (Result.isInvalid())
13181       return true;
13182   }
13183 
13184   // If we're retaining an expansion for a left fold, it is the outermost
13185   // component and takes the complete expansion so far as its init (if any).
13186   if (LeftFold && RetainExpansion) {
13187     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13188 
13189     ExprResult Out = getDerived().TransformExpr(Pattern);
13190     if (Out.isInvalid())
13191       return true;
13192 
13193     Result = getDerived().RebuildCXXFoldExpr(
13194         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
13195         Out.get(), E->getEndLoc(), OrigNumExpansions);
13196     if (Result.isInvalid())
13197       return true;
13198   }
13199 
13200   // If we had no init and an empty pack, and we're not retaining an expansion,
13201   // then produce a fallback value or error.
13202   if (Result.isUnset())
13203     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13204                                                 E->getOperator());
13205 
13206   return Result;
13207 }
13208 
13209 template<typename Derived>
13210 ExprResult
13211 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13212     CXXStdInitializerListExpr *E) {
13213   return getDerived().TransformExpr(E->getSubExpr());
13214 }
13215 
13216 template<typename Derived>
13217 ExprResult
13218 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13219   return SemaRef.MaybeBindToTemporary(E);
13220 }
13221 
13222 template<typename Derived>
13223 ExprResult
13224 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13225   return E;
13226 }
13227 
13228 template<typename Derived>
13229 ExprResult
13230 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13231   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13232   if (SubExpr.isInvalid())
13233     return ExprError();
13234 
13235   if (!getDerived().AlwaysRebuild() &&
13236       SubExpr.get() == E->getSubExpr())
13237     return E;
13238 
13239   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13240 }
13241 
13242 template<typename Derived>
13243 ExprResult
13244 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13245   // Transform each of the elements.
13246   SmallVector<Expr *, 8> Elements;
13247   bool ArgChanged = false;
13248   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13249                                   /*IsCall=*/false, Elements, &ArgChanged))
13250     return ExprError();
13251 
13252   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13253     return SemaRef.MaybeBindToTemporary(E);
13254 
13255   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13256                                               Elements.data(),
13257                                               Elements.size());
13258 }
13259 
13260 template<typename Derived>
13261 ExprResult
13262 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13263                                                     ObjCDictionaryLiteral *E) {
13264   // Transform each of the elements.
13265   SmallVector<ObjCDictionaryElement, 8> Elements;
13266   bool ArgChanged = false;
13267   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13268     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13269 
13270     if (OrigElement.isPackExpansion()) {
13271       // This key/value element is a pack expansion.
13272       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13273       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13274       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13275       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13276 
13277       // Determine whether the set of unexpanded parameter packs can
13278       // and should be expanded.
13279       bool Expand = true;
13280       bool RetainExpansion = false;
13281       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13282       Optional<unsigned> NumExpansions = OrigNumExpansions;
13283       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13284                                OrigElement.Value->getEndLoc());
13285       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13286                                                PatternRange, Unexpanded, Expand,
13287                                                RetainExpansion, NumExpansions))
13288         return ExprError();
13289 
13290       if (!Expand) {
13291         // The transform has determined that we should perform a simple
13292         // transformation on the pack expansion, producing another pack
13293         // expansion.
13294         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13295         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13296         if (Key.isInvalid())
13297           return ExprError();
13298 
13299         if (Key.get() != OrigElement.Key)
13300           ArgChanged = true;
13301 
13302         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13303         if (Value.isInvalid())
13304           return ExprError();
13305 
13306         if (Value.get() != OrigElement.Value)
13307           ArgChanged = true;
13308 
13309         ObjCDictionaryElement Expansion = {
13310           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13311         };
13312         Elements.push_back(Expansion);
13313         continue;
13314       }
13315 
13316       // Record right away that the argument was changed.  This needs
13317       // to happen even if the array expands to nothing.
13318       ArgChanged = true;
13319 
13320       // The transform has determined that we should perform an elementwise
13321       // expansion of the pattern. Do so.
13322       for (unsigned I = 0; I != *NumExpansions; ++I) {
13323         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13324         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13325         if (Key.isInvalid())
13326           return ExprError();
13327 
13328         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13329         if (Value.isInvalid())
13330           return ExprError();
13331 
13332         ObjCDictionaryElement Element = {
13333           Key.get(), Value.get(), SourceLocation(), NumExpansions
13334         };
13335 
13336         // If any unexpanded parameter packs remain, we still have a
13337         // pack expansion.
13338         // FIXME: Can this really happen?
13339         if (Key.get()->containsUnexpandedParameterPack() ||
13340             Value.get()->containsUnexpandedParameterPack())
13341           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13342 
13343         Elements.push_back(Element);
13344       }
13345 
13346       // FIXME: Retain a pack expansion if RetainExpansion is true.
13347 
13348       // We've finished with this pack expansion.
13349       continue;
13350     }
13351 
13352     // Transform and check key.
13353     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13354     if (Key.isInvalid())
13355       return ExprError();
13356 
13357     if (Key.get() != OrigElement.Key)
13358       ArgChanged = true;
13359 
13360     // Transform and check value.
13361     ExprResult Value
13362       = getDerived().TransformExpr(OrigElement.Value);
13363     if (Value.isInvalid())
13364       return ExprError();
13365 
13366     if (Value.get() != OrigElement.Value)
13367       ArgChanged = true;
13368 
13369     ObjCDictionaryElement Element = {
13370       Key.get(), Value.get(), SourceLocation(), None
13371     };
13372     Elements.push_back(Element);
13373   }
13374 
13375   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13376     return SemaRef.MaybeBindToTemporary(E);
13377 
13378   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13379                                                    Elements);
13380 }
13381 
13382 template<typename Derived>
13383 ExprResult
13384 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13385   TypeSourceInfo *EncodedTypeInfo
13386     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13387   if (!EncodedTypeInfo)
13388     return ExprError();
13389 
13390   if (!getDerived().AlwaysRebuild() &&
13391       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13392     return E;
13393 
13394   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13395                                             EncodedTypeInfo,
13396                                             E->getRParenLoc());
13397 }
13398 
13399 template<typename Derived>
13400 ExprResult TreeTransform<Derived>::
13401 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13402   // This is a kind of implicit conversion, and it needs to get dropped
13403   // and recomputed for the same general reasons that ImplicitCastExprs
13404   // do, as well a more specific one: this expression is only valid when
13405   // it appears *immediately* as an argument expression.
13406   return getDerived().TransformExpr(E->getSubExpr());
13407 }
13408 
13409 template<typename Derived>
13410 ExprResult TreeTransform<Derived>::
13411 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13412   TypeSourceInfo *TSInfo
13413     = getDerived().TransformType(E->getTypeInfoAsWritten());
13414   if (!TSInfo)
13415     return ExprError();
13416 
13417   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13418   if (Result.isInvalid())
13419     return ExprError();
13420 
13421   if (!getDerived().AlwaysRebuild() &&
13422       TSInfo == E->getTypeInfoAsWritten() &&
13423       Result.get() == E->getSubExpr())
13424     return E;
13425 
13426   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13427                                       E->getBridgeKeywordLoc(), TSInfo,
13428                                       Result.get());
13429 }
13430 
13431 template <typename Derived>
13432 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13433     ObjCAvailabilityCheckExpr *E) {
13434   return E;
13435 }
13436 
13437 template<typename Derived>
13438 ExprResult
13439 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13440   // Transform arguments.
13441   bool ArgChanged = false;
13442   SmallVector<Expr*, 8> Args;
13443   Args.reserve(E->getNumArgs());
13444   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13445                                   &ArgChanged))
13446     return ExprError();
13447 
13448   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13449     // Class message: transform the receiver type.
13450     TypeSourceInfo *ReceiverTypeInfo
13451       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13452     if (!ReceiverTypeInfo)
13453       return ExprError();
13454 
13455     // If nothing changed, just retain the existing message send.
13456     if (!getDerived().AlwaysRebuild() &&
13457         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13458       return SemaRef.MaybeBindToTemporary(E);
13459 
13460     // Build a new class message send.
13461     SmallVector<SourceLocation, 16> SelLocs;
13462     E->getSelectorLocs(SelLocs);
13463     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13464                                                E->getSelector(),
13465                                                SelLocs,
13466                                                E->getMethodDecl(),
13467                                                E->getLeftLoc(),
13468                                                Args,
13469                                                E->getRightLoc());
13470   }
13471   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13472            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13473     if (!E->getMethodDecl())
13474       return ExprError();
13475 
13476     // Build a new class message send to 'super'.
13477     SmallVector<SourceLocation, 16> SelLocs;
13478     E->getSelectorLocs(SelLocs);
13479     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13480                                                E->getSelector(),
13481                                                SelLocs,
13482                                                E->getReceiverType(),
13483                                                E->getMethodDecl(),
13484                                                E->getLeftLoc(),
13485                                                Args,
13486                                                E->getRightLoc());
13487   }
13488 
13489   // Instance message: transform the receiver
13490   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13491          "Only class and instance messages may be instantiated");
13492   ExprResult Receiver
13493     = getDerived().TransformExpr(E->getInstanceReceiver());
13494   if (Receiver.isInvalid())
13495     return ExprError();
13496 
13497   // If nothing changed, just retain the existing message send.
13498   if (!getDerived().AlwaysRebuild() &&
13499       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13500     return SemaRef.MaybeBindToTemporary(E);
13501 
13502   // Build a new instance message send.
13503   SmallVector<SourceLocation, 16> SelLocs;
13504   E->getSelectorLocs(SelLocs);
13505   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13506                                              E->getSelector(),
13507                                              SelLocs,
13508                                              E->getMethodDecl(),
13509                                              E->getLeftLoc(),
13510                                              Args,
13511                                              E->getRightLoc());
13512 }
13513 
13514 template<typename Derived>
13515 ExprResult
13516 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13517   return E;
13518 }
13519 
13520 template<typename Derived>
13521 ExprResult
13522 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13523   return E;
13524 }
13525 
13526 template<typename Derived>
13527 ExprResult
13528 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13529   // Transform the base expression.
13530   ExprResult Base = getDerived().TransformExpr(E->getBase());
13531   if (Base.isInvalid())
13532     return ExprError();
13533 
13534   // We don't need to transform the ivar; it will never change.
13535 
13536   // If nothing changed, just retain the existing expression.
13537   if (!getDerived().AlwaysRebuild() &&
13538       Base.get() == E->getBase())
13539     return E;
13540 
13541   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13542                                              E->getLocation(),
13543                                              E->isArrow(), E->isFreeIvar());
13544 }
13545 
13546 template<typename Derived>
13547 ExprResult
13548 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13549   // 'super' and types never change. Property never changes. Just
13550   // retain the existing expression.
13551   if (!E->isObjectReceiver())
13552     return E;
13553 
13554   // Transform the base expression.
13555   ExprResult Base = getDerived().TransformExpr(E->getBase());
13556   if (Base.isInvalid())
13557     return ExprError();
13558 
13559   // We don't need to transform the property; it will never change.
13560 
13561   // If nothing changed, just retain the existing expression.
13562   if (!getDerived().AlwaysRebuild() &&
13563       Base.get() == E->getBase())
13564     return E;
13565 
13566   if (E->isExplicitProperty())
13567     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13568                                                    E->getExplicitProperty(),
13569                                                    E->getLocation());
13570 
13571   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13572                                                  SemaRef.Context.PseudoObjectTy,
13573                                                  E->getImplicitPropertyGetter(),
13574                                                  E->getImplicitPropertySetter(),
13575                                                  E->getLocation());
13576 }
13577 
13578 template<typename Derived>
13579 ExprResult
13580 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13581   // Transform the base expression.
13582   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13583   if (Base.isInvalid())
13584     return ExprError();
13585 
13586   // Transform the key expression.
13587   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13588   if (Key.isInvalid())
13589     return ExprError();
13590 
13591   // If nothing changed, just retain the existing expression.
13592   if (!getDerived().AlwaysRebuild() &&
13593       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13594     return E;
13595 
13596   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13597                                                   Base.get(), Key.get(),
13598                                                   E->getAtIndexMethodDecl(),
13599                                                   E->setAtIndexMethodDecl());
13600 }
13601 
13602 template<typename Derived>
13603 ExprResult
13604 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13605   // Transform the base expression.
13606   ExprResult Base = getDerived().TransformExpr(E->getBase());
13607   if (Base.isInvalid())
13608     return ExprError();
13609 
13610   // If nothing changed, just retain the existing expression.
13611   if (!getDerived().AlwaysRebuild() &&
13612       Base.get() == E->getBase())
13613     return E;
13614 
13615   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13616                                          E->getOpLoc(),
13617                                          E->isArrow());
13618 }
13619 
13620 template<typename Derived>
13621 ExprResult
13622 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13623   bool ArgumentChanged = false;
13624   SmallVector<Expr*, 8> SubExprs;
13625   SubExprs.reserve(E->getNumSubExprs());
13626   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13627                                   SubExprs, &ArgumentChanged))
13628     return ExprError();
13629 
13630   if (!getDerived().AlwaysRebuild() &&
13631       !ArgumentChanged)
13632     return E;
13633 
13634   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13635                                                SubExprs,
13636                                                E->getRParenLoc());
13637 }
13638 
13639 template<typename Derived>
13640 ExprResult
13641 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13642   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13643   if (SrcExpr.isInvalid())
13644     return ExprError();
13645 
13646   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13647   if (!Type)
13648     return ExprError();
13649 
13650   if (!getDerived().AlwaysRebuild() &&
13651       Type == E->getTypeSourceInfo() &&
13652       SrcExpr.get() == E->getSrcExpr())
13653     return E;
13654 
13655   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13656                                                SrcExpr.get(), Type,
13657                                                E->getRParenLoc());
13658 }
13659 
13660 template<typename Derived>
13661 ExprResult
13662 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13663   BlockDecl *oldBlock = E->getBlockDecl();
13664 
13665   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13666   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13667 
13668   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13669   blockScope->TheDecl->setBlockMissingReturnType(
13670                          oldBlock->blockMissingReturnType());
13671 
13672   SmallVector<ParmVarDecl*, 4> params;
13673   SmallVector<QualType, 4> paramTypes;
13674 
13675   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13676 
13677   // Parameter substitution.
13678   Sema::ExtParameterInfoBuilder extParamInfos;
13679   if (getDerived().TransformFunctionTypeParams(
13680           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13681           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13682           extParamInfos)) {
13683     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13684     return ExprError();
13685   }
13686 
13687   QualType exprResultType =
13688       getDerived().TransformType(exprFunctionType->getReturnType());
13689 
13690   auto epi = exprFunctionType->getExtProtoInfo();
13691   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13692 
13693   QualType functionType =
13694     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13695   blockScope->FunctionType = functionType;
13696 
13697   // Set the parameters on the block decl.
13698   if (!params.empty())
13699     blockScope->TheDecl->setParams(params);
13700 
13701   if (!oldBlock->blockMissingReturnType()) {
13702     blockScope->HasImplicitReturnType = false;
13703     blockScope->ReturnType = exprResultType;
13704   }
13705 
13706   // Transform the body
13707   StmtResult body = getDerived().TransformStmt(E->getBody());
13708   if (body.isInvalid()) {
13709     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13710     return ExprError();
13711   }
13712 
13713 #ifndef NDEBUG
13714   // In builds with assertions, make sure that we captured everything we
13715   // captured before.
13716   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13717     for (const auto &I : oldBlock->captures()) {
13718       VarDecl *oldCapture = I.getVariable();
13719 
13720       // Ignore parameter packs.
13721       if (oldCapture->isParameterPack())
13722         continue;
13723 
13724       VarDecl *newCapture =
13725         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13726                                                  oldCapture));
13727       assert(blockScope->CaptureMap.count(newCapture));
13728     }
13729     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13730   }
13731 #endif
13732 
13733   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13734                                     /*Scope=*/nullptr);
13735 }
13736 
13737 template<typename Derived>
13738 ExprResult
13739 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13740   llvm_unreachable("Cannot transform asType expressions yet");
13741 }
13742 
13743 template<typename Derived>
13744 ExprResult
13745 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13746   bool ArgumentChanged = false;
13747   SmallVector<Expr*, 8> SubExprs;
13748   SubExprs.reserve(E->getNumSubExprs());
13749   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13750                                   SubExprs, &ArgumentChanged))
13751     return ExprError();
13752 
13753   if (!getDerived().AlwaysRebuild() &&
13754       !ArgumentChanged)
13755     return E;
13756 
13757   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13758                                         E->getOp(), E->getRParenLoc());
13759 }
13760 
13761 //===----------------------------------------------------------------------===//
13762 // Type reconstruction
13763 //===----------------------------------------------------------------------===//
13764 
13765 template<typename Derived>
13766 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13767                                                     SourceLocation Star) {
13768   return SemaRef.BuildPointerType(PointeeType, Star,
13769                                   getDerived().getBaseEntity());
13770 }
13771 
13772 template<typename Derived>
13773 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13774                                                          SourceLocation Star) {
13775   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13776                                        getDerived().getBaseEntity());
13777 }
13778 
13779 template<typename Derived>
13780 QualType
13781 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13782                                              bool WrittenAsLValue,
13783                                              SourceLocation Sigil) {
13784   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13785                                     Sigil, getDerived().getBaseEntity());
13786 }
13787 
13788 template<typename Derived>
13789 QualType
13790 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13791                                                  QualType ClassType,
13792                                                  SourceLocation Sigil) {
13793   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13794                                         getDerived().getBaseEntity());
13795 }
13796 
13797 template<typename Derived>
13798 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13799            const ObjCTypeParamDecl *Decl,
13800            SourceLocation ProtocolLAngleLoc,
13801            ArrayRef<ObjCProtocolDecl *> Protocols,
13802            ArrayRef<SourceLocation> ProtocolLocs,
13803            SourceLocation ProtocolRAngleLoc) {
13804   return SemaRef.BuildObjCTypeParamType(Decl,
13805                                         ProtocolLAngleLoc, Protocols,
13806                                         ProtocolLocs, ProtocolRAngleLoc,
13807                                         /*FailOnError=*/true);
13808 }
13809 
13810 template<typename Derived>
13811 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13812            QualType BaseType,
13813            SourceLocation Loc,
13814            SourceLocation TypeArgsLAngleLoc,
13815            ArrayRef<TypeSourceInfo *> TypeArgs,
13816            SourceLocation TypeArgsRAngleLoc,
13817            SourceLocation ProtocolLAngleLoc,
13818            ArrayRef<ObjCProtocolDecl *> Protocols,
13819            ArrayRef<SourceLocation> ProtocolLocs,
13820            SourceLocation ProtocolRAngleLoc) {
13821   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13822                                      TypeArgs, TypeArgsRAngleLoc,
13823                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13824                                      ProtocolRAngleLoc,
13825                                      /*FailOnError=*/true);
13826 }
13827 
13828 template<typename Derived>
13829 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13830            QualType PointeeType,
13831            SourceLocation Star) {
13832   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13833 }
13834 
13835 template<typename Derived>
13836 QualType
13837 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13838                                          ArrayType::ArraySizeModifier SizeMod,
13839                                          const llvm::APInt *Size,
13840                                          Expr *SizeExpr,
13841                                          unsigned IndexTypeQuals,
13842                                          SourceRange BracketsRange) {
13843   if (SizeExpr || !Size)
13844     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13845                                   IndexTypeQuals, BracketsRange,
13846                                   getDerived().getBaseEntity());
13847 
13848   QualType Types[] = {
13849     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13850     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13851     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13852   };
13853   const unsigned NumTypes = llvm::array_lengthof(Types);
13854   QualType SizeType;
13855   for (unsigned I = 0; I != NumTypes; ++I)
13856     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13857       SizeType = Types[I];
13858       break;
13859     }
13860 
13861   // Note that we can return a VariableArrayType here in the case where
13862   // the element type was a dependent VariableArrayType.
13863   IntegerLiteral *ArraySize
13864       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13865                                /*FIXME*/BracketsRange.getBegin());
13866   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13867                                 IndexTypeQuals, BracketsRange,
13868                                 getDerived().getBaseEntity());
13869 }
13870 
13871 template<typename Derived>
13872 QualType
13873 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13874                                                  ArrayType::ArraySizeModifier SizeMod,
13875                                                  const llvm::APInt &Size,
13876                                                  Expr *SizeExpr,
13877                                                  unsigned IndexTypeQuals,
13878                                                  SourceRange BracketsRange) {
13879   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13880                                         IndexTypeQuals, BracketsRange);
13881 }
13882 
13883 template<typename Derived>
13884 QualType
13885 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13886                                           ArrayType::ArraySizeModifier SizeMod,
13887                                                  unsigned IndexTypeQuals,
13888                                                    SourceRange BracketsRange) {
13889   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13890                                        IndexTypeQuals, BracketsRange);
13891 }
13892 
13893 template<typename Derived>
13894 QualType
13895 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13896                                           ArrayType::ArraySizeModifier SizeMod,
13897                                                  Expr *SizeExpr,
13898                                                  unsigned IndexTypeQuals,
13899                                                  SourceRange BracketsRange) {
13900   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13901                                        SizeExpr,
13902                                        IndexTypeQuals, BracketsRange);
13903 }
13904 
13905 template<typename Derived>
13906 QualType
13907 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13908                                           ArrayType::ArraySizeModifier SizeMod,
13909                                                        Expr *SizeExpr,
13910                                                        unsigned IndexTypeQuals,
13911                                                    SourceRange BracketsRange) {
13912   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13913                                        SizeExpr,
13914                                        IndexTypeQuals, BracketsRange);
13915 }
13916 
13917 template <typename Derived>
13918 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13919     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13920   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13921                                           AttributeLoc);
13922 }
13923 
13924 template <typename Derived>
13925 QualType
13926 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13927                                           unsigned NumElements,
13928                                           VectorType::VectorKind VecKind) {
13929   // FIXME: semantic checking!
13930   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13931 }
13932 
13933 template <typename Derived>
13934 QualType TreeTransform<Derived>::RebuildDependentVectorType(
13935     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
13936     VectorType::VectorKind VecKind) {
13937   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
13938 }
13939 
13940 template<typename Derived>
13941 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
13942                                                       unsigned NumElements,
13943                                                  SourceLocation AttributeLoc) {
13944   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13945                           NumElements, true);
13946   IntegerLiteral *VectorSize
13947     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
13948                              AttributeLoc);
13949   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
13950 }
13951 
13952 template<typename Derived>
13953 QualType
13954 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
13955                                                            Expr *SizeExpr,
13956                                                   SourceLocation AttributeLoc) {
13957   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
13958 }
13959 
13960 template <typename Derived>
13961 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
13962     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
13963   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
13964                                                NumColumns);
13965 }
13966 
13967 template <typename Derived>
13968 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
13969     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
13970     SourceLocation AttributeLoc) {
13971   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
13972                                  AttributeLoc);
13973 }
13974 
13975 template<typename Derived>
13976 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
13977     QualType T,
13978     MutableArrayRef<QualType> ParamTypes,
13979     const FunctionProtoType::ExtProtoInfo &EPI) {
13980   return SemaRef.BuildFunctionType(T, ParamTypes,
13981                                    getDerived().getBaseLocation(),
13982                                    getDerived().getBaseEntity(),
13983                                    EPI);
13984 }
13985 
13986 template<typename Derived>
13987 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
13988   return SemaRef.Context.getFunctionNoProtoType(T);
13989 }
13990 
13991 template<typename Derived>
13992 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
13993                                                             Decl *D) {
13994   assert(D && "no decl found");
13995   if (D->isInvalidDecl()) return QualType();
13996 
13997   // FIXME: Doesn't account for ObjCInterfaceDecl!
13998   TypeDecl *Ty;
13999   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14000     // A valid resolved using typename pack expansion decl can have multiple
14001     // UsingDecls, but they must each have exactly one type, and it must be
14002     // the same type in every case. But we must have at least one expansion!
14003     if (UPD->expansions().empty()) {
14004       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14005           << UPD->isCXXClassMember() << UPD;
14006       return QualType();
14007     }
14008 
14009     // We might still have some unresolved types. Try to pick a resolved type
14010     // if we can. The final instantiation will check that the remaining
14011     // unresolved types instantiate to the type we pick.
14012     QualType FallbackT;
14013     QualType T;
14014     for (auto *E : UPD->expansions()) {
14015       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14016       if (ThisT.isNull())
14017         continue;
14018       else if (ThisT->getAs<UnresolvedUsingType>())
14019         FallbackT = ThisT;
14020       else if (T.isNull())
14021         T = ThisT;
14022       else
14023         assert(getSema().Context.hasSameType(ThisT, T) &&
14024                "mismatched resolved types in using pack expansion");
14025     }
14026     return T.isNull() ? FallbackT : T;
14027   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14028     assert(Using->hasTypename() &&
14029            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14030 
14031     // A valid resolved using typename decl points to exactly one type decl.
14032     assert(++Using->shadow_begin() == Using->shadow_end());
14033     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14034   } else {
14035     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14036            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14037     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14038   }
14039 
14040   return SemaRef.Context.getTypeDeclType(Ty);
14041 }
14042 
14043 template<typename Derived>
14044 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14045                                                        SourceLocation Loc) {
14046   return SemaRef.BuildTypeofExprType(E, Loc);
14047 }
14048 
14049 template<typename Derived>
14050 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14051   return SemaRef.Context.getTypeOfType(Underlying);
14052 }
14053 
14054 template<typename Derived>
14055 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14056                                                      SourceLocation Loc) {
14057   return SemaRef.BuildDecltypeType(E, Loc);
14058 }
14059 
14060 template<typename Derived>
14061 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14062                                             UnaryTransformType::UTTKind UKind,
14063                                             SourceLocation Loc) {
14064   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14065 }
14066 
14067 template<typename Derived>
14068 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14069                                                       TemplateName Template,
14070                                              SourceLocation TemplateNameLoc,
14071                                      TemplateArgumentListInfo &TemplateArgs) {
14072   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14073 }
14074 
14075 template<typename Derived>
14076 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14077                                                    SourceLocation KWLoc) {
14078   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14079 }
14080 
14081 template<typename Derived>
14082 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14083                                                  SourceLocation KWLoc,
14084                                                  bool isReadPipe) {
14085   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14086                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14087 }
14088 
14089 template <typename Derived>
14090 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14091                                                    unsigned NumBits,
14092                                                    SourceLocation Loc) {
14093   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14094                         NumBits, true);
14095   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14096                                                 SemaRef.Context.IntTy, Loc);
14097   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14098 }
14099 
14100 template <typename Derived>
14101 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14102     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14103   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14104 }
14105 
14106 template<typename Derived>
14107 TemplateName
14108 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14109                                             bool TemplateKW,
14110                                             TemplateDecl *Template) {
14111   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14112                                                   Template);
14113 }
14114 
14115 template<typename Derived>
14116 TemplateName
14117 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14118                                             SourceLocation TemplateKWLoc,
14119                                             const IdentifierInfo &Name,
14120                                             SourceLocation NameLoc,
14121                                             QualType ObjectType,
14122                                             NamedDecl *FirstQualifierInScope,
14123                                             bool AllowInjectedClassName) {
14124   UnqualifiedId TemplateName;
14125   TemplateName.setIdentifier(&Name, NameLoc);
14126   Sema::TemplateTy Template;
14127   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14128                               TemplateName, ParsedType::make(ObjectType),
14129                               /*EnteringContext=*/false, Template,
14130                               AllowInjectedClassName);
14131   return Template.get();
14132 }
14133 
14134 template<typename Derived>
14135 TemplateName
14136 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14137                                             SourceLocation TemplateKWLoc,
14138                                             OverloadedOperatorKind Operator,
14139                                             SourceLocation NameLoc,
14140                                             QualType ObjectType,
14141                                             bool AllowInjectedClassName) {
14142   UnqualifiedId Name;
14143   // FIXME: Bogus location information.
14144   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14145   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14146   Sema::TemplateTy Template;
14147   getSema().ActOnTemplateName(
14148       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14149       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14150   return Template.get();
14151 }
14152 
14153 template<typename Derived>
14154 ExprResult
14155 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14156                                                    SourceLocation OpLoc,
14157                                                    Expr *OrigCallee,
14158                                                    Expr *First,
14159                                                    Expr *Second) {
14160   Expr *Callee = OrigCallee->IgnoreParenCasts();
14161   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14162 
14163   if (First->getObjectKind() == OK_ObjCProperty) {
14164     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14165     if (BinaryOperator::isAssignmentOp(Opc))
14166       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14167                                                  First, Second);
14168     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14169     if (Result.isInvalid())
14170       return ExprError();
14171     First = Result.get();
14172   }
14173 
14174   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14175     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14176     if (Result.isInvalid())
14177       return ExprError();
14178     Second = Result.get();
14179   }
14180 
14181   // Determine whether this should be a builtin operation.
14182   if (Op == OO_Subscript) {
14183     if (!First->getType()->isOverloadableType() &&
14184         !Second->getType()->isOverloadableType())
14185       return getSema().CreateBuiltinArraySubscriptExpr(
14186           First, Callee->getBeginLoc(), Second, OpLoc);
14187   } else if (Op == OO_Arrow) {
14188     // -> is never a builtin operation.
14189     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14190   } else if (Second == nullptr || isPostIncDec) {
14191     if (!First->getType()->isOverloadableType() ||
14192         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14193       // The argument is not of overloadable type, or this is an expression
14194       // of the form &Class::member, so try to create a built-in unary
14195       // operation.
14196       UnaryOperatorKind Opc
14197         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14198 
14199       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14200     }
14201   } else {
14202     if (!First->getType()->isOverloadableType() &&
14203         !Second->getType()->isOverloadableType()) {
14204       // Neither of the arguments is an overloadable type, so try to
14205       // create a built-in binary operation.
14206       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14207       ExprResult Result
14208         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14209       if (Result.isInvalid())
14210         return ExprError();
14211 
14212       return Result;
14213     }
14214   }
14215 
14216   // Compute the transformed set of functions (and function templates) to be
14217   // used during overload resolution.
14218   UnresolvedSet<16> Functions;
14219   bool RequiresADL;
14220 
14221   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14222     Functions.append(ULE->decls_begin(), ULE->decls_end());
14223     // If the overload could not be resolved in the template definition
14224     // (because we had a dependent argument), ADL is performed as part of
14225     // template instantiation.
14226     RequiresADL = ULE->requiresADL();
14227   } else {
14228     // If we've resolved this to a particular non-member function, just call
14229     // that function. If we resolved it to a member function,
14230     // CreateOverloaded* will find that function for us.
14231     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14232     if (!isa<CXXMethodDecl>(ND))
14233       Functions.addDecl(ND);
14234     RequiresADL = false;
14235   }
14236 
14237   // Add any functions found via argument-dependent lookup.
14238   Expr *Args[2] = { First, Second };
14239   unsigned NumArgs = 1 + (Second != nullptr);
14240 
14241   // Create the overloaded operator invocation for unary operators.
14242   if (NumArgs == 1 || isPostIncDec) {
14243     UnaryOperatorKind Opc
14244       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14245     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14246                                            RequiresADL);
14247   }
14248 
14249   if (Op == OO_Subscript) {
14250     SourceLocation LBrace;
14251     SourceLocation RBrace;
14252 
14253     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14254         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14255         LBrace = SourceLocation::getFromRawEncoding(
14256                     NameLoc.CXXOperatorName.BeginOpNameLoc);
14257         RBrace = SourceLocation::getFromRawEncoding(
14258                     NameLoc.CXXOperatorName.EndOpNameLoc);
14259     } else {
14260       LBrace = Callee->getBeginLoc();
14261       RBrace = OpLoc;
14262     }
14263 
14264     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14265                                                       First, Second);
14266   }
14267 
14268   // Create the overloaded operator invocation for binary operators.
14269   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14270   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14271       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14272   if (Result.isInvalid())
14273     return ExprError();
14274 
14275   return Result;
14276 }
14277 
14278 template<typename Derived>
14279 ExprResult
14280 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14281                                                      SourceLocation OperatorLoc,
14282                                                        bool isArrow,
14283                                                        CXXScopeSpec &SS,
14284                                                      TypeSourceInfo *ScopeType,
14285                                                        SourceLocation CCLoc,
14286                                                        SourceLocation TildeLoc,
14287                                         PseudoDestructorTypeStorage Destroyed) {
14288   QualType BaseType = Base->getType();
14289   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14290       (!isArrow && !BaseType->getAs<RecordType>()) ||
14291       (isArrow && BaseType->getAs<PointerType>() &&
14292        !BaseType->castAs<PointerType>()->getPointeeType()
14293                                               ->template getAs<RecordType>())){
14294     // This pseudo-destructor expression is still a pseudo-destructor.
14295     return SemaRef.BuildPseudoDestructorExpr(
14296         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14297         CCLoc, TildeLoc, Destroyed);
14298   }
14299 
14300   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14301   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14302                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14303   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14304   NameInfo.setNamedTypeInfo(DestroyedType);
14305 
14306   // The scope type is now known to be a valid nested name specifier
14307   // component. Tack it on to the end of the nested name specifier.
14308   if (ScopeType) {
14309     if (!ScopeType->getType()->getAs<TagType>()) {
14310       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14311                      diag::err_expected_class_or_namespace)
14312           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14313       return ExprError();
14314     }
14315     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14316               CCLoc);
14317   }
14318 
14319   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14320   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14321                                             OperatorLoc, isArrow,
14322                                             SS, TemplateKWLoc,
14323                                             /*FIXME: FirstQualifier*/ nullptr,
14324                                             NameInfo,
14325                                             /*TemplateArgs*/ nullptr,
14326                                             /*S*/nullptr);
14327 }
14328 
14329 template<typename Derived>
14330 StmtResult
14331 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14332   SourceLocation Loc = S->getBeginLoc();
14333   CapturedDecl *CD = S->getCapturedDecl();
14334   unsigned NumParams = CD->getNumParams();
14335   unsigned ContextParamPos = CD->getContextParamPosition();
14336   SmallVector<Sema::CapturedParamNameType, 4> Params;
14337   for (unsigned I = 0; I < NumParams; ++I) {
14338     if (I != ContextParamPos) {
14339       Params.push_back(
14340              std::make_pair(
14341                   CD->getParam(I)->getName(),
14342                   getDerived().TransformType(CD->getParam(I)->getType())));
14343     } else {
14344       Params.push_back(std::make_pair(StringRef(), QualType()));
14345     }
14346   }
14347   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14348                                      S->getCapturedRegionKind(), Params);
14349   StmtResult Body;
14350   {
14351     Sema::CompoundScopeRAII CompoundScope(getSema());
14352     Body = getDerived().TransformStmt(S->getCapturedStmt());
14353   }
14354 
14355   if (Body.isInvalid()) {
14356     getSema().ActOnCapturedRegionError();
14357     return StmtError();
14358   }
14359 
14360   return getSema().ActOnCapturedRegionEnd(Body.get());
14361 }
14362 
14363 } // end namespace clang
14364 
14365 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14366