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 'is_device_ptr' 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 *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2044                                          const OMPVarListLocTy &Locs) {
2045     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2046   }
2047 
2048   /// Build a new OpenMP 'defaultmap' 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 *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2053                                         OpenMPDefaultmapClauseKind Kind,
2054                                         SourceLocation StartLoc,
2055                                         SourceLocation LParenLoc,
2056                                         SourceLocation MLoc,
2057                                         SourceLocation KindLoc,
2058                                         SourceLocation EndLoc) {
2059     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2060                                                  MLoc, KindLoc, EndLoc);
2061   }
2062 
2063   /// Build a new OpenMP 'nontemporal' clause.
2064   ///
2065   /// By default, performs semantic analysis to build the new OpenMP clause.
2066   /// Subclasses may override this routine to provide different behavior.
2067   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2068                                          SourceLocation StartLoc,
2069                                          SourceLocation LParenLoc,
2070                                          SourceLocation EndLoc) {
2071     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2072                                                   EndLoc);
2073   }
2074 
2075   /// Build a new OpenMP 'inclusive' clause.
2076   ///
2077   /// By default, performs semantic analysis to build the new OpenMP clause.
2078   /// Subclasses may override this routine to provide different behavior.
2079   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2080                                        SourceLocation StartLoc,
2081                                        SourceLocation LParenLoc,
2082                                        SourceLocation EndLoc) {
2083     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2084                                                 EndLoc);
2085   }
2086 
2087   /// Build a new OpenMP 'exclusive' clause.
2088   ///
2089   /// By default, performs semantic analysis to build the new OpenMP clause.
2090   /// Subclasses may override this routine to provide different behavior.
2091   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2092                                        SourceLocation StartLoc,
2093                                        SourceLocation LParenLoc,
2094                                        SourceLocation EndLoc) {
2095     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2096                                                 EndLoc);
2097   }
2098 
2099   /// Build a new OpenMP 'uses_allocators' clause.
2100   ///
2101   /// By default, performs semantic analysis to build the new OpenMP clause.
2102   /// Subclasses may override this routine to provide different behavior.
2103   OMPClause *RebuildOMPUsesAllocatorsClause(
2104       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2105       SourceLocation LParenLoc, SourceLocation EndLoc) {
2106     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2107                                                     Data);
2108   }
2109 
2110   /// Build a new OpenMP 'affinity' clause.
2111   ///
2112   /// By default, performs semantic analysis to build the new OpenMP clause.
2113   /// Subclasses may override this routine to provide different behavior.
2114   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2115                                       SourceLocation LParenLoc,
2116                                       SourceLocation ColonLoc,
2117                                       SourceLocation EndLoc, Expr *Modifier,
2118                                       ArrayRef<Expr *> Locators) {
2119     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2120                                                EndLoc, Modifier, Locators);
2121   }
2122 
2123   /// Build a new OpenMP 'order' clause.
2124   ///
2125   /// By default, performs semantic analysis to build the new OpenMP clause.
2126   /// Subclasses may override this routine to provide different behavior.
2127   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2128                                    SourceLocation KindKwLoc,
2129                                    SourceLocation StartLoc,
2130                                    SourceLocation LParenLoc,
2131                                    SourceLocation EndLoc) {
2132     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2133                                             LParenLoc, EndLoc);
2134   }
2135 
2136   /// Rebuild the operand to an Objective-C \@synchronized statement.
2137   ///
2138   /// By default, performs semantic analysis to build the new statement.
2139   /// Subclasses may override this routine to provide different behavior.
2140   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2141                                               Expr *object) {
2142     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2143   }
2144 
2145   /// Build a new 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   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2150                                            Expr *Object, Stmt *Body) {
2151     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2152   }
2153 
2154   /// Build a new Objective-C \@autoreleasepool 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 RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2159                                             Stmt *Body) {
2160     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2161   }
2162 
2163   /// Build a new Objective-C fast enumeration 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 RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2168                                           Stmt *Element,
2169                                           Expr *Collection,
2170                                           SourceLocation RParenLoc,
2171                                           Stmt *Body) {
2172     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2173                                                 Element,
2174                                                 Collection,
2175                                                 RParenLoc);
2176     if (ForEachStmt.isInvalid())
2177       return StmtError();
2178 
2179     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2180   }
2181 
2182   /// Build a new C++ exception declaration.
2183   ///
2184   /// By default, performs semantic analysis to build the new decaration.
2185   /// Subclasses may override this routine to provide different behavior.
2186   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2187                                 TypeSourceInfo *Declarator,
2188                                 SourceLocation StartLoc,
2189                                 SourceLocation IdLoc,
2190                                 IdentifierInfo *Id) {
2191     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2192                                                        StartLoc, IdLoc, Id);
2193     if (Var)
2194       getSema().CurContext->addDecl(Var);
2195     return Var;
2196   }
2197 
2198   /// Build a new C++ catch statement.
2199   ///
2200   /// By default, performs semantic analysis to build the new statement.
2201   /// Subclasses may override this routine to provide different behavior.
2202   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2203                                  VarDecl *ExceptionDecl,
2204                                  Stmt *Handler) {
2205     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2206                                                       Handler));
2207   }
2208 
2209   /// Build a new C++ try statement.
2210   ///
2211   /// By default, performs semantic analysis to build the new statement.
2212   /// Subclasses may override this routine to provide different behavior.
2213   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2214                                ArrayRef<Stmt *> Handlers) {
2215     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2216   }
2217 
2218   /// Build a new C++0x range-based for 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 RebuildCXXForRangeStmt(SourceLocation ForLoc,
2223                                     SourceLocation CoawaitLoc, Stmt *Init,
2224                                     SourceLocation ColonLoc, Stmt *Range,
2225                                     Stmt *Begin, Stmt *End, Expr *Cond,
2226                                     Expr *Inc, Stmt *LoopVar,
2227                                     SourceLocation RParenLoc) {
2228     // If we've just learned that the range is actually an Objective-C
2229     // collection, treat this as an Objective-C fast enumeration loop.
2230     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2231       if (RangeStmt->isSingleDecl()) {
2232         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2233           if (RangeVar->isInvalidDecl())
2234             return StmtError();
2235 
2236           Expr *RangeExpr = RangeVar->getInit();
2237           if (!RangeExpr->isTypeDependent() &&
2238               RangeExpr->getType()->isObjCObjectPointerType()) {
2239             // FIXME: Support init-statements in Objective-C++20 ranged for
2240             // statement.
2241             if (Init) {
2242               return SemaRef.Diag(Init->getBeginLoc(),
2243                                   diag::err_objc_for_range_init_stmt)
2244                          << Init->getSourceRange();
2245             }
2246             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2247                                                         RangeExpr, RParenLoc);
2248           }
2249         }
2250       }
2251     }
2252 
2253     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2254                                           Range, Begin, End, Cond, Inc, LoopVar,
2255                                           RParenLoc, Sema::BFRK_Rebuild);
2256   }
2257 
2258   /// Build a new C++0x range-based for statement.
2259   ///
2260   /// By default, performs semantic analysis to build the new statement.
2261   /// Subclasses may override this routine to provide different behavior.
2262   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2263                                           bool IsIfExists,
2264                                           NestedNameSpecifierLoc QualifierLoc,
2265                                           DeclarationNameInfo NameInfo,
2266                                           Stmt *Nested) {
2267     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2268                                                 QualifierLoc, NameInfo, Nested);
2269   }
2270 
2271   /// Attach body to a C++0x range-based for statement.
2272   ///
2273   /// By default, performs semantic analysis to finish the new statement.
2274   /// Subclasses may override this routine to provide different behavior.
2275   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2276     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2277   }
2278 
2279   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2280                                Stmt *TryBlock, Stmt *Handler) {
2281     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2282   }
2283 
2284   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2285                                   Stmt *Block) {
2286     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2287   }
2288 
2289   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2290     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2291   }
2292 
2293   /// Build a new predefined expression.
2294   ///
2295   /// By default, performs semantic analysis to build the new expression.
2296   /// Subclasses may override this routine to provide different behavior.
2297   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2298                                    PredefinedExpr::IdentKind IK) {
2299     return getSema().BuildPredefinedExpr(Loc, IK);
2300   }
2301 
2302   /// Build a new expression that references a declaration.
2303   ///
2304   /// By default, performs semantic analysis to build the new expression.
2305   /// Subclasses may override this routine to provide different behavior.
2306   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2307                                         LookupResult &R,
2308                                         bool RequiresADL) {
2309     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2310   }
2311 
2312 
2313   /// Build a new expression that references a declaration.
2314   ///
2315   /// By default, performs semantic analysis to build the new expression.
2316   /// Subclasses may override this routine to provide different behavior.
2317   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2318                                 ValueDecl *VD,
2319                                 const DeclarationNameInfo &NameInfo,
2320                                 NamedDecl *Found,
2321                                 TemplateArgumentListInfo *TemplateArgs) {
2322     CXXScopeSpec SS;
2323     SS.Adopt(QualifierLoc);
2324     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2325                                               TemplateArgs);
2326   }
2327 
2328   /// Build a new expression in parentheses.
2329   ///
2330   /// By default, performs semantic analysis to build the new expression.
2331   /// Subclasses may override this routine to provide different behavior.
2332   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2333                                     SourceLocation RParen) {
2334     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2335   }
2336 
2337   /// Build a new pseudo-destructor expression.
2338   ///
2339   /// By default, performs semantic analysis to build the new expression.
2340   /// Subclasses may override this routine to provide different behavior.
2341   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2342                                             SourceLocation OperatorLoc,
2343                                             bool isArrow,
2344                                             CXXScopeSpec &SS,
2345                                             TypeSourceInfo *ScopeType,
2346                                             SourceLocation CCLoc,
2347                                             SourceLocation TildeLoc,
2348                                         PseudoDestructorTypeStorage Destroyed);
2349 
2350   /// Build a new unary operator expression.
2351   ///
2352   /// By default, performs semantic analysis to build the new expression.
2353   /// Subclasses may override this routine to provide different behavior.
2354   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2355                                         UnaryOperatorKind Opc,
2356                                         Expr *SubExpr) {
2357     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2358   }
2359 
2360   /// Build a new builtin offsetof expression.
2361   ///
2362   /// By default, performs semantic analysis to build the new expression.
2363   /// Subclasses may override this routine to provide different behavior.
2364   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2365                                  TypeSourceInfo *Type,
2366                                  ArrayRef<Sema::OffsetOfComponent> Components,
2367                                  SourceLocation RParenLoc) {
2368     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2369                                           RParenLoc);
2370   }
2371 
2372   /// Build a new sizeof, alignof or vec_step expression with a
2373   /// type argument.
2374   ///
2375   /// By default, performs semantic analysis to build the new expression.
2376   /// Subclasses may override this routine to provide different behavior.
2377   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2378                                          SourceLocation OpLoc,
2379                                          UnaryExprOrTypeTrait ExprKind,
2380                                          SourceRange R) {
2381     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2382   }
2383 
2384   /// Build a new sizeof, alignof or vec step expression with an
2385   /// expression argument.
2386   ///
2387   /// By default, performs semantic analysis to build the new expression.
2388   /// Subclasses may override this routine to provide different behavior.
2389   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2390                                          UnaryExprOrTypeTrait ExprKind,
2391                                          SourceRange R) {
2392     ExprResult Result
2393       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2394     if (Result.isInvalid())
2395       return ExprError();
2396 
2397     return Result;
2398   }
2399 
2400   /// Build a new array subscript expression.
2401   ///
2402   /// By default, performs semantic analysis to build the new expression.
2403   /// Subclasses may override this routine to provide different behavior.
2404   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2405                                              SourceLocation LBracketLoc,
2406                                              Expr *RHS,
2407                                              SourceLocation RBracketLoc) {
2408     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2409                                              LBracketLoc, RHS,
2410                                              RBracketLoc);
2411   }
2412 
2413   /// Build a new array section expression.
2414   ///
2415   /// By default, performs semantic analysis to build the new expression.
2416   /// Subclasses may override this routine to provide different behavior.
2417   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2418                                         Expr *LowerBound,
2419                                         SourceLocation ColonLoc, Expr *Length,
2420                                         SourceLocation RBracketLoc) {
2421     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2422                                               ColonLoc, Length, RBracketLoc);
2423   }
2424 
2425   /// Build a new array shaping expression.
2426   ///
2427   /// By default, performs semantic analysis to build the new expression.
2428   /// Subclasses may override this routine to provide different behavior.
2429   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2430                                         SourceLocation RParenLoc,
2431                                         ArrayRef<Expr *> Dims,
2432                                         ArrayRef<SourceRange> BracketsRanges) {
2433     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2434                                               BracketsRanges);
2435   }
2436 
2437   /// Build a new iterator expression.
2438   ///
2439   /// By default, performs semantic analysis to build the new expression.
2440   /// Subclasses may override this routine to provide different behavior.
2441   ExprResult RebuildOMPIteratorExpr(
2442       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2443       ArrayRef<Sema::OMPIteratorData> Data) {
2444     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2445                                           LLoc, RLoc, Data);
2446   }
2447 
2448   /// Build a new call expression.
2449   ///
2450   /// By default, performs semantic analysis to build the new expression.
2451   /// Subclasses may override this routine to provide different behavior.
2452   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2453                                    MultiExprArg Args,
2454                                    SourceLocation RParenLoc,
2455                                    Expr *ExecConfig = nullptr) {
2456     return getSema().ActOnCallExpr(
2457         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2458   }
2459 
2460   /// Build a new member access expression.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2465                                bool isArrow,
2466                                NestedNameSpecifierLoc QualifierLoc,
2467                                SourceLocation TemplateKWLoc,
2468                                const DeclarationNameInfo &MemberNameInfo,
2469                                ValueDecl *Member,
2470                                NamedDecl *FoundDecl,
2471                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2472                                NamedDecl *FirstQualifierInScope) {
2473     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2474                                                                       isArrow);
2475     if (!Member->getDeclName()) {
2476       // We have a reference to an unnamed field.  This is always the
2477       // base of an anonymous struct/union member access, i.e. the
2478       // field is always of record type.
2479       assert(Member->getType()->isRecordType() &&
2480              "unnamed member not of record type?");
2481 
2482       BaseResult =
2483         getSema().PerformObjectMemberConversion(BaseResult.get(),
2484                                                 QualifierLoc.getNestedNameSpecifier(),
2485                                                 FoundDecl, Member);
2486       if (BaseResult.isInvalid())
2487         return ExprError();
2488       Base = BaseResult.get();
2489 
2490       CXXScopeSpec EmptySS;
2491       return getSema().BuildFieldReferenceExpr(
2492           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2493           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2494     }
2495 
2496     CXXScopeSpec SS;
2497     SS.Adopt(QualifierLoc);
2498 
2499     Base = BaseResult.get();
2500     QualType BaseType = Base->getType();
2501 
2502     if (isArrow && !BaseType->isPointerType())
2503       return ExprError();
2504 
2505     // FIXME: this involves duplicating earlier analysis in a lot of
2506     // cases; we should avoid this when possible.
2507     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2508     R.addDecl(FoundDecl);
2509     R.resolveKind();
2510 
2511     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2512                                               SS, TemplateKWLoc,
2513                                               FirstQualifierInScope,
2514                                               R, ExplicitTemplateArgs,
2515                                               /*S*/nullptr);
2516   }
2517 
2518   /// Build a new binary operator expression.
2519   ///
2520   /// By default, performs semantic analysis to build the new expression.
2521   /// Subclasses may override this routine to provide different behavior.
2522   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2523                                          BinaryOperatorKind Opc,
2524                                          Expr *LHS, Expr *RHS) {
2525     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2526   }
2527 
2528   /// Build a new rewritten operator expression.
2529   ///
2530   /// By default, performs semantic analysis to build the new expression.
2531   /// Subclasses may override this routine to provide different behavior.
2532   ExprResult RebuildCXXRewrittenBinaryOperator(
2533       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2534       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2535     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2536                                            RHS, /*RequiresADL*/false);
2537   }
2538 
2539   /// Build a new conditional operator expression.
2540   ///
2541   /// By default, performs semantic analysis to build the new expression.
2542   /// Subclasses may override this routine to provide different behavior.
2543   ExprResult RebuildConditionalOperator(Expr *Cond,
2544                                         SourceLocation QuestionLoc,
2545                                         Expr *LHS,
2546                                         SourceLocation ColonLoc,
2547                                         Expr *RHS) {
2548     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2549                                         LHS, RHS);
2550   }
2551 
2552   /// Build a new C-style cast expression.
2553   ///
2554   /// By default, performs semantic analysis to build the new expression.
2555   /// Subclasses may override this routine to provide different behavior.
2556   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2557                                          TypeSourceInfo *TInfo,
2558                                          SourceLocation RParenLoc,
2559                                          Expr *SubExpr) {
2560     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2561                                          SubExpr);
2562   }
2563 
2564   /// Build a new compound literal expression.
2565   ///
2566   /// By default, performs semantic analysis to build the new expression.
2567   /// Subclasses may override this routine to provide different behavior.
2568   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2569                                               TypeSourceInfo *TInfo,
2570                                               SourceLocation RParenLoc,
2571                                               Expr *Init) {
2572     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2573                                               Init);
2574   }
2575 
2576   /// Build a new extended vector element access expression.
2577   ///
2578   /// By default, performs semantic analysis to build the new expression.
2579   /// Subclasses may override this routine to provide different behavior.
2580   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2581                                                SourceLocation OpLoc,
2582                                                SourceLocation AccessorLoc,
2583                                                IdentifierInfo &Accessor) {
2584 
2585     CXXScopeSpec SS;
2586     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2587     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2588                                               OpLoc, /*IsArrow*/ false,
2589                                               SS, SourceLocation(),
2590                                               /*FirstQualifierInScope*/ nullptr,
2591                                               NameInfo,
2592                                               /* TemplateArgs */ nullptr,
2593                                               /*S*/ nullptr);
2594   }
2595 
2596   /// Build a new initializer list 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 RebuildInitList(SourceLocation LBraceLoc,
2601                              MultiExprArg Inits,
2602                              SourceLocation RBraceLoc) {
2603     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2604   }
2605 
2606   /// Build a new designated initializer expression.
2607   ///
2608   /// By default, performs semantic analysis to build the new expression.
2609   /// Subclasses may override this routine to provide different behavior.
2610   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2611                                              MultiExprArg ArrayExprs,
2612                                              SourceLocation EqualOrColonLoc,
2613                                              bool GNUSyntax,
2614                                              Expr *Init) {
2615     ExprResult Result
2616       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2617                                            Init);
2618     if (Result.isInvalid())
2619       return ExprError();
2620 
2621     return Result;
2622   }
2623 
2624   /// Build a new value-initialized expression.
2625   ///
2626   /// By default, builds the implicit value initialization without performing
2627   /// any semantic analysis. Subclasses may override this routine to provide
2628   /// different behavior.
2629   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2630     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2631   }
2632 
2633   /// Build a new \c va_arg expression.
2634   ///
2635   /// By default, performs semantic analysis to build the new expression.
2636   /// Subclasses may override this routine to provide different behavior.
2637   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2638                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2639                                     SourceLocation RParenLoc) {
2640     return getSema().BuildVAArgExpr(BuiltinLoc,
2641                                     SubExpr, TInfo,
2642                                     RParenLoc);
2643   }
2644 
2645   /// Build a new expression list in parentheses.
2646   ///
2647   /// By default, performs semantic analysis to build the new expression.
2648   /// Subclasses may override this routine to provide different behavior.
2649   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2650                                   MultiExprArg SubExprs,
2651                                   SourceLocation RParenLoc) {
2652     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2653   }
2654 
2655   /// Build a new address-of-label expression.
2656   ///
2657   /// By default, performs semantic analysis, using the name of the label
2658   /// rather than attempting to map the label statement itself.
2659   /// Subclasses may override this routine to provide different behavior.
2660   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2661                                   SourceLocation LabelLoc, LabelDecl *Label) {
2662     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2663   }
2664 
2665   /// Build a new GNU statement expression.
2666   ///
2667   /// By default, performs semantic analysis to build the new expression.
2668   /// Subclasses may override this routine to provide different behavior.
2669   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2670                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2671     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2672                                    TemplateDepth);
2673   }
2674 
2675   /// Build a new __builtin_choose_expr expression.
2676   ///
2677   /// By default, performs semantic analysis to build the new expression.
2678   /// Subclasses may override this routine to provide different behavior.
2679   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2680                                      Expr *Cond, Expr *LHS, Expr *RHS,
2681                                      SourceLocation RParenLoc) {
2682     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2683                                    Cond, LHS, RHS,
2684                                    RParenLoc);
2685   }
2686 
2687   /// Build a new generic selection expression.
2688   ///
2689   /// By default, performs semantic analysis to build the new expression.
2690   /// Subclasses may override this routine to provide different behavior.
2691   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2692                                          SourceLocation DefaultLoc,
2693                                          SourceLocation RParenLoc,
2694                                          Expr *ControllingExpr,
2695                                          ArrayRef<TypeSourceInfo *> Types,
2696                                          ArrayRef<Expr *> Exprs) {
2697     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2698                                                 ControllingExpr, Types, Exprs);
2699   }
2700 
2701   /// Build a new overloaded operator call expression.
2702   ///
2703   /// By default, performs semantic analysis to build the new expression.
2704   /// The semantic analysis provides the behavior of template instantiation,
2705   /// copying with transformations that turn what looks like an overloaded
2706   /// operator call into a use of a builtin operator, performing
2707   /// argument-dependent lookup, etc. Subclasses may override this routine to
2708   /// provide different behavior.
2709   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2710                                               SourceLocation OpLoc,
2711                                               Expr *Callee,
2712                                               Expr *First,
2713                                               Expr *Second);
2714 
2715   /// Build a new C++ "named" cast expression, such as static_cast or
2716   /// reinterpret_cast.
2717   ///
2718   /// By default, this routine dispatches to one of the more-specific routines
2719   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2720   /// Subclasses may override this routine to provide different behavior.
2721   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2722                                            Stmt::StmtClass Class,
2723                                            SourceLocation LAngleLoc,
2724                                            TypeSourceInfo *TInfo,
2725                                            SourceLocation RAngleLoc,
2726                                            SourceLocation LParenLoc,
2727                                            Expr *SubExpr,
2728                                            SourceLocation RParenLoc) {
2729     switch (Class) {
2730     case Stmt::CXXStaticCastExprClass:
2731       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2732                                                    RAngleLoc, LParenLoc,
2733                                                    SubExpr, RParenLoc);
2734 
2735     case Stmt::CXXDynamicCastExprClass:
2736       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2737                                                     RAngleLoc, LParenLoc,
2738                                                     SubExpr, RParenLoc);
2739 
2740     case Stmt::CXXReinterpretCastExprClass:
2741       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2742                                                         RAngleLoc, LParenLoc,
2743                                                         SubExpr,
2744                                                         RParenLoc);
2745 
2746     case Stmt::CXXConstCastExprClass:
2747       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2748                                                    RAngleLoc, LParenLoc,
2749                                                    SubExpr, RParenLoc);
2750 
2751     case Stmt::CXXAddrspaceCastExprClass:
2752       return getDerived().RebuildCXXAddrspaceCastExpr(
2753           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2754 
2755     default:
2756       llvm_unreachable("Invalid C++ named cast");
2757     }
2758   }
2759 
2760   /// Build a new C++ static_cast expression.
2761   ///
2762   /// By default, performs semantic analysis to build the new expression.
2763   /// Subclasses may override this routine to provide different behavior.
2764   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2765                                             SourceLocation LAngleLoc,
2766                                             TypeSourceInfo *TInfo,
2767                                             SourceLocation RAngleLoc,
2768                                             SourceLocation LParenLoc,
2769                                             Expr *SubExpr,
2770                                             SourceLocation RParenLoc) {
2771     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2772                                        TInfo, SubExpr,
2773                                        SourceRange(LAngleLoc, RAngleLoc),
2774                                        SourceRange(LParenLoc, RParenLoc));
2775   }
2776 
2777   /// Build a new C++ dynamic_cast expression.
2778   ///
2779   /// By default, performs semantic analysis to build the new expression.
2780   /// Subclasses may override this routine to provide different behavior.
2781   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2782                                              SourceLocation LAngleLoc,
2783                                              TypeSourceInfo *TInfo,
2784                                              SourceLocation RAngleLoc,
2785                                              SourceLocation LParenLoc,
2786                                              Expr *SubExpr,
2787                                              SourceLocation RParenLoc) {
2788     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2789                                        TInfo, SubExpr,
2790                                        SourceRange(LAngleLoc, RAngleLoc),
2791                                        SourceRange(LParenLoc, RParenLoc));
2792   }
2793 
2794   /// Build a new C++ reinterpret_cast expression.
2795   ///
2796   /// By default, performs semantic analysis to build the new expression.
2797   /// Subclasses may override this routine to provide different behavior.
2798   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2799                                                  SourceLocation LAngleLoc,
2800                                                  TypeSourceInfo *TInfo,
2801                                                  SourceLocation RAngleLoc,
2802                                                  SourceLocation LParenLoc,
2803                                                  Expr *SubExpr,
2804                                                  SourceLocation RParenLoc) {
2805     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2806                                        TInfo, SubExpr,
2807                                        SourceRange(LAngleLoc, RAngleLoc),
2808                                        SourceRange(LParenLoc, RParenLoc));
2809   }
2810 
2811   /// Build a new C++ const_cast expression.
2812   ///
2813   /// By default, performs semantic analysis to build the new expression.
2814   /// Subclasses may override this routine to provide different behavior.
2815   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2816                                            SourceLocation LAngleLoc,
2817                                            TypeSourceInfo *TInfo,
2818                                            SourceLocation RAngleLoc,
2819                                            SourceLocation LParenLoc,
2820                                            Expr *SubExpr,
2821                                            SourceLocation RParenLoc) {
2822     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2823                                        TInfo, SubExpr,
2824                                        SourceRange(LAngleLoc, RAngleLoc),
2825                                        SourceRange(LParenLoc, RParenLoc));
2826   }
2827 
2828   ExprResult
2829   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2830                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2831                               SourceLocation LParenLoc, Expr *SubExpr,
2832                               SourceLocation RParenLoc) {
2833     return getSema().BuildCXXNamedCast(
2834         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2835         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2836   }
2837 
2838   /// Build a new C++ functional-style cast expression.
2839   ///
2840   /// By default, performs semantic analysis to build the new expression.
2841   /// Subclasses may override this routine to provide different behavior.
2842   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2843                                           SourceLocation LParenLoc,
2844                                           Expr *Sub,
2845                                           SourceLocation RParenLoc,
2846                                           bool ListInitialization) {
2847     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2848                                                MultiExprArg(&Sub, 1), RParenLoc,
2849                                                ListInitialization);
2850   }
2851 
2852   /// Build a new C++ __builtin_bit_cast expression.
2853   ///
2854   /// By default, performs semantic analysis to build the new expression.
2855   /// Subclasses may override this routine to provide different behavior.
2856   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2857                                        TypeSourceInfo *TSI, Expr *Sub,
2858                                        SourceLocation RParenLoc) {
2859     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2860   }
2861 
2862   /// Build a new C++ typeid(type) expression.
2863   ///
2864   /// By default, performs semantic analysis to build the new expression.
2865   /// Subclasses may override this routine to provide different behavior.
2866   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2867                                         SourceLocation TypeidLoc,
2868                                         TypeSourceInfo *Operand,
2869                                         SourceLocation RParenLoc) {
2870     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2871                                     RParenLoc);
2872   }
2873 
2874 
2875   /// Build a new C++ typeid(expr) expression.
2876   ///
2877   /// By default, performs semantic analysis to build the new expression.
2878   /// Subclasses may override this routine to provide different behavior.
2879   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2880                                         SourceLocation TypeidLoc,
2881                                         Expr *Operand,
2882                                         SourceLocation RParenLoc) {
2883     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2884                                     RParenLoc);
2885   }
2886 
2887   /// Build a new C++ __uuidof(type) expression.
2888   ///
2889   /// By default, performs semantic analysis to build the new expression.
2890   /// Subclasses may override this routine to provide different behavior.
2891   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2892                                   TypeSourceInfo *Operand,
2893                                   SourceLocation RParenLoc) {
2894     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2895   }
2896 
2897   /// Build a new C++ __uuidof(expr) expression.
2898   ///
2899   /// By default, performs semantic analysis to build the new expression.
2900   /// Subclasses may override this routine to provide different behavior.
2901   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2902                                   Expr *Operand, SourceLocation RParenLoc) {
2903     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2904   }
2905 
2906   /// Build a new C++ "this" expression.
2907   ///
2908   /// By default, builds a new "this" expression without performing any
2909   /// semantic analysis. Subclasses may override this routine to provide
2910   /// different behavior.
2911   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2912                                 QualType ThisType,
2913                                 bool isImplicit) {
2914     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2915   }
2916 
2917   /// Build a new C++ throw 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 RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2922                                  bool IsThrownVariableInScope) {
2923     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2924   }
2925 
2926   /// Build a new C++ default-argument expression.
2927   ///
2928   /// By default, builds a new default-argument expression, which does not
2929   /// require any semantic analysis. Subclasses may override this routine to
2930   /// provide different behavior.
2931   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2932     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2933                                      getSema().CurContext);
2934   }
2935 
2936   /// Build a new C++11 default-initialization expression.
2937   ///
2938   /// By default, builds a new default field initialization expression, which
2939   /// does not require any semantic analysis. Subclasses may override this
2940   /// routine to provide different behavior.
2941   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2942                                        FieldDecl *Field) {
2943     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2944                                       getSema().CurContext);
2945   }
2946 
2947   /// Build a new C++ zero-initialization expression.
2948   ///
2949   /// By default, performs semantic analysis to build the new expression.
2950   /// Subclasses may override this routine to provide different behavior.
2951   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2952                                            SourceLocation LParenLoc,
2953                                            SourceLocation RParenLoc) {
2954     return getSema().BuildCXXTypeConstructExpr(
2955         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2956   }
2957 
2958   /// Build a new C++ "new" expression.
2959   ///
2960   /// By default, performs semantic analysis to build the new expression.
2961   /// Subclasses may override this routine to provide different behavior.
2962   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2963                                bool UseGlobal,
2964                                SourceLocation PlacementLParen,
2965                                MultiExprArg PlacementArgs,
2966                                SourceLocation PlacementRParen,
2967                                SourceRange TypeIdParens,
2968                                QualType AllocatedType,
2969                                TypeSourceInfo *AllocatedTypeInfo,
2970                                Optional<Expr *> ArraySize,
2971                                SourceRange DirectInitRange,
2972                                Expr *Initializer) {
2973     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2974                                  PlacementLParen,
2975                                  PlacementArgs,
2976                                  PlacementRParen,
2977                                  TypeIdParens,
2978                                  AllocatedType,
2979                                  AllocatedTypeInfo,
2980                                  ArraySize,
2981                                  DirectInitRange,
2982                                  Initializer);
2983   }
2984 
2985   /// Build a new C++ "delete" expression.
2986   ///
2987   /// By default, performs semantic analysis to build the new expression.
2988   /// Subclasses may override this routine to provide different behavior.
2989   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2990                                         bool IsGlobalDelete,
2991                                         bool IsArrayForm,
2992                                         Expr *Operand) {
2993     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2994                                     Operand);
2995   }
2996 
2997   /// Build a new type trait expression.
2998   ///
2999   /// By default, performs semantic analysis to build the new expression.
3000   /// Subclasses may override this routine to provide different behavior.
3001   ExprResult RebuildTypeTrait(TypeTrait Trait,
3002                               SourceLocation StartLoc,
3003                               ArrayRef<TypeSourceInfo *> Args,
3004                               SourceLocation RParenLoc) {
3005     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3006   }
3007 
3008   /// Build a new array type trait expression.
3009   ///
3010   /// By default, performs semantic analysis to build the new expression.
3011   /// Subclasses may override this routine to provide different behavior.
3012   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3013                                    SourceLocation StartLoc,
3014                                    TypeSourceInfo *TSInfo,
3015                                    Expr *DimExpr,
3016                                    SourceLocation RParenLoc) {
3017     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3018   }
3019 
3020   /// Build a new expression trait expression.
3021   ///
3022   /// By default, performs semantic analysis to build the new expression.
3023   /// Subclasses may override this routine to provide different behavior.
3024   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3025                                    SourceLocation StartLoc,
3026                                    Expr *Queried,
3027                                    SourceLocation RParenLoc) {
3028     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3029   }
3030 
3031   /// Build a new (previously unresolved) declaration reference
3032   /// expression.
3033   ///
3034   /// By default, performs semantic analysis to build the new expression.
3035   /// Subclasses may override this routine to provide different behavior.
3036   ExprResult RebuildDependentScopeDeclRefExpr(
3037                                           NestedNameSpecifierLoc QualifierLoc,
3038                                           SourceLocation TemplateKWLoc,
3039                                        const DeclarationNameInfo &NameInfo,
3040                               const TemplateArgumentListInfo *TemplateArgs,
3041                                           bool IsAddressOfOperand,
3042                                           TypeSourceInfo **RecoveryTSI) {
3043     CXXScopeSpec SS;
3044     SS.Adopt(QualifierLoc);
3045 
3046     if (TemplateArgs || TemplateKWLoc.isValid())
3047       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3048                                                     TemplateArgs);
3049 
3050     return getSema().BuildQualifiedDeclarationNameExpr(
3051         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3052   }
3053 
3054   /// Build a new template-id expression.
3055   ///
3056   /// By default, performs semantic analysis to build the new expression.
3057   /// Subclasses may override this routine to provide different behavior.
3058   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3059                                    SourceLocation TemplateKWLoc,
3060                                    LookupResult &R,
3061                                    bool RequiresADL,
3062                               const TemplateArgumentListInfo *TemplateArgs) {
3063     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3064                                          TemplateArgs);
3065   }
3066 
3067   /// Build a new object-construction expression.
3068   ///
3069   /// By default, performs semantic analysis to build the new expression.
3070   /// Subclasses may override this routine to provide different behavior.
3071   ExprResult RebuildCXXConstructExpr(QualType T,
3072                                      SourceLocation Loc,
3073                                      CXXConstructorDecl *Constructor,
3074                                      bool IsElidable,
3075                                      MultiExprArg Args,
3076                                      bool HadMultipleCandidates,
3077                                      bool ListInitialization,
3078                                      bool StdInitListInitialization,
3079                                      bool RequiresZeroInit,
3080                              CXXConstructExpr::ConstructionKind ConstructKind,
3081                                      SourceRange ParenRange) {
3082     // Reconstruct the constructor we originally found, which might be
3083     // different if this is a call to an inherited constructor.
3084     CXXConstructorDecl *FoundCtor = Constructor;
3085     if (Constructor->isInheritingConstructor())
3086       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3087 
3088     SmallVector<Expr*, 8> ConvertedArgs;
3089     if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs))
3090       return ExprError();
3091 
3092     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3093                                            IsElidable,
3094                                            ConvertedArgs,
3095                                            HadMultipleCandidates,
3096                                            ListInitialization,
3097                                            StdInitListInitialization,
3098                                            RequiresZeroInit, ConstructKind,
3099                                            ParenRange);
3100   }
3101 
3102   /// Build a new implicit construction via inherited constructor
3103   /// expression.
3104   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3105                                              CXXConstructorDecl *Constructor,
3106                                              bool ConstructsVBase,
3107                                              bool InheritedFromVBase) {
3108     return new (getSema().Context) CXXInheritedCtorInitExpr(
3109         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3110   }
3111 
3112   /// Build a new object-construction expression.
3113   ///
3114   /// By default, performs semantic analysis to build the new expression.
3115   /// Subclasses may override this routine to provide different behavior.
3116   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3117                                            SourceLocation LParenOrBraceLoc,
3118                                            MultiExprArg Args,
3119                                            SourceLocation RParenOrBraceLoc,
3120                                            bool ListInitialization) {
3121     return getSema().BuildCXXTypeConstructExpr(
3122         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3123   }
3124 
3125   /// Build a new object-construction expression.
3126   ///
3127   /// By default, performs semantic analysis to build the new expression.
3128   /// Subclasses may override this routine to provide different behavior.
3129   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3130                                                SourceLocation LParenLoc,
3131                                                MultiExprArg Args,
3132                                                SourceLocation RParenLoc,
3133                                                bool ListInitialization) {
3134     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3135                                                RParenLoc, ListInitialization);
3136   }
3137 
3138   /// Build a new member reference expression.
3139   ///
3140   /// By default, performs semantic analysis to build the new expression.
3141   /// Subclasses may override this routine to provide different behavior.
3142   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3143                                                 QualType BaseType,
3144                                                 bool IsArrow,
3145                                                 SourceLocation OperatorLoc,
3146                                           NestedNameSpecifierLoc QualifierLoc,
3147                                                 SourceLocation TemplateKWLoc,
3148                                             NamedDecl *FirstQualifierInScope,
3149                                    const DeclarationNameInfo &MemberNameInfo,
3150                               const TemplateArgumentListInfo *TemplateArgs) {
3151     CXXScopeSpec SS;
3152     SS.Adopt(QualifierLoc);
3153 
3154     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3155                                             OperatorLoc, IsArrow,
3156                                             SS, TemplateKWLoc,
3157                                             FirstQualifierInScope,
3158                                             MemberNameInfo,
3159                                             TemplateArgs, /*S*/nullptr);
3160   }
3161 
3162   /// Build a new member reference expression.
3163   ///
3164   /// By default, performs semantic analysis to build the new expression.
3165   /// Subclasses may override this routine to provide different behavior.
3166   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3167                                          SourceLocation OperatorLoc,
3168                                          bool IsArrow,
3169                                          NestedNameSpecifierLoc QualifierLoc,
3170                                          SourceLocation TemplateKWLoc,
3171                                          NamedDecl *FirstQualifierInScope,
3172                                          LookupResult &R,
3173                                 const TemplateArgumentListInfo *TemplateArgs) {
3174     CXXScopeSpec SS;
3175     SS.Adopt(QualifierLoc);
3176 
3177     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3178                                             OperatorLoc, IsArrow,
3179                                             SS, TemplateKWLoc,
3180                                             FirstQualifierInScope,
3181                                             R, TemplateArgs, /*S*/nullptr);
3182   }
3183 
3184   /// Build a new noexcept expression.
3185   ///
3186   /// By default, performs semantic analysis to build the new expression.
3187   /// Subclasses may override this routine to provide different behavior.
3188   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3189     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3190   }
3191 
3192   /// Build a new expression to compute the length of a parameter pack.
3193   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3194                                    NamedDecl *Pack,
3195                                    SourceLocation PackLoc,
3196                                    SourceLocation RParenLoc,
3197                                    Optional<unsigned> Length,
3198                                    ArrayRef<TemplateArgument> PartialArgs) {
3199     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3200                                   RParenLoc, Length, PartialArgs);
3201   }
3202 
3203   /// Build a new expression representing a call to a source location
3204   ///  builtin.
3205   ///
3206   /// By default, performs semantic analysis to build the new expression.
3207   /// Subclasses may override this routine to provide different behavior.
3208   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3209                                   SourceLocation BuiltinLoc,
3210                                   SourceLocation RPLoc,
3211                                   DeclContext *ParentContext) {
3212     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3213   }
3214 
3215   /// Build a new Objective-C boxed expression.
3216   ///
3217   /// By default, performs semantic analysis to build the new expression.
3218   /// Subclasses may override this routine to provide different behavior.
3219   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3220       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3221       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3222       TemplateArgumentListInfo *TALI) {
3223     CXXScopeSpec SS;
3224     SS.Adopt(NNS);
3225     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3226                                                          ConceptNameInfo,
3227                                                          FoundDecl,
3228                                                          NamedConcept, TALI);
3229     if (Result.isInvalid())
3230       return ExprError();
3231     return Result;
3232   }
3233 
3234   /// \brief Build a new requires expression.
3235   ///
3236   /// By default, performs semantic analysis to build the new expression.
3237   /// Subclasses may override this routine to provide different behavior.
3238   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3239                                  RequiresExprBodyDecl *Body,
3240                                  ArrayRef<ParmVarDecl *> LocalParameters,
3241                                  ArrayRef<concepts::Requirement *> Requirements,
3242                                  SourceLocation ClosingBraceLoc) {
3243     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3244                                 LocalParameters, Requirements, ClosingBraceLoc);
3245   }
3246 
3247   concepts::TypeRequirement *
3248   RebuildTypeRequirement(
3249       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3250     return SemaRef.BuildTypeRequirement(SubstDiag);
3251   }
3252 
3253   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3254     return SemaRef.BuildTypeRequirement(T);
3255   }
3256 
3257   concepts::ExprRequirement *
3258   RebuildExprRequirement(
3259       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3260       SourceLocation NoexceptLoc,
3261       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3262     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3263                                         std::move(Ret));
3264   }
3265 
3266   concepts::ExprRequirement *
3267   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3268                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3269     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3270                                         std::move(Ret));
3271   }
3272 
3273   concepts::NestedRequirement *
3274   RebuildNestedRequirement(
3275       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3276     return SemaRef.BuildNestedRequirement(SubstDiag);
3277   }
3278 
3279   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3280     return SemaRef.BuildNestedRequirement(Constraint);
3281   }
3282 
3283   /// \brief Build a new Objective-C boxed expression.
3284   ///
3285   /// By default, performs semantic analysis to build the new expression.
3286   /// Subclasses may override this routine to provide different behavior.
3287   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3288     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3289   }
3290 
3291   /// Build a new Objective-C array literal.
3292   ///
3293   /// By default, performs semantic analysis to build the new expression.
3294   /// Subclasses may override this routine to provide different behavior.
3295   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3296                                      Expr **Elements, unsigned NumElements) {
3297     return getSema().BuildObjCArrayLiteral(Range,
3298                                            MultiExprArg(Elements, NumElements));
3299   }
3300 
3301   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3302                                          Expr *Base, Expr *Key,
3303                                          ObjCMethodDecl *getterMethod,
3304                                          ObjCMethodDecl *setterMethod) {
3305     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3306                                                    getterMethod, setterMethod);
3307   }
3308 
3309   /// Build a new Objective-C dictionary literal.
3310   ///
3311   /// By default, performs semantic analysis to build the new expression.
3312   /// Subclasses may override this routine to provide different behavior.
3313   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3314                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3315     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3316   }
3317 
3318   /// Build a new Objective-C \@encode expression.
3319   ///
3320   /// By default, performs semantic analysis to build the new expression.
3321   /// Subclasses may override this routine to provide different behavior.
3322   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3323                                          TypeSourceInfo *EncodeTypeInfo,
3324                                          SourceLocation RParenLoc) {
3325     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3326   }
3327 
3328   /// Build a new Objective-C class message.
3329   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3330                                           Selector Sel,
3331                                           ArrayRef<SourceLocation> SelectorLocs,
3332                                           ObjCMethodDecl *Method,
3333                                           SourceLocation LBracLoc,
3334                                           MultiExprArg Args,
3335                                           SourceLocation RBracLoc) {
3336     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3337                                      ReceiverTypeInfo->getType(),
3338                                      /*SuperLoc=*/SourceLocation(),
3339                                      Sel, Method, LBracLoc, SelectorLocs,
3340                                      RBracLoc, Args);
3341   }
3342 
3343   /// Build a new Objective-C instance message.
3344   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3345                                           Selector Sel,
3346                                           ArrayRef<SourceLocation> SelectorLocs,
3347                                           ObjCMethodDecl *Method,
3348                                           SourceLocation LBracLoc,
3349                                           MultiExprArg Args,
3350                                           SourceLocation RBracLoc) {
3351     return SemaRef.BuildInstanceMessage(Receiver,
3352                                         Receiver->getType(),
3353                                         /*SuperLoc=*/SourceLocation(),
3354                                         Sel, Method, LBracLoc, SelectorLocs,
3355                                         RBracLoc, Args);
3356   }
3357 
3358   /// Build a new Objective-C instance/class message to 'super'.
3359   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3360                                     Selector Sel,
3361                                     ArrayRef<SourceLocation> SelectorLocs,
3362                                     QualType SuperType,
3363                                     ObjCMethodDecl *Method,
3364                                     SourceLocation LBracLoc,
3365                                     MultiExprArg Args,
3366                                     SourceLocation RBracLoc) {
3367     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3368                                           SuperType,
3369                                           SuperLoc,
3370                                           Sel, Method, LBracLoc, SelectorLocs,
3371                                           RBracLoc, Args)
3372                                       : SemaRef.BuildClassMessage(nullptr,
3373                                           SuperType,
3374                                           SuperLoc,
3375                                           Sel, Method, LBracLoc, SelectorLocs,
3376                                           RBracLoc, Args);
3377 
3378 
3379   }
3380 
3381   /// Build a new Objective-C ivar reference expression.
3382   ///
3383   /// By default, performs semantic analysis to build the new expression.
3384   /// Subclasses may override this routine to provide different behavior.
3385   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3386                                           SourceLocation IvarLoc,
3387                                           bool IsArrow, bool IsFreeIvar) {
3388     CXXScopeSpec SS;
3389     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3390     ExprResult Result = getSema().BuildMemberReferenceExpr(
3391         BaseArg, BaseArg->getType(),
3392         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3393         /*FirstQualifierInScope=*/nullptr, NameInfo,
3394         /*TemplateArgs=*/nullptr,
3395         /*S=*/nullptr);
3396     if (IsFreeIvar && Result.isUsable())
3397       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3398     return Result;
3399   }
3400 
3401   /// Build a new Objective-C property 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 RebuildObjCPropertyRefExpr(Expr *BaseArg,
3406                                         ObjCPropertyDecl *Property,
3407                                         SourceLocation PropertyLoc) {
3408     CXXScopeSpec SS;
3409     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3410     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3411                                               /*FIXME:*/PropertyLoc,
3412                                               /*IsArrow=*/false,
3413                                               SS, SourceLocation(),
3414                                               /*FirstQualifierInScope=*/nullptr,
3415                                               NameInfo,
3416                                               /*TemplateArgs=*/nullptr,
3417                                               /*S=*/nullptr);
3418   }
3419 
3420   /// Build a new Objective-C property reference expression.
3421   ///
3422   /// By default, performs semantic analysis to build the new expression.
3423   /// Subclasses may override this routine to provide different behavior.
3424   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3425                                         ObjCMethodDecl *Getter,
3426                                         ObjCMethodDecl *Setter,
3427                                         SourceLocation PropertyLoc) {
3428     // Since these expressions can only be value-dependent, we do not
3429     // need to perform semantic analysis again.
3430     return Owned(
3431       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3432                                                   VK_LValue, OK_ObjCProperty,
3433                                                   PropertyLoc, Base));
3434   }
3435 
3436   /// Build a new Objective-C "isa" expression.
3437   ///
3438   /// By default, performs semantic analysis to build the new expression.
3439   /// Subclasses may override this routine to provide different behavior.
3440   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3441                                 SourceLocation OpLoc, bool IsArrow) {
3442     CXXScopeSpec SS;
3443     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3444     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3445                                               OpLoc, IsArrow,
3446                                               SS, SourceLocation(),
3447                                               /*FirstQualifierInScope=*/nullptr,
3448                                               NameInfo,
3449                                               /*TemplateArgs=*/nullptr,
3450                                               /*S=*/nullptr);
3451   }
3452 
3453   /// Build a new shuffle vector expression.
3454   ///
3455   /// By default, performs semantic analysis to build the new expression.
3456   /// Subclasses may override this routine to provide different behavior.
3457   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3458                                       MultiExprArg SubExprs,
3459                                       SourceLocation RParenLoc) {
3460     // Find the declaration for __builtin_shufflevector
3461     const IdentifierInfo &Name
3462       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3463     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3464     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3465     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3466 
3467     // Build a reference to the __builtin_shufflevector builtin
3468     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3469     Expr *Callee = new (SemaRef.Context)
3470         DeclRefExpr(SemaRef.Context, Builtin, false,
3471                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3472     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3473     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3474                                        CK_BuiltinFnToFnPtr).get();
3475 
3476     // Build the CallExpr
3477     ExprResult TheCall = CallExpr::Create(
3478         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3479         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3480 
3481     // Type-check the __builtin_shufflevector expression.
3482     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3483   }
3484 
3485   /// Build a new convert vector expression.
3486   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3487                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3488                                       SourceLocation RParenLoc) {
3489     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3490                                          BuiltinLoc, RParenLoc);
3491   }
3492 
3493   /// Build a new template argument pack expansion.
3494   ///
3495   /// By default, performs semantic analysis to build a new pack expansion
3496   /// for a template argument. Subclasses may override this routine to provide
3497   /// different behavior.
3498   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3499                                            SourceLocation EllipsisLoc,
3500                                            Optional<unsigned> NumExpansions) {
3501     switch (Pattern.getArgument().getKind()) {
3502     case TemplateArgument::Expression: {
3503       ExprResult Result
3504         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3505                                        EllipsisLoc, NumExpansions);
3506       if (Result.isInvalid())
3507         return TemplateArgumentLoc();
3508 
3509       return TemplateArgumentLoc(Result.get(), Result.get());
3510     }
3511 
3512     case TemplateArgument::Template:
3513       return TemplateArgumentLoc(TemplateArgument(
3514                                           Pattern.getArgument().getAsTemplate(),
3515                                                   NumExpansions),
3516                                  Pattern.getTemplateQualifierLoc(),
3517                                  Pattern.getTemplateNameLoc(),
3518                                  EllipsisLoc);
3519 
3520     case TemplateArgument::Null:
3521     case TemplateArgument::Integral:
3522     case TemplateArgument::Declaration:
3523     case TemplateArgument::Pack:
3524     case TemplateArgument::TemplateExpansion:
3525     case TemplateArgument::NullPtr:
3526       llvm_unreachable("Pack expansion pattern has no parameter packs");
3527 
3528     case TemplateArgument::Type:
3529       if (TypeSourceInfo *Expansion
3530             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3531                                            EllipsisLoc,
3532                                            NumExpansions))
3533         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3534                                    Expansion);
3535       break;
3536     }
3537 
3538     return TemplateArgumentLoc();
3539   }
3540 
3541   /// Build a new expression pack expansion.
3542   ///
3543   /// By default, performs semantic analysis to build a new pack expansion
3544   /// for an expression. Subclasses may override this routine to provide
3545   /// different behavior.
3546   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3547                                   Optional<unsigned> NumExpansions) {
3548     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3549   }
3550 
3551   /// Build a new C++1z fold-expression.
3552   ///
3553   /// By default, performs semantic analysis in order to build a new fold
3554   /// expression.
3555   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3556                                 BinaryOperatorKind Operator,
3557                                 SourceLocation EllipsisLoc, Expr *RHS,
3558                                 SourceLocation RParenLoc,
3559                                 Optional<unsigned> NumExpansions) {
3560     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3561                                       RHS, RParenLoc, NumExpansions);
3562   }
3563 
3564   /// Build an empty C++1z fold-expression with the given operator.
3565   ///
3566   /// By default, produces the fallback value for the fold-expression, or
3567   /// produce an error if there is no fallback value.
3568   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3569                                      BinaryOperatorKind Operator) {
3570     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3571   }
3572 
3573   /// Build a new atomic operation expression.
3574   ///
3575   /// By default, performs semantic analysis to build the new expression.
3576   /// Subclasses may override this routine to provide different behavior.
3577   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3578                                AtomicExpr::AtomicOp Op,
3579                                SourceLocation RParenLoc) {
3580     // Use this for all of the locations, since we don't know the difference
3581     // between the call and the expr at this point.
3582     SourceRange Range{BuiltinLoc, RParenLoc};
3583     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3584                                      Sema::AtomicArgumentOrder::AST);
3585   }
3586 
3587   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3588                                  ArrayRef<Expr *> SubExprs) {
3589     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs);
3590   }
3591 
3592 private:
3593   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3594                                      QualType ObjectType,
3595                                      NamedDecl *FirstQualifierInScope,
3596                                      CXXScopeSpec &SS);
3597 
3598   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3599                                              QualType ObjectType,
3600                                              NamedDecl *FirstQualifierInScope,
3601                                              CXXScopeSpec &SS);
3602 
3603   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3604                                             NamedDecl *FirstQualifierInScope,
3605                                             CXXScopeSpec &SS);
3606 
3607   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3608                                       DependentNameTypeLoc TL,
3609                                       bool DeducibleTSTContext);
3610 };
3611 
3612 template <typename Derived>
3613 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3614   if (!S)
3615     return S;
3616 
3617   switch (S->getStmtClass()) {
3618   case Stmt::NoStmtClass: break;
3619 
3620   // Transform individual statement nodes
3621   // Pass SDK into statements that can produce a value
3622 #define STMT(Node, Parent)                                              \
3623   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3624 #define VALUESTMT(Node, Parent)                                         \
3625   case Stmt::Node##Class:                                               \
3626     return getDerived().Transform##Node(cast<Node>(S), SDK);
3627 #define ABSTRACT_STMT(Node)
3628 #define EXPR(Node, Parent)
3629 #include "clang/AST/StmtNodes.inc"
3630 
3631   // Transform expressions by calling TransformExpr.
3632 #define STMT(Node, Parent)
3633 #define ABSTRACT_STMT(Stmt)
3634 #define EXPR(Node, Parent) case Stmt::Node##Class:
3635 #include "clang/AST/StmtNodes.inc"
3636     {
3637       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3638 
3639       if (SDK == SDK_StmtExprResult)
3640         E = getSema().ActOnStmtExprResult(E);
3641       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3642     }
3643   }
3644 
3645   return S;
3646 }
3647 
3648 template<typename Derived>
3649 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3650   if (!S)
3651     return S;
3652 
3653   switch (S->getClauseKind()) {
3654   default: break;
3655   // Transform individual clause nodes
3656 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
3657   case Enum:                                                                   \
3658     return getDerived().Transform ## Class(cast<Class>(S));
3659 #include "llvm/Frontend/OpenMP/OMPKinds.def"
3660   }
3661 
3662   return S;
3663 }
3664 
3665 
3666 template<typename Derived>
3667 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3668   if (!E)
3669     return E;
3670 
3671   switch (E->getStmtClass()) {
3672     case Stmt::NoStmtClass: break;
3673 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3674 #define ABSTRACT_STMT(Stmt)
3675 #define EXPR(Node, Parent)                                              \
3676     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3677 #include "clang/AST/StmtNodes.inc"
3678   }
3679 
3680   return E;
3681 }
3682 
3683 template<typename Derived>
3684 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3685                                                         bool NotCopyInit) {
3686   // Initializers are instantiated like expressions, except that various outer
3687   // layers are stripped.
3688   if (!Init)
3689     return Init;
3690 
3691   if (auto *FE = dyn_cast<FullExpr>(Init))
3692     Init = FE->getSubExpr();
3693 
3694   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3695     Init = AIL->getCommonExpr();
3696 
3697   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3698     Init = MTE->getSubExpr();
3699 
3700   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3701     Init = Binder->getSubExpr();
3702 
3703   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3704     Init = ICE->getSubExprAsWritten();
3705 
3706   if (CXXStdInitializerListExpr *ILE =
3707           dyn_cast<CXXStdInitializerListExpr>(Init))
3708     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3709 
3710   // If this is copy-initialization, we only need to reconstruct
3711   // InitListExprs. Other forms of copy-initialization will be a no-op if
3712   // the initializer is already the right type.
3713   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3714   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3715     return getDerived().TransformExpr(Init);
3716 
3717   // Revert value-initialization back to empty parens.
3718   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3719     SourceRange Parens = VIE->getSourceRange();
3720     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3721                                              Parens.getEnd());
3722   }
3723 
3724   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3725   if (isa<ImplicitValueInitExpr>(Init))
3726     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3727                                              SourceLocation());
3728 
3729   // Revert initialization by constructor back to a parenthesized or braced list
3730   // of expressions. Any other form of initializer can just be reused directly.
3731   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3732     return getDerived().TransformExpr(Init);
3733 
3734   // If the initialization implicitly converted an initializer list to a
3735   // std::initializer_list object, unwrap the std::initializer_list too.
3736   if (Construct && Construct->isStdInitListInitialization())
3737     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3738 
3739   // Enter a list-init context if this was list initialization.
3740   EnterExpressionEvaluationContext Context(
3741       getSema(), EnterExpressionEvaluationContext::InitList,
3742       Construct->isListInitialization());
3743 
3744   SmallVector<Expr*, 8> NewArgs;
3745   bool ArgChanged = false;
3746   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3747                                   /*IsCall*/true, NewArgs, &ArgChanged))
3748     return ExprError();
3749 
3750   // If this was list initialization, revert to syntactic list form.
3751   if (Construct->isListInitialization())
3752     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3753                                         Construct->getEndLoc());
3754 
3755   // Build a ParenListExpr to represent anything else.
3756   SourceRange Parens = Construct->getParenOrBraceRange();
3757   if (Parens.isInvalid()) {
3758     // This was a variable declaration's initialization for which no initializer
3759     // was specified.
3760     assert(NewArgs.empty() &&
3761            "no parens or braces but have direct init with arguments?");
3762     return ExprEmpty();
3763   }
3764   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3765                                            Parens.getEnd());
3766 }
3767 
3768 template<typename Derived>
3769 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3770                                             unsigned NumInputs,
3771                                             bool IsCall,
3772                                       SmallVectorImpl<Expr *> &Outputs,
3773                                             bool *ArgChanged) {
3774   for (unsigned I = 0; I != NumInputs; ++I) {
3775     // If requested, drop call arguments that need to be dropped.
3776     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3777       if (ArgChanged)
3778         *ArgChanged = true;
3779 
3780       break;
3781     }
3782 
3783     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3784       Expr *Pattern = Expansion->getPattern();
3785 
3786       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3787       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3788       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3789 
3790       // Determine whether the set of unexpanded parameter packs can and should
3791       // be expanded.
3792       bool Expand = true;
3793       bool RetainExpansion = false;
3794       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3795       Optional<unsigned> NumExpansions = OrigNumExpansions;
3796       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3797                                                Pattern->getSourceRange(),
3798                                                Unexpanded,
3799                                                Expand, RetainExpansion,
3800                                                NumExpansions))
3801         return true;
3802 
3803       if (!Expand) {
3804         // The transform has determined that we should perform a simple
3805         // transformation on the pack expansion, producing another pack
3806         // expansion.
3807         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3808         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3809         if (OutPattern.isInvalid())
3810           return true;
3811 
3812         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3813                                                 Expansion->getEllipsisLoc(),
3814                                                            NumExpansions);
3815         if (Out.isInvalid())
3816           return true;
3817 
3818         if (ArgChanged)
3819           *ArgChanged = true;
3820         Outputs.push_back(Out.get());
3821         continue;
3822       }
3823 
3824       // Record right away that the argument was changed.  This needs
3825       // to happen even if the array expands to nothing.
3826       if (ArgChanged) *ArgChanged = true;
3827 
3828       // The transform has determined that we should perform an elementwise
3829       // expansion of the pattern. Do so.
3830       for (unsigned I = 0; I != *NumExpansions; ++I) {
3831         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3832         ExprResult Out = getDerived().TransformExpr(Pattern);
3833         if (Out.isInvalid())
3834           return true;
3835 
3836         if (Out.get()->containsUnexpandedParameterPack()) {
3837           Out = getDerived().RebuildPackExpansion(
3838               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3839           if (Out.isInvalid())
3840             return true;
3841         }
3842 
3843         Outputs.push_back(Out.get());
3844       }
3845 
3846       // If we're supposed to retain a pack expansion, do so by temporarily
3847       // forgetting the partially-substituted parameter pack.
3848       if (RetainExpansion) {
3849         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3850 
3851         ExprResult Out = getDerived().TransformExpr(Pattern);
3852         if (Out.isInvalid())
3853           return true;
3854 
3855         Out = getDerived().RebuildPackExpansion(
3856             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3857         if (Out.isInvalid())
3858           return true;
3859 
3860         Outputs.push_back(Out.get());
3861       }
3862 
3863       continue;
3864     }
3865 
3866     ExprResult Result =
3867       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3868              : getDerived().TransformExpr(Inputs[I]);
3869     if (Result.isInvalid())
3870       return true;
3871 
3872     if (Result.get() != Inputs[I] && ArgChanged)
3873       *ArgChanged = true;
3874 
3875     Outputs.push_back(Result.get());
3876   }
3877 
3878   return false;
3879 }
3880 
3881 template <typename Derived>
3882 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3883     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3884   if (Var) {
3885     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3886         getDerived().TransformDefinition(Var->getLocation(), Var));
3887 
3888     if (!ConditionVar)
3889       return Sema::ConditionError();
3890 
3891     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3892   }
3893 
3894   if (Expr) {
3895     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3896 
3897     if (CondExpr.isInvalid())
3898       return Sema::ConditionError();
3899 
3900     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3901   }
3902 
3903   return Sema::ConditionResult();
3904 }
3905 
3906 template<typename Derived>
3907 NestedNameSpecifierLoc
3908 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3909                                                     NestedNameSpecifierLoc NNS,
3910                                                      QualType ObjectType,
3911                                              NamedDecl *FirstQualifierInScope) {
3912   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3913   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3914        Qualifier = Qualifier.getPrefix())
3915     Qualifiers.push_back(Qualifier);
3916 
3917   CXXScopeSpec SS;
3918   while (!Qualifiers.empty()) {
3919     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3920     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3921 
3922     switch (QNNS->getKind()) {
3923     case NestedNameSpecifier::Identifier: {
3924       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3925                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3926       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3927                                               SS, FirstQualifierInScope, false))
3928         return NestedNameSpecifierLoc();
3929     }
3930       break;
3931 
3932     case NestedNameSpecifier::Namespace: {
3933       NamespaceDecl *NS
3934         = cast_or_null<NamespaceDecl>(
3935                                     getDerived().TransformDecl(
3936                                                           Q.getLocalBeginLoc(),
3937                                                        QNNS->getAsNamespace()));
3938       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3939       break;
3940     }
3941 
3942     case NestedNameSpecifier::NamespaceAlias: {
3943       NamespaceAliasDecl *Alias
3944         = cast_or_null<NamespaceAliasDecl>(
3945                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3946                                                  QNNS->getAsNamespaceAlias()));
3947       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3948                 Q.getLocalEndLoc());
3949       break;
3950     }
3951 
3952     case NestedNameSpecifier::Global:
3953       // There is no meaningful transformation that one could perform on the
3954       // global scope.
3955       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3956       break;
3957 
3958     case NestedNameSpecifier::Super: {
3959       CXXRecordDecl *RD =
3960           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3961               SourceLocation(), QNNS->getAsRecordDecl()));
3962       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3963       break;
3964     }
3965 
3966     case NestedNameSpecifier::TypeSpecWithTemplate:
3967     case NestedNameSpecifier::TypeSpec: {
3968       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3969                                               FirstQualifierInScope, SS);
3970 
3971       if (!TL)
3972         return NestedNameSpecifierLoc();
3973 
3974       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3975           (SemaRef.getLangOpts().CPlusPlus11 &&
3976            TL.getType()->isEnumeralType())) {
3977         assert(!TL.getType().hasLocalQualifiers() &&
3978                "Can't get cv-qualifiers here");
3979         if (TL.getType()->isEnumeralType())
3980           SemaRef.Diag(TL.getBeginLoc(),
3981                        diag::warn_cxx98_compat_enum_nested_name_spec);
3982         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3983                   Q.getLocalEndLoc());
3984         break;
3985       }
3986       // If the nested-name-specifier is an invalid type def, don't emit an
3987       // error because a previous error should have already been emitted.
3988       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3989       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3990         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3991           << TL.getType() << SS.getRange();
3992       }
3993       return NestedNameSpecifierLoc();
3994     }
3995     }
3996 
3997     // The qualifier-in-scope and object type only apply to the leftmost entity.
3998     FirstQualifierInScope = nullptr;
3999     ObjectType = QualType();
4000   }
4001 
4002   // Don't rebuild the nested-name-specifier if we don't have to.
4003   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4004       !getDerived().AlwaysRebuild())
4005     return NNS;
4006 
4007   // If we can re-use the source-location data from the original
4008   // nested-name-specifier, do so.
4009   if (SS.location_size() == NNS.getDataLength() &&
4010       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4011     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4012 
4013   // Allocate new nested-name-specifier location information.
4014   return SS.getWithLocInContext(SemaRef.Context);
4015 }
4016 
4017 template<typename Derived>
4018 DeclarationNameInfo
4019 TreeTransform<Derived>
4020 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4021   DeclarationName Name = NameInfo.getName();
4022   if (!Name)
4023     return DeclarationNameInfo();
4024 
4025   switch (Name.getNameKind()) {
4026   case DeclarationName::Identifier:
4027   case DeclarationName::ObjCZeroArgSelector:
4028   case DeclarationName::ObjCOneArgSelector:
4029   case DeclarationName::ObjCMultiArgSelector:
4030   case DeclarationName::CXXOperatorName:
4031   case DeclarationName::CXXLiteralOperatorName:
4032   case DeclarationName::CXXUsingDirective:
4033     return NameInfo;
4034 
4035   case DeclarationName::CXXDeductionGuideName: {
4036     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4037     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4038         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4039     if (!NewTemplate)
4040       return DeclarationNameInfo();
4041 
4042     DeclarationNameInfo NewNameInfo(NameInfo);
4043     NewNameInfo.setName(
4044         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4045     return NewNameInfo;
4046   }
4047 
4048   case DeclarationName::CXXConstructorName:
4049   case DeclarationName::CXXDestructorName:
4050   case DeclarationName::CXXConversionFunctionName: {
4051     TypeSourceInfo *NewTInfo;
4052     CanQualType NewCanTy;
4053     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4054       NewTInfo = getDerived().TransformType(OldTInfo);
4055       if (!NewTInfo)
4056         return DeclarationNameInfo();
4057       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4058     }
4059     else {
4060       NewTInfo = nullptr;
4061       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4062       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4063       if (NewT.isNull())
4064         return DeclarationNameInfo();
4065       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4066     }
4067 
4068     DeclarationName NewName
4069       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4070                                                            NewCanTy);
4071     DeclarationNameInfo NewNameInfo(NameInfo);
4072     NewNameInfo.setName(NewName);
4073     NewNameInfo.setNamedTypeInfo(NewTInfo);
4074     return NewNameInfo;
4075   }
4076   }
4077 
4078   llvm_unreachable("Unknown name kind.");
4079 }
4080 
4081 template<typename Derived>
4082 TemplateName
4083 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4084                                               TemplateName Name,
4085                                               SourceLocation NameLoc,
4086                                               QualType ObjectType,
4087                                               NamedDecl *FirstQualifierInScope,
4088                                               bool AllowInjectedClassName) {
4089   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4090     TemplateDecl *Template = QTN->getTemplateDecl();
4091     assert(Template && "qualified template name must refer to a template");
4092 
4093     TemplateDecl *TransTemplate
4094       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4095                                                               Template));
4096     if (!TransTemplate)
4097       return TemplateName();
4098 
4099     if (!getDerived().AlwaysRebuild() &&
4100         SS.getScopeRep() == QTN->getQualifier() &&
4101         TransTemplate == Template)
4102       return Name;
4103 
4104     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4105                                             TransTemplate);
4106   }
4107 
4108   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4109     if (SS.getScopeRep()) {
4110       // These apply to the scope specifier, not the template.
4111       ObjectType = QualType();
4112       FirstQualifierInScope = nullptr;
4113     }
4114 
4115     if (!getDerived().AlwaysRebuild() &&
4116         SS.getScopeRep() == DTN->getQualifier() &&
4117         ObjectType.isNull())
4118       return Name;
4119 
4120     // FIXME: Preserve the location of the "template" keyword.
4121     SourceLocation TemplateKWLoc = NameLoc;
4122 
4123     if (DTN->isIdentifier()) {
4124       return getDerived().RebuildTemplateName(SS,
4125                                               TemplateKWLoc,
4126                                               *DTN->getIdentifier(),
4127                                               NameLoc,
4128                                               ObjectType,
4129                                               FirstQualifierInScope,
4130                                               AllowInjectedClassName);
4131     }
4132 
4133     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4134                                             DTN->getOperator(), NameLoc,
4135                                             ObjectType, AllowInjectedClassName);
4136   }
4137 
4138   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4139     TemplateDecl *TransTemplate
4140       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4141                                                               Template));
4142     if (!TransTemplate)
4143       return TemplateName();
4144 
4145     if (!getDerived().AlwaysRebuild() &&
4146         TransTemplate == Template)
4147       return Name;
4148 
4149     return TemplateName(TransTemplate);
4150   }
4151 
4152   if (SubstTemplateTemplateParmPackStorage *SubstPack
4153       = Name.getAsSubstTemplateTemplateParmPack()) {
4154     TemplateTemplateParmDecl *TransParam
4155     = cast_or_null<TemplateTemplateParmDecl>(
4156             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4157     if (!TransParam)
4158       return TemplateName();
4159 
4160     if (!getDerived().AlwaysRebuild() &&
4161         TransParam == SubstPack->getParameterPack())
4162       return Name;
4163 
4164     return getDerived().RebuildTemplateName(TransParam,
4165                                             SubstPack->getArgumentPack());
4166   }
4167 
4168   // These should be getting filtered out before they reach the AST.
4169   llvm_unreachable("overloaded function decl survived to here");
4170 }
4171 
4172 template<typename Derived>
4173 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4174                                          const TemplateArgument &Arg,
4175                                          TemplateArgumentLoc &Output) {
4176   Output = getSema().getTrivialTemplateArgumentLoc(
4177       Arg, QualType(), getDerived().getBaseLocation());
4178 }
4179 
4180 template<typename Derived>
4181 bool TreeTransform<Derived>::TransformTemplateArgument(
4182                                          const TemplateArgumentLoc &Input,
4183                                          TemplateArgumentLoc &Output, bool Uneval) {
4184   const TemplateArgument &Arg = Input.getArgument();
4185   switch (Arg.getKind()) {
4186   case TemplateArgument::Null:
4187   case TemplateArgument::Pack:
4188     llvm_unreachable("Unexpected TemplateArgument");
4189 
4190   case TemplateArgument::Integral:
4191   case TemplateArgument::NullPtr:
4192   case TemplateArgument::Declaration: {
4193     // Transform a resolved template argument straight to a resolved template
4194     // argument. We get here when substituting into an already-substituted
4195     // template type argument during concept satisfaction checking.
4196     QualType T = Arg.getNonTypeTemplateArgumentType();
4197     QualType NewT = getDerived().TransformType(T);
4198     if (NewT.isNull())
4199       return true;
4200 
4201     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4202                        ? Arg.getAsDecl()
4203                        : nullptr;
4204     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4205                               getDerived().getBaseLocation(), D))
4206                         : nullptr;
4207     if (D && !NewD)
4208       return true;
4209 
4210     if (NewT == T && D == NewD)
4211       Output = Input;
4212     else if (Arg.getKind() == TemplateArgument::Integral)
4213       Output = TemplateArgumentLoc(
4214           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4215           TemplateArgumentLocInfo());
4216     else if (Arg.getKind() == TemplateArgument::NullPtr)
4217       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4218                                    TemplateArgumentLocInfo());
4219     else
4220       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4221                                    TemplateArgumentLocInfo());
4222 
4223     return false;
4224   }
4225 
4226   case TemplateArgument::Type: {
4227     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4228     if (!DI)
4229       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4230 
4231     DI = getDerived().TransformType(DI);
4232     if (!DI) return true;
4233 
4234     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4235     return false;
4236   }
4237 
4238   case TemplateArgument::Template: {
4239     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4240     if (QualifierLoc) {
4241       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4242       if (!QualifierLoc)
4243         return true;
4244     }
4245 
4246     CXXScopeSpec SS;
4247     SS.Adopt(QualifierLoc);
4248     TemplateName Template
4249       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4250                                            Input.getTemplateNameLoc());
4251     if (Template.isNull())
4252       return true;
4253 
4254     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
4255                                  Input.getTemplateNameLoc());
4256     return false;
4257   }
4258 
4259   case TemplateArgument::TemplateExpansion:
4260     llvm_unreachable("Caller should expand pack expansions");
4261 
4262   case TemplateArgument::Expression: {
4263     // Template argument expressions are constant expressions.
4264     EnterExpressionEvaluationContext Unevaluated(
4265         getSema(),
4266         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4267                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4268         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4269         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4270 
4271     Expr *InputExpr = Input.getSourceExpression();
4272     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4273 
4274     ExprResult E = getDerived().TransformExpr(InputExpr);
4275     E = SemaRef.ActOnConstantExpression(E);
4276     if (E.isInvalid()) return true;
4277     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4278     return false;
4279   }
4280   }
4281 
4282   // Work around bogus GCC warning
4283   return true;
4284 }
4285 
4286 /// Iterator adaptor that invents template argument location information
4287 /// for each of the template arguments in its underlying iterator.
4288 template<typename Derived, typename InputIterator>
4289 class TemplateArgumentLocInventIterator {
4290   TreeTransform<Derived> &Self;
4291   InputIterator Iter;
4292 
4293 public:
4294   typedef TemplateArgumentLoc value_type;
4295   typedef TemplateArgumentLoc reference;
4296   typedef typename std::iterator_traits<InputIterator>::difference_type
4297     difference_type;
4298   typedef std::input_iterator_tag iterator_category;
4299 
4300   class pointer {
4301     TemplateArgumentLoc Arg;
4302 
4303   public:
4304     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4305 
4306     const TemplateArgumentLoc *operator->() const { return &Arg; }
4307   };
4308 
4309   TemplateArgumentLocInventIterator() { }
4310 
4311   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4312                                              InputIterator Iter)
4313     : Self(Self), Iter(Iter) { }
4314 
4315   TemplateArgumentLocInventIterator &operator++() {
4316     ++Iter;
4317     return *this;
4318   }
4319 
4320   TemplateArgumentLocInventIterator operator++(int) {
4321     TemplateArgumentLocInventIterator Old(*this);
4322     ++(*this);
4323     return Old;
4324   }
4325 
4326   reference operator*() const {
4327     TemplateArgumentLoc Result;
4328     Self.InventTemplateArgumentLoc(*Iter, Result);
4329     return Result;
4330   }
4331 
4332   pointer operator->() const { return pointer(**this); }
4333 
4334   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4335                          const TemplateArgumentLocInventIterator &Y) {
4336     return X.Iter == Y.Iter;
4337   }
4338 
4339   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4340                          const TemplateArgumentLocInventIterator &Y) {
4341     return X.Iter != Y.Iter;
4342   }
4343 };
4344 
4345 template<typename Derived>
4346 template<typename InputIterator>
4347 bool TreeTransform<Derived>::TransformTemplateArguments(
4348     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4349     bool Uneval) {
4350   for (; First != Last; ++First) {
4351     TemplateArgumentLoc Out;
4352     TemplateArgumentLoc In = *First;
4353 
4354     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4355       // Unpack argument packs, which we translate them into separate
4356       // arguments.
4357       // FIXME: We could do much better if we could guarantee that the
4358       // TemplateArgumentLocInfo for the pack expansion would be usable for
4359       // all of the template arguments in the argument pack.
4360       typedef TemplateArgumentLocInventIterator<Derived,
4361                                                 TemplateArgument::pack_iterator>
4362         PackLocIterator;
4363       if (TransformTemplateArguments(PackLocIterator(*this,
4364                                                  In.getArgument().pack_begin()),
4365                                      PackLocIterator(*this,
4366                                                    In.getArgument().pack_end()),
4367                                      Outputs, Uneval))
4368         return true;
4369 
4370       continue;
4371     }
4372 
4373     if (In.getArgument().isPackExpansion()) {
4374       // We have a pack expansion, for which we will be substituting into
4375       // the pattern.
4376       SourceLocation Ellipsis;
4377       Optional<unsigned> OrigNumExpansions;
4378       TemplateArgumentLoc Pattern
4379         = getSema().getTemplateArgumentPackExpansionPattern(
4380               In, Ellipsis, OrigNumExpansions);
4381 
4382       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4383       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4384       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4385 
4386       // Determine whether the set of unexpanded parameter packs can and should
4387       // be expanded.
4388       bool Expand = true;
4389       bool RetainExpansion = false;
4390       Optional<unsigned> NumExpansions = OrigNumExpansions;
4391       if (getDerived().TryExpandParameterPacks(Ellipsis,
4392                                                Pattern.getSourceRange(),
4393                                                Unexpanded,
4394                                                Expand,
4395                                                RetainExpansion,
4396                                                NumExpansions))
4397         return true;
4398 
4399       if (!Expand) {
4400         // The transform has determined that we should perform a simple
4401         // transformation on the pack expansion, producing another pack
4402         // expansion.
4403         TemplateArgumentLoc OutPattern;
4404         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4405         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4406           return true;
4407 
4408         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4409                                                 NumExpansions);
4410         if (Out.getArgument().isNull())
4411           return true;
4412 
4413         Outputs.addArgument(Out);
4414         continue;
4415       }
4416 
4417       // The transform has determined that we should perform an elementwise
4418       // expansion of the pattern. Do so.
4419       for (unsigned I = 0; I != *NumExpansions; ++I) {
4420         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4421 
4422         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4423           return true;
4424 
4425         if (Out.getArgument().containsUnexpandedParameterPack()) {
4426           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4427                                                   OrigNumExpansions);
4428           if (Out.getArgument().isNull())
4429             return true;
4430         }
4431 
4432         Outputs.addArgument(Out);
4433       }
4434 
4435       // If we're supposed to retain a pack expansion, do so by temporarily
4436       // forgetting the partially-substituted parameter pack.
4437       if (RetainExpansion) {
4438         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4439 
4440         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4441           return true;
4442 
4443         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4444                                                 OrigNumExpansions);
4445         if (Out.getArgument().isNull())
4446           return true;
4447 
4448         Outputs.addArgument(Out);
4449       }
4450 
4451       continue;
4452     }
4453 
4454     // The simple case:
4455     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4456       return true;
4457 
4458     Outputs.addArgument(Out);
4459   }
4460 
4461   return false;
4462 
4463 }
4464 
4465 //===----------------------------------------------------------------------===//
4466 // Type transformation
4467 //===----------------------------------------------------------------------===//
4468 
4469 template<typename Derived>
4470 QualType TreeTransform<Derived>::TransformType(QualType T) {
4471   if (getDerived().AlreadyTransformed(T))
4472     return T;
4473 
4474   // Temporary workaround.  All of these transformations should
4475   // eventually turn into transformations on TypeLocs.
4476   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4477                                                 getDerived().getBaseLocation());
4478 
4479   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4480 
4481   if (!NewDI)
4482     return QualType();
4483 
4484   return NewDI->getType();
4485 }
4486 
4487 template<typename Derived>
4488 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4489   // Refine the base location to the type's location.
4490   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4491                        getDerived().getBaseEntity());
4492   if (getDerived().AlreadyTransformed(DI->getType()))
4493     return DI;
4494 
4495   TypeLocBuilder TLB;
4496 
4497   TypeLoc TL = DI->getTypeLoc();
4498   TLB.reserve(TL.getFullDataSize());
4499 
4500   QualType Result = getDerived().TransformType(TLB, TL);
4501   if (Result.isNull())
4502     return nullptr;
4503 
4504   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4505 }
4506 
4507 template<typename Derived>
4508 QualType
4509 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4510   switch (T.getTypeLocClass()) {
4511 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4512 #define TYPELOC(CLASS, PARENT)                                                 \
4513   case TypeLoc::CLASS:                                                         \
4514     return getDerived().Transform##CLASS##Type(TLB,                            \
4515                                                T.castAs<CLASS##TypeLoc>());
4516 #include "clang/AST/TypeLocNodes.def"
4517   }
4518 
4519   llvm_unreachable("unhandled type loc!");
4520 }
4521 
4522 template<typename Derived>
4523 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4524   if (!isa<DependentNameType>(T))
4525     return TransformType(T);
4526 
4527   if (getDerived().AlreadyTransformed(T))
4528     return T;
4529   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4530                                                 getDerived().getBaseLocation());
4531   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4532   return NewDI ? NewDI->getType() : QualType();
4533 }
4534 
4535 template<typename Derived>
4536 TypeSourceInfo *
4537 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4538   if (!isa<DependentNameType>(DI->getType()))
4539     return TransformType(DI);
4540 
4541   // Refine the base location to the type's location.
4542   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4543                        getDerived().getBaseEntity());
4544   if (getDerived().AlreadyTransformed(DI->getType()))
4545     return DI;
4546 
4547   TypeLocBuilder TLB;
4548 
4549   TypeLoc TL = DI->getTypeLoc();
4550   TLB.reserve(TL.getFullDataSize());
4551 
4552   auto QTL = TL.getAs<QualifiedTypeLoc>();
4553   if (QTL)
4554     TL = QTL.getUnqualifiedLoc();
4555 
4556   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4557 
4558   QualType Result = getDerived().TransformDependentNameType(
4559       TLB, DNTL, /*DeducedTSTContext*/true);
4560   if (Result.isNull())
4561     return nullptr;
4562 
4563   if (QTL) {
4564     Result = getDerived().RebuildQualifiedType(Result, QTL);
4565     if (Result.isNull())
4566       return nullptr;
4567     TLB.TypeWasModifiedSafely(Result);
4568   }
4569 
4570   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4571 }
4572 
4573 template<typename Derived>
4574 QualType
4575 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4576                                                QualifiedTypeLoc T) {
4577   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4578   if (Result.isNull())
4579     return QualType();
4580 
4581   Result = getDerived().RebuildQualifiedType(Result, T);
4582 
4583   if (Result.isNull())
4584     return QualType();
4585 
4586   // RebuildQualifiedType might have updated the type, but not in a way
4587   // that invalidates the TypeLoc. (There's no location information for
4588   // qualifiers.)
4589   TLB.TypeWasModifiedSafely(Result);
4590 
4591   return Result;
4592 }
4593 
4594 template <typename Derived>
4595 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4596                                                       QualifiedTypeLoc TL) {
4597 
4598   SourceLocation Loc = TL.getBeginLoc();
4599   Qualifiers Quals = TL.getType().getLocalQualifiers();
4600 
4601   if (((T.getAddressSpace() != LangAS::Default &&
4602         Quals.getAddressSpace() != LangAS::Default)) &&
4603       T.getAddressSpace() != Quals.getAddressSpace()) {
4604     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4605         << TL.getType() << T;
4606     return QualType();
4607   }
4608 
4609   // C++ [dcl.fct]p7:
4610   //   [When] adding cv-qualifications on top of the function type [...] the
4611   //   cv-qualifiers are ignored.
4612   if (T->isFunctionType()) {
4613     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4614                                                      Quals.getAddressSpace());
4615     return T;
4616   }
4617 
4618   // C++ [dcl.ref]p1:
4619   //   when the cv-qualifiers are introduced through the use of a typedef-name
4620   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4621   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4622   // applied to a reference type.
4623   if (T->isReferenceType()) {
4624     // The only qualifier that applies to a reference type is restrict.
4625     if (!Quals.hasRestrict())
4626       return T;
4627     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4628   }
4629 
4630   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4631   // resulting type.
4632   if (Quals.hasObjCLifetime()) {
4633     if (!T->isObjCLifetimeType() && !T->isDependentType())
4634       Quals.removeObjCLifetime();
4635     else if (T.getObjCLifetime()) {
4636       // Objective-C ARC:
4637       //   A lifetime qualifier applied to a substituted template parameter
4638       //   overrides the lifetime qualifier from the template argument.
4639       const AutoType *AutoTy;
4640       if (const SubstTemplateTypeParmType *SubstTypeParam
4641                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4642         QualType Replacement = SubstTypeParam->getReplacementType();
4643         Qualifiers Qs = Replacement.getQualifiers();
4644         Qs.removeObjCLifetime();
4645         Replacement = SemaRef.Context.getQualifiedType(
4646             Replacement.getUnqualifiedType(), Qs);
4647         T = SemaRef.Context.getSubstTemplateTypeParmType(
4648             SubstTypeParam->getReplacedParameter(), Replacement);
4649       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4650         // 'auto' types behave the same way as template parameters.
4651         QualType Deduced = AutoTy->getDeducedType();
4652         Qualifiers Qs = Deduced.getQualifiers();
4653         Qs.removeObjCLifetime();
4654         Deduced =
4655             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4656         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4657                                         AutoTy->isDependentType(),
4658                                         /*isPack=*/false,
4659                                         AutoTy->getTypeConstraintConcept(),
4660                                         AutoTy->getTypeConstraintArguments());
4661       } else {
4662         // Otherwise, complain about the addition of a qualifier to an
4663         // already-qualified type.
4664         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4665         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4666         Quals.removeObjCLifetime();
4667       }
4668     }
4669   }
4670 
4671   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4672 }
4673 
4674 template<typename Derived>
4675 TypeLoc
4676 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4677                                                    QualType ObjectType,
4678                                                    NamedDecl *UnqualLookup,
4679                                                    CXXScopeSpec &SS) {
4680   if (getDerived().AlreadyTransformed(TL.getType()))
4681     return TL;
4682 
4683   TypeSourceInfo *TSI =
4684       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4685   if (TSI)
4686     return TSI->getTypeLoc();
4687   return TypeLoc();
4688 }
4689 
4690 template<typename Derived>
4691 TypeSourceInfo *
4692 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4693                                                    QualType ObjectType,
4694                                                    NamedDecl *UnqualLookup,
4695                                                    CXXScopeSpec &SS) {
4696   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4697     return TSInfo;
4698 
4699   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4700                                    UnqualLookup, SS);
4701 }
4702 
4703 template <typename Derived>
4704 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4705     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4706     CXXScopeSpec &SS) {
4707   QualType T = TL.getType();
4708   assert(!getDerived().AlreadyTransformed(T));
4709 
4710   TypeLocBuilder TLB;
4711   QualType Result;
4712 
4713   if (isa<TemplateSpecializationType>(T)) {
4714     TemplateSpecializationTypeLoc SpecTL =
4715         TL.castAs<TemplateSpecializationTypeLoc>();
4716 
4717     TemplateName Template = getDerived().TransformTemplateName(
4718         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4719         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4720     if (Template.isNull())
4721       return nullptr;
4722 
4723     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4724                                                               Template);
4725   } else if (isa<DependentTemplateSpecializationType>(T)) {
4726     DependentTemplateSpecializationTypeLoc SpecTL =
4727         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4728 
4729     TemplateName Template
4730       = getDerived().RebuildTemplateName(SS,
4731                                          SpecTL.getTemplateKeywordLoc(),
4732                                          *SpecTL.getTypePtr()->getIdentifier(),
4733                                          SpecTL.getTemplateNameLoc(),
4734                                          ObjectType, UnqualLookup,
4735                                          /*AllowInjectedClassName*/true);
4736     if (Template.isNull())
4737       return nullptr;
4738 
4739     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4740                                                                        SpecTL,
4741                                                                        Template,
4742                                                                        SS);
4743   } else {
4744     // Nothing special needs to be done for these.
4745     Result = getDerived().TransformType(TLB, TL);
4746   }
4747 
4748   if (Result.isNull())
4749     return nullptr;
4750 
4751   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4752 }
4753 
4754 template <class TyLoc> static inline
4755 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4756   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4757   NewT.setNameLoc(T.getNameLoc());
4758   return T.getType();
4759 }
4760 
4761 template<typename Derived>
4762 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4763                                                       BuiltinTypeLoc T) {
4764   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4765   NewT.setBuiltinLoc(T.getBuiltinLoc());
4766   if (T.needsExtraLocalData())
4767     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4768   return T.getType();
4769 }
4770 
4771 template<typename Derived>
4772 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4773                                                       ComplexTypeLoc T) {
4774   // FIXME: recurse?
4775   return TransformTypeSpecType(TLB, T);
4776 }
4777 
4778 template <typename Derived>
4779 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4780                                                        AdjustedTypeLoc TL) {
4781   // Adjustments applied during transformation are handled elsewhere.
4782   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4783 }
4784 
4785 template<typename Derived>
4786 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4787                                                       DecayedTypeLoc TL) {
4788   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4789   if (OriginalType.isNull())
4790     return QualType();
4791 
4792   QualType Result = TL.getType();
4793   if (getDerived().AlwaysRebuild() ||
4794       OriginalType != TL.getOriginalLoc().getType())
4795     Result = SemaRef.Context.getDecayedType(OriginalType);
4796   TLB.push<DecayedTypeLoc>(Result);
4797   // Nothing to set for DecayedTypeLoc.
4798   return Result;
4799 }
4800 
4801 template<typename Derived>
4802 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4803                                                       PointerTypeLoc TL) {
4804   QualType PointeeType
4805     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4806   if (PointeeType.isNull())
4807     return QualType();
4808 
4809   QualType Result = TL.getType();
4810   if (PointeeType->getAs<ObjCObjectType>()) {
4811     // A dependent pointer type 'T *' has is being transformed such
4812     // that an Objective-C class type is being replaced for 'T'. The
4813     // resulting pointer type is an ObjCObjectPointerType, not a
4814     // PointerType.
4815     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4816 
4817     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4818     NewT.setStarLoc(TL.getStarLoc());
4819     return Result;
4820   }
4821 
4822   if (getDerived().AlwaysRebuild() ||
4823       PointeeType != TL.getPointeeLoc().getType()) {
4824     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4825     if (Result.isNull())
4826       return QualType();
4827   }
4828 
4829   // Objective-C ARC can add lifetime qualifiers to the type that we're
4830   // pointing to.
4831   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4832 
4833   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4834   NewT.setSigilLoc(TL.getSigilLoc());
4835   return Result;
4836 }
4837 
4838 template<typename Derived>
4839 QualType
4840 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4841                                                   BlockPointerTypeLoc TL) {
4842   QualType PointeeType
4843     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4844   if (PointeeType.isNull())
4845     return QualType();
4846 
4847   QualType Result = TL.getType();
4848   if (getDerived().AlwaysRebuild() ||
4849       PointeeType != TL.getPointeeLoc().getType()) {
4850     Result = getDerived().RebuildBlockPointerType(PointeeType,
4851                                                   TL.getSigilLoc());
4852     if (Result.isNull())
4853       return QualType();
4854   }
4855 
4856   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4857   NewT.setSigilLoc(TL.getSigilLoc());
4858   return Result;
4859 }
4860 
4861 /// Transforms a reference type.  Note that somewhat paradoxically we
4862 /// don't care whether the type itself is an l-value type or an r-value
4863 /// type;  we only care if the type was *written* as an l-value type
4864 /// or an r-value type.
4865 template<typename Derived>
4866 QualType
4867 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4868                                                ReferenceTypeLoc TL) {
4869   const ReferenceType *T = TL.getTypePtr();
4870 
4871   // Note that this works with the pointee-as-written.
4872   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4873   if (PointeeType.isNull())
4874     return QualType();
4875 
4876   QualType Result = TL.getType();
4877   if (getDerived().AlwaysRebuild() ||
4878       PointeeType != T->getPointeeTypeAsWritten()) {
4879     Result = getDerived().RebuildReferenceType(PointeeType,
4880                                                T->isSpelledAsLValue(),
4881                                                TL.getSigilLoc());
4882     if (Result.isNull())
4883       return QualType();
4884   }
4885 
4886   // Objective-C ARC can add lifetime qualifiers to the type that we're
4887   // referring to.
4888   TLB.TypeWasModifiedSafely(
4889       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4890 
4891   // r-value references can be rebuilt as l-value references.
4892   ReferenceTypeLoc NewTL;
4893   if (isa<LValueReferenceType>(Result))
4894     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4895   else
4896     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4897   NewTL.setSigilLoc(TL.getSigilLoc());
4898 
4899   return Result;
4900 }
4901 
4902 template<typename Derived>
4903 QualType
4904 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4905                                                  LValueReferenceTypeLoc TL) {
4906   return TransformReferenceType(TLB, TL);
4907 }
4908 
4909 template<typename Derived>
4910 QualType
4911 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4912                                                  RValueReferenceTypeLoc TL) {
4913   return TransformReferenceType(TLB, TL);
4914 }
4915 
4916 template<typename Derived>
4917 QualType
4918 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4919                                                    MemberPointerTypeLoc TL) {
4920   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4921   if (PointeeType.isNull())
4922     return QualType();
4923 
4924   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4925   TypeSourceInfo *NewClsTInfo = nullptr;
4926   if (OldClsTInfo) {
4927     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4928     if (!NewClsTInfo)
4929       return QualType();
4930   }
4931 
4932   const MemberPointerType *T = TL.getTypePtr();
4933   QualType OldClsType = QualType(T->getClass(), 0);
4934   QualType NewClsType;
4935   if (NewClsTInfo)
4936     NewClsType = NewClsTInfo->getType();
4937   else {
4938     NewClsType = getDerived().TransformType(OldClsType);
4939     if (NewClsType.isNull())
4940       return QualType();
4941   }
4942 
4943   QualType Result = TL.getType();
4944   if (getDerived().AlwaysRebuild() ||
4945       PointeeType != T->getPointeeType() ||
4946       NewClsType != OldClsType) {
4947     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4948                                                    TL.getStarLoc());
4949     if (Result.isNull())
4950       return QualType();
4951   }
4952 
4953   // If we had to adjust the pointee type when building a member pointer, make
4954   // sure to push TypeLoc info for it.
4955   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4956   if (MPT && PointeeType != MPT->getPointeeType()) {
4957     assert(isa<AdjustedType>(MPT->getPointeeType()));
4958     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4959   }
4960 
4961   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4962   NewTL.setSigilLoc(TL.getSigilLoc());
4963   NewTL.setClassTInfo(NewClsTInfo);
4964 
4965   return Result;
4966 }
4967 
4968 template<typename Derived>
4969 QualType
4970 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4971                                                    ConstantArrayTypeLoc TL) {
4972   const ConstantArrayType *T = TL.getTypePtr();
4973   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4974   if (ElementType.isNull())
4975     return QualType();
4976 
4977   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4978   Expr *OldSize = TL.getSizeExpr();
4979   if (!OldSize)
4980     OldSize = const_cast<Expr*>(T->getSizeExpr());
4981   Expr *NewSize = nullptr;
4982   if (OldSize) {
4983     EnterExpressionEvaluationContext Unevaluated(
4984         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4985     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
4986     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
4987   }
4988 
4989   QualType Result = TL.getType();
4990   if (getDerived().AlwaysRebuild() ||
4991       ElementType != T->getElementType() ||
4992       (T->getSizeExpr() && NewSize != OldSize)) {
4993     Result = getDerived().RebuildConstantArrayType(ElementType,
4994                                                    T->getSizeModifier(),
4995                                                    T->getSize(), NewSize,
4996                                              T->getIndexTypeCVRQualifiers(),
4997                                                    TL.getBracketsRange());
4998     if (Result.isNull())
4999       return QualType();
5000   }
5001 
5002   // We might have either a ConstantArrayType or a VariableArrayType now:
5003   // a ConstantArrayType is allowed to have an element type which is a
5004   // VariableArrayType if the type is dependent.  Fortunately, all array
5005   // types have the same location layout.
5006   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5007   NewTL.setLBracketLoc(TL.getLBracketLoc());
5008   NewTL.setRBracketLoc(TL.getRBracketLoc());
5009   NewTL.setSizeExpr(NewSize);
5010 
5011   return Result;
5012 }
5013 
5014 template<typename Derived>
5015 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5016                                               TypeLocBuilder &TLB,
5017                                               IncompleteArrayTypeLoc TL) {
5018   const IncompleteArrayType *T = TL.getTypePtr();
5019   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5020   if (ElementType.isNull())
5021     return QualType();
5022 
5023   QualType Result = TL.getType();
5024   if (getDerived().AlwaysRebuild() ||
5025       ElementType != T->getElementType()) {
5026     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5027                                                      T->getSizeModifier(),
5028                                            T->getIndexTypeCVRQualifiers(),
5029                                                      TL.getBracketsRange());
5030     if (Result.isNull())
5031       return QualType();
5032   }
5033 
5034   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5035   NewTL.setLBracketLoc(TL.getLBracketLoc());
5036   NewTL.setRBracketLoc(TL.getRBracketLoc());
5037   NewTL.setSizeExpr(nullptr);
5038 
5039   return Result;
5040 }
5041 
5042 template<typename Derived>
5043 QualType
5044 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5045                                                    VariableArrayTypeLoc TL) {
5046   const VariableArrayType *T = TL.getTypePtr();
5047   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5048   if (ElementType.isNull())
5049     return QualType();
5050 
5051   ExprResult SizeResult;
5052   {
5053     EnterExpressionEvaluationContext Context(
5054         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5055     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5056   }
5057   if (SizeResult.isInvalid())
5058     return QualType();
5059   SizeResult =
5060       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5061   if (SizeResult.isInvalid())
5062     return QualType();
5063 
5064   Expr *Size = SizeResult.get();
5065 
5066   QualType Result = TL.getType();
5067   if (getDerived().AlwaysRebuild() ||
5068       ElementType != T->getElementType() ||
5069       Size != T->getSizeExpr()) {
5070     Result = getDerived().RebuildVariableArrayType(ElementType,
5071                                                    T->getSizeModifier(),
5072                                                    Size,
5073                                              T->getIndexTypeCVRQualifiers(),
5074                                                    TL.getBracketsRange());
5075     if (Result.isNull())
5076       return QualType();
5077   }
5078 
5079   // We might have constant size array now, but fortunately it has the same
5080   // location layout.
5081   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5082   NewTL.setLBracketLoc(TL.getLBracketLoc());
5083   NewTL.setRBracketLoc(TL.getRBracketLoc());
5084   NewTL.setSizeExpr(Size);
5085 
5086   return Result;
5087 }
5088 
5089 template<typename Derived>
5090 QualType
5091 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5092                                              DependentSizedArrayTypeLoc TL) {
5093   const DependentSizedArrayType *T = TL.getTypePtr();
5094   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5095   if (ElementType.isNull())
5096     return QualType();
5097 
5098   // Array bounds are constant expressions.
5099   EnterExpressionEvaluationContext Unevaluated(
5100       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5101 
5102   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5103   Expr *origSize = TL.getSizeExpr();
5104   if (!origSize) origSize = T->getSizeExpr();
5105 
5106   ExprResult sizeResult
5107     = getDerived().TransformExpr(origSize);
5108   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5109   if (sizeResult.isInvalid())
5110     return QualType();
5111 
5112   Expr *size = sizeResult.get();
5113 
5114   QualType Result = TL.getType();
5115   if (getDerived().AlwaysRebuild() ||
5116       ElementType != T->getElementType() ||
5117       size != origSize) {
5118     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5119                                                          T->getSizeModifier(),
5120                                                          size,
5121                                                 T->getIndexTypeCVRQualifiers(),
5122                                                         TL.getBracketsRange());
5123     if (Result.isNull())
5124       return QualType();
5125   }
5126 
5127   // We might have any sort of array type now, but fortunately they
5128   // all have the same location layout.
5129   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5130   NewTL.setLBracketLoc(TL.getLBracketLoc());
5131   NewTL.setRBracketLoc(TL.getRBracketLoc());
5132   NewTL.setSizeExpr(size);
5133 
5134   return Result;
5135 }
5136 
5137 template <typename Derived>
5138 QualType TreeTransform<Derived>::TransformDependentVectorType(
5139     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5140   const DependentVectorType *T = TL.getTypePtr();
5141   QualType ElementType = getDerived().TransformType(T->getElementType());
5142   if (ElementType.isNull())
5143     return QualType();
5144 
5145   EnterExpressionEvaluationContext Unevaluated(
5146       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5147 
5148   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5149   Size = SemaRef.ActOnConstantExpression(Size);
5150   if (Size.isInvalid())
5151     return QualType();
5152 
5153   QualType Result = TL.getType();
5154   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5155       Size.get() != T->getSizeExpr()) {
5156     Result = getDerived().RebuildDependentVectorType(
5157         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5158     if (Result.isNull())
5159       return QualType();
5160   }
5161 
5162   // Result might be dependent or not.
5163   if (isa<DependentVectorType>(Result)) {
5164     DependentVectorTypeLoc NewTL =
5165         TLB.push<DependentVectorTypeLoc>(Result);
5166     NewTL.setNameLoc(TL.getNameLoc());
5167   } else {
5168     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5169     NewTL.setNameLoc(TL.getNameLoc());
5170   }
5171 
5172   return Result;
5173 }
5174 
5175 template<typename Derived>
5176 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5177                                       TypeLocBuilder &TLB,
5178                                       DependentSizedExtVectorTypeLoc TL) {
5179   const DependentSizedExtVectorType *T = TL.getTypePtr();
5180 
5181   // FIXME: ext vector locs should be nested
5182   QualType ElementType = getDerived().TransformType(T->getElementType());
5183   if (ElementType.isNull())
5184     return QualType();
5185 
5186   // Vector sizes are constant expressions.
5187   EnterExpressionEvaluationContext Unevaluated(
5188       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5189 
5190   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5191   Size = SemaRef.ActOnConstantExpression(Size);
5192   if (Size.isInvalid())
5193     return QualType();
5194 
5195   QualType Result = TL.getType();
5196   if (getDerived().AlwaysRebuild() ||
5197       ElementType != T->getElementType() ||
5198       Size.get() != T->getSizeExpr()) {
5199     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5200                                                              Size.get(),
5201                                                          T->getAttributeLoc());
5202     if (Result.isNull())
5203       return QualType();
5204   }
5205 
5206   // Result might be dependent or not.
5207   if (isa<DependentSizedExtVectorType>(Result)) {
5208     DependentSizedExtVectorTypeLoc NewTL
5209       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5210     NewTL.setNameLoc(TL.getNameLoc());
5211   } else {
5212     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5213     NewTL.setNameLoc(TL.getNameLoc());
5214   }
5215 
5216   return Result;
5217 }
5218 
5219 template <typename Derived>
5220 QualType
5221 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5222                                                     ConstantMatrixTypeLoc TL) {
5223   const ConstantMatrixType *T = TL.getTypePtr();
5224   QualType ElementType = getDerived().TransformType(T->getElementType());
5225   if (ElementType.isNull())
5226     return QualType();
5227 
5228   QualType Result = TL.getType();
5229   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5230     Result = getDerived().RebuildConstantMatrixType(
5231         ElementType, T->getNumRows(), T->getNumColumns());
5232     if (Result.isNull())
5233       return QualType();
5234   }
5235 
5236   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5237   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5238   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5239   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5240   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5241 
5242   return Result;
5243 }
5244 
5245 template <typename Derived>
5246 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5247     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5248   const DependentSizedMatrixType *T = TL.getTypePtr();
5249 
5250   QualType ElementType = getDerived().TransformType(T->getElementType());
5251   if (ElementType.isNull()) {
5252     return QualType();
5253   }
5254 
5255   // Matrix dimensions are constant expressions.
5256   EnterExpressionEvaluationContext Unevaluated(
5257       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5258 
5259   Expr *origRows = TL.getAttrRowOperand();
5260   if (!origRows)
5261     origRows = T->getRowExpr();
5262   Expr *origColumns = TL.getAttrColumnOperand();
5263   if (!origColumns)
5264     origColumns = T->getColumnExpr();
5265 
5266   ExprResult rowResult = getDerived().TransformExpr(origRows);
5267   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5268   if (rowResult.isInvalid())
5269     return QualType();
5270 
5271   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5272   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5273   if (columnResult.isInvalid())
5274     return QualType();
5275 
5276   Expr *rows = rowResult.get();
5277   Expr *columns = columnResult.get();
5278 
5279   QualType Result = TL.getType();
5280   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5281       rows != origRows || columns != origColumns) {
5282     Result = getDerived().RebuildDependentSizedMatrixType(
5283         ElementType, rows, columns, T->getAttributeLoc());
5284 
5285     if (Result.isNull())
5286       return QualType();
5287   }
5288 
5289   // We might have any sort of matrix type now, but fortunately they
5290   // all have the same location layout.
5291   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5292   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5293   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5294   NewTL.setAttrRowOperand(rows);
5295   NewTL.setAttrColumnOperand(columns);
5296   return Result;
5297 }
5298 
5299 template <typename Derived>
5300 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5301     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5302   const DependentAddressSpaceType *T = TL.getTypePtr();
5303 
5304   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5305 
5306   if (pointeeType.isNull())
5307     return QualType();
5308 
5309   // Address spaces are constant expressions.
5310   EnterExpressionEvaluationContext Unevaluated(
5311       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5312 
5313   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5314   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5315   if (AddrSpace.isInvalid())
5316     return QualType();
5317 
5318   QualType Result = TL.getType();
5319   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5320       AddrSpace.get() != T->getAddrSpaceExpr()) {
5321     Result = getDerived().RebuildDependentAddressSpaceType(
5322         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5323     if (Result.isNull())
5324       return QualType();
5325   }
5326 
5327   // Result might be dependent or not.
5328   if (isa<DependentAddressSpaceType>(Result)) {
5329     DependentAddressSpaceTypeLoc NewTL =
5330         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5331 
5332     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5333     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5334     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5335 
5336   } else {
5337     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5338         Result, getDerived().getBaseLocation());
5339     TransformType(TLB, DI->getTypeLoc());
5340   }
5341 
5342   return Result;
5343 }
5344 
5345 template <typename Derived>
5346 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5347                                                      VectorTypeLoc TL) {
5348   const VectorType *T = TL.getTypePtr();
5349   QualType ElementType = getDerived().TransformType(T->getElementType());
5350   if (ElementType.isNull())
5351     return QualType();
5352 
5353   QualType Result = TL.getType();
5354   if (getDerived().AlwaysRebuild() ||
5355       ElementType != T->getElementType()) {
5356     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5357                                             T->getVectorKind());
5358     if (Result.isNull())
5359       return QualType();
5360   }
5361 
5362   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5363   NewTL.setNameLoc(TL.getNameLoc());
5364 
5365   return Result;
5366 }
5367 
5368 template<typename Derived>
5369 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5370                                                         ExtVectorTypeLoc TL) {
5371   const VectorType *T = TL.getTypePtr();
5372   QualType ElementType = getDerived().TransformType(T->getElementType());
5373   if (ElementType.isNull())
5374     return QualType();
5375 
5376   QualType Result = TL.getType();
5377   if (getDerived().AlwaysRebuild() ||
5378       ElementType != T->getElementType()) {
5379     Result = getDerived().RebuildExtVectorType(ElementType,
5380                                                T->getNumElements(),
5381                                                /*FIXME*/ SourceLocation());
5382     if (Result.isNull())
5383       return QualType();
5384   }
5385 
5386   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5387   NewTL.setNameLoc(TL.getNameLoc());
5388 
5389   return Result;
5390 }
5391 
5392 template <typename Derived>
5393 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5394     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5395     bool ExpectParameterPack) {
5396   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5397   TypeSourceInfo *NewDI = nullptr;
5398 
5399   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5400     // If we're substituting into a pack expansion type and we know the
5401     // length we want to expand to, just substitute for the pattern.
5402     TypeLoc OldTL = OldDI->getTypeLoc();
5403     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5404 
5405     TypeLocBuilder TLB;
5406     TypeLoc NewTL = OldDI->getTypeLoc();
5407     TLB.reserve(NewTL.getFullDataSize());
5408 
5409     QualType Result = getDerived().TransformType(TLB,
5410                                                OldExpansionTL.getPatternLoc());
5411     if (Result.isNull())
5412       return nullptr;
5413 
5414     Result = RebuildPackExpansionType(Result,
5415                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5416                                       OldExpansionTL.getEllipsisLoc(),
5417                                       NumExpansions);
5418     if (Result.isNull())
5419       return nullptr;
5420 
5421     PackExpansionTypeLoc NewExpansionTL
5422       = TLB.push<PackExpansionTypeLoc>(Result);
5423     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5424     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5425   } else
5426     NewDI = getDerived().TransformType(OldDI);
5427   if (!NewDI)
5428     return nullptr;
5429 
5430   if (NewDI == OldDI && indexAdjustment == 0)
5431     return OldParm;
5432 
5433   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5434                                              OldParm->getDeclContext(),
5435                                              OldParm->getInnerLocStart(),
5436                                              OldParm->getLocation(),
5437                                              OldParm->getIdentifier(),
5438                                              NewDI->getType(),
5439                                              NewDI,
5440                                              OldParm->getStorageClass(),
5441                                              /* DefArg */ nullptr);
5442   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5443                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5444   return newParm;
5445 }
5446 
5447 template <typename Derived>
5448 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5449     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5450     const QualType *ParamTypes,
5451     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5452     SmallVectorImpl<QualType> &OutParamTypes,
5453     SmallVectorImpl<ParmVarDecl *> *PVars,
5454     Sema::ExtParameterInfoBuilder &PInfos) {
5455   int indexAdjustment = 0;
5456 
5457   unsigned NumParams = Params.size();
5458   for (unsigned i = 0; i != NumParams; ++i) {
5459     if (ParmVarDecl *OldParm = Params[i]) {
5460       assert(OldParm->getFunctionScopeIndex() == i);
5461 
5462       Optional<unsigned> NumExpansions;
5463       ParmVarDecl *NewParm = nullptr;
5464       if (OldParm->isParameterPack()) {
5465         // We have a function parameter pack that may need to be expanded.
5466         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5467 
5468         // Find the parameter packs that could be expanded.
5469         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5470         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5471         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5472         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5473 
5474         // Determine whether we should expand the parameter packs.
5475         bool ShouldExpand = false;
5476         bool RetainExpansion = false;
5477         Optional<unsigned> OrigNumExpansions;
5478         if (Unexpanded.size() > 0) {
5479           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5480           NumExpansions = OrigNumExpansions;
5481           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5482                                                    Pattern.getSourceRange(),
5483                                                    Unexpanded,
5484                                                    ShouldExpand,
5485                                                    RetainExpansion,
5486                                                    NumExpansions)) {
5487             return true;
5488           }
5489         } else {
5490 #ifndef NDEBUG
5491           const AutoType *AT =
5492               Pattern.getType().getTypePtr()->getContainedAutoType();
5493           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5494                  "Could not find parameter packs or undeduced auto type!");
5495 #endif
5496         }
5497 
5498         if (ShouldExpand) {
5499           // Expand the function parameter pack into multiple, separate
5500           // parameters.
5501           getDerived().ExpandingFunctionParameterPack(OldParm);
5502           for (unsigned I = 0; I != *NumExpansions; ++I) {
5503             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5504             ParmVarDecl *NewParm
5505               = getDerived().TransformFunctionTypeParam(OldParm,
5506                                                         indexAdjustment++,
5507                                                         OrigNumExpansions,
5508                                                 /*ExpectParameterPack=*/false);
5509             if (!NewParm)
5510               return true;
5511 
5512             if (ParamInfos)
5513               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5514             OutParamTypes.push_back(NewParm->getType());
5515             if (PVars)
5516               PVars->push_back(NewParm);
5517           }
5518 
5519           // If we're supposed to retain a pack expansion, do so by temporarily
5520           // forgetting the partially-substituted parameter pack.
5521           if (RetainExpansion) {
5522             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5523             ParmVarDecl *NewParm
5524               = getDerived().TransformFunctionTypeParam(OldParm,
5525                                                         indexAdjustment++,
5526                                                         OrigNumExpansions,
5527                                                 /*ExpectParameterPack=*/false);
5528             if (!NewParm)
5529               return true;
5530 
5531             if (ParamInfos)
5532               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5533             OutParamTypes.push_back(NewParm->getType());
5534             if (PVars)
5535               PVars->push_back(NewParm);
5536           }
5537 
5538           // The next parameter should have the same adjustment as the
5539           // last thing we pushed, but we post-incremented indexAdjustment
5540           // on every push.  Also, if we push nothing, the adjustment should
5541           // go down by one.
5542           indexAdjustment--;
5543 
5544           // We're done with the pack expansion.
5545           continue;
5546         }
5547 
5548         // We'll substitute the parameter now without expanding the pack
5549         // expansion.
5550         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5551         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5552                                                           indexAdjustment,
5553                                                           NumExpansions,
5554                                                   /*ExpectParameterPack=*/true);
5555         assert(NewParm->isParameterPack() &&
5556                "Parameter pack no longer a parameter pack after "
5557                "transformation.");
5558       } else {
5559         NewParm = getDerived().TransformFunctionTypeParam(
5560             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5561       }
5562 
5563       if (!NewParm)
5564         return true;
5565 
5566       if (ParamInfos)
5567         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5568       OutParamTypes.push_back(NewParm->getType());
5569       if (PVars)
5570         PVars->push_back(NewParm);
5571       continue;
5572     }
5573 
5574     // Deal with the possibility that we don't have a parameter
5575     // declaration for this parameter.
5576     QualType OldType = ParamTypes[i];
5577     bool IsPackExpansion = false;
5578     Optional<unsigned> NumExpansions;
5579     QualType NewType;
5580     if (const PackExpansionType *Expansion
5581                                        = dyn_cast<PackExpansionType>(OldType)) {
5582       // We have a function parameter pack that may need to be expanded.
5583       QualType Pattern = Expansion->getPattern();
5584       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5585       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5586 
5587       // Determine whether we should expand the parameter packs.
5588       bool ShouldExpand = false;
5589       bool RetainExpansion = false;
5590       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5591                                                Unexpanded,
5592                                                ShouldExpand,
5593                                                RetainExpansion,
5594                                                NumExpansions)) {
5595         return true;
5596       }
5597 
5598       if (ShouldExpand) {
5599         // Expand the function parameter pack into multiple, separate
5600         // parameters.
5601         for (unsigned I = 0; I != *NumExpansions; ++I) {
5602           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5603           QualType NewType = getDerived().TransformType(Pattern);
5604           if (NewType.isNull())
5605             return true;
5606 
5607           if (NewType->containsUnexpandedParameterPack()) {
5608             NewType =
5609                 getSema().getASTContext().getPackExpansionType(NewType, None);
5610 
5611             if (NewType.isNull())
5612               return true;
5613           }
5614 
5615           if (ParamInfos)
5616             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5617           OutParamTypes.push_back(NewType);
5618           if (PVars)
5619             PVars->push_back(nullptr);
5620         }
5621 
5622         // We're done with the pack expansion.
5623         continue;
5624       }
5625 
5626       // If we're supposed to retain a pack expansion, do so by temporarily
5627       // forgetting the partially-substituted parameter pack.
5628       if (RetainExpansion) {
5629         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5630         QualType NewType = getDerived().TransformType(Pattern);
5631         if (NewType.isNull())
5632           return true;
5633 
5634         if (ParamInfos)
5635           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5636         OutParamTypes.push_back(NewType);
5637         if (PVars)
5638           PVars->push_back(nullptr);
5639       }
5640 
5641       // We'll substitute the parameter now without expanding the pack
5642       // expansion.
5643       OldType = Expansion->getPattern();
5644       IsPackExpansion = true;
5645       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5646       NewType = getDerived().TransformType(OldType);
5647     } else {
5648       NewType = getDerived().TransformType(OldType);
5649     }
5650 
5651     if (NewType.isNull())
5652       return true;
5653 
5654     if (IsPackExpansion)
5655       NewType = getSema().Context.getPackExpansionType(NewType,
5656                                                        NumExpansions);
5657 
5658     if (ParamInfos)
5659       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5660     OutParamTypes.push_back(NewType);
5661     if (PVars)
5662       PVars->push_back(nullptr);
5663   }
5664 
5665 #ifndef NDEBUG
5666   if (PVars) {
5667     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5668       if (ParmVarDecl *parm = (*PVars)[i])
5669         assert(parm->getFunctionScopeIndex() == i);
5670   }
5671 #endif
5672 
5673   return false;
5674 }
5675 
5676 template<typename Derived>
5677 QualType
5678 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5679                                                    FunctionProtoTypeLoc TL) {
5680   SmallVector<QualType, 4> ExceptionStorage;
5681   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5682   return getDerived().TransformFunctionProtoType(
5683       TLB, TL, nullptr, Qualifiers(),
5684       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5685         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5686                                             ExceptionStorage, Changed);
5687       });
5688 }
5689 
5690 template<typename Derived> template<typename Fn>
5691 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5692     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5693     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5694 
5695   // Transform the parameters and return type.
5696   //
5697   // We are required to instantiate the params and return type in source order.
5698   // When the function has a trailing return type, we instantiate the
5699   // parameters before the return type,  since the return type can then refer
5700   // to the parameters themselves (via decltype, sizeof, etc.).
5701   //
5702   SmallVector<QualType, 4> ParamTypes;
5703   SmallVector<ParmVarDecl*, 4> ParamDecls;
5704   Sema::ExtParameterInfoBuilder ExtParamInfos;
5705   const FunctionProtoType *T = TL.getTypePtr();
5706 
5707   QualType ResultType;
5708 
5709   if (T->hasTrailingReturn()) {
5710     if (getDerived().TransformFunctionTypeParams(
5711             TL.getBeginLoc(), TL.getParams(),
5712             TL.getTypePtr()->param_type_begin(),
5713             T->getExtParameterInfosOrNull(),
5714             ParamTypes, &ParamDecls, ExtParamInfos))
5715       return QualType();
5716 
5717     {
5718       // C++11 [expr.prim.general]p3:
5719       //   If a declaration declares a member function or member function
5720       //   template of a class X, the expression this is a prvalue of type
5721       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5722       //   and the end of the function-definition, member-declarator, or
5723       //   declarator.
5724       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5725 
5726       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5727       if (ResultType.isNull())
5728         return QualType();
5729     }
5730   }
5731   else {
5732     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5733     if (ResultType.isNull())
5734       return QualType();
5735 
5736     if (getDerived().TransformFunctionTypeParams(
5737             TL.getBeginLoc(), TL.getParams(),
5738             TL.getTypePtr()->param_type_begin(),
5739             T->getExtParameterInfosOrNull(),
5740             ParamTypes, &ParamDecls, ExtParamInfos))
5741       return QualType();
5742   }
5743 
5744   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5745 
5746   bool EPIChanged = false;
5747   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5748     return QualType();
5749 
5750   // Handle extended parameter information.
5751   if (auto NewExtParamInfos =
5752         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5753     if (!EPI.ExtParameterInfos ||
5754         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5755           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5756       EPIChanged = true;
5757     }
5758     EPI.ExtParameterInfos = NewExtParamInfos;
5759   } else if (EPI.ExtParameterInfos) {
5760     EPIChanged = true;
5761     EPI.ExtParameterInfos = nullptr;
5762   }
5763 
5764   QualType Result = TL.getType();
5765   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5766       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5767     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5768     if (Result.isNull())
5769       return QualType();
5770   }
5771 
5772   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5773   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5774   NewTL.setLParenLoc(TL.getLParenLoc());
5775   NewTL.setRParenLoc(TL.getRParenLoc());
5776   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5777   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5778   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5779     NewTL.setParam(i, ParamDecls[i]);
5780 
5781   return Result;
5782 }
5783 
5784 template<typename Derived>
5785 bool TreeTransform<Derived>::TransformExceptionSpec(
5786     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5787     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5788   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5789 
5790   // Instantiate a dynamic noexcept expression, if any.
5791   if (isComputedNoexcept(ESI.Type)) {
5792     EnterExpressionEvaluationContext Unevaluated(
5793         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5794     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5795     if (NoexceptExpr.isInvalid())
5796       return true;
5797 
5798     ExceptionSpecificationType EST = ESI.Type;
5799     NoexceptExpr =
5800         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5801     if (NoexceptExpr.isInvalid())
5802       return true;
5803 
5804     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5805       Changed = true;
5806     ESI.NoexceptExpr = NoexceptExpr.get();
5807     ESI.Type = EST;
5808   }
5809 
5810   if (ESI.Type != EST_Dynamic)
5811     return false;
5812 
5813   // Instantiate a dynamic exception specification's type.
5814   for (QualType T : ESI.Exceptions) {
5815     if (const PackExpansionType *PackExpansion =
5816             T->getAs<PackExpansionType>()) {
5817       Changed = true;
5818 
5819       // We have a pack expansion. Instantiate it.
5820       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5821       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5822                                               Unexpanded);
5823       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5824 
5825       // Determine whether the set of unexpanded parameter packs can and
5826       // should
5827       // be expanded.
5828       bool Expand = false;
5829       bool RetainExpansion = false;
5830       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5831       // FIXME: Track the location of the ellipsis (and track source location
5832       // information for the types in the exception specification in general).
5833       if (getDerived().TryExpandParameterPacks(
5834               Loc, SourceRange(), Unexpanded, Expand,
5835               RetainExpansion, NumExpansions))
5836         return true;
5837 
5838       if (!Expand) {
5839         // We can't expand this pack expansion into separate arguments yet;
5840         // just substitute into the pattern and create a new pack expansion
5841         // type.
5842         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5843         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5844         if (U.isNull())
5845           return true;
5846 
5847         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5848         Exceptions.push_back(U);
5849         continue;
5850       }
5851 
5852       // Substitute into the pack expansion pattern for each slice of the
5853       // pack.
5854       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5855         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5856 
5857         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5858         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5859           return true;
5860 
5861         Exceptions.push_back(U);
5862       }
5863     } else {
5864       QualType U = getDerived().TransformType(T);
5865       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5866         return true;
5867       if (T != U)
5868         Changed = true;
5869 
5870       Exceptions.push_back(U);
5871     }
5872   }
5873 
5874   ESI.Exceptions = Exceptions;
5875   if (ESI.Exceptions.empty())
5876     ESI.Type = EST_DynamicNone;
5877   return false;
5878 }
5879 
5880 template<typename Derived>
5881 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5882                                                  TypeLocBuilder &TLB,
5883                                                  FunctionNoProtoTypeLoc TL) {
5884   const FunctionNoProtoType *T = TL.getTypePtr();
5885   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5886   if (ResultType.isNull())
5887     return QualType();
5888 
5889   QualType Result = TL.getType();
5890   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5891     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5892 
5893   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5894   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5895   NewTL.setLParenLoc(TL.getLParenLoc());
5896   NewTL.setRParenLoc(TL.getRParenLoc());
5897   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5898 
5899   return Result;
5900 }
5901 
5902 template<typename Derived> QualType
5903 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5904                                                  UnresolvedUsingTypeLoc TL) {
5905   const UnresolvedUsingType *T = TL.getTypePtr();
5906   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5907   if (!D)
5908     return QualType();
5909 
5910   QualType Result = TL.getType();
5911   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5912     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5913     if (Result.isNull())
5914       return QualType();
5915   }
5916 
5917   // We might get an arbitrary type spec type back.  We should at
5918   // least always get a type spec type, though.
5919   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5920   NewTL.setNameLoc(TL.getNameLoc());
5921 
5922   return Result;
5923 }
5924 
5925 template<typename Derived>
5926 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5927                                                       TypedefTypeLoc TL) {
5928   const TypedefType *T = TL.getTypePtr();
5929   TypedefNameDecl *Typedef
5930     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5931                                                                T->getDecl()));
5932   if (!Typedef)
5933     return QualType();
5934 
5935   QualType Result = TL.getType();
5936   if (getDerived().AlwaysRebuild() ||
5937       Typedef != T->getDecl()) {
5938     Result = getDerived().RebuildTypedefType(Typedef);
5939     if (Result.isNull())
5940       return QualType();
5941   }
5942 
5943   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5944   NewTL.setNameLoc(TL.getNameLoc());
5945 
5946   return Result;
5947 }
5948 
5949 template<typename Derived>
5950 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5951                                                       TypeOfExprTypeLoc TL) {
5952   // typeof expressions are not potentially evaluated contexts
5953   EnterExpressionEvaluationContext Unevaluated(
5954       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5955       Sema::ReuseLambdaContextDecl);
5956 
5957   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5958   if (E.isInvalid())
5959     return QualType();
5960 
5961   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5962   if (E.isInvalid())
5963     return QualType();
5964 
5965   QualType Result = TL.getType();
5966   if (getDerived().AlwaysRebuild() ||
5967       E.get() != TL.getUnderlyingExpr()) {
5968     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5969     if (Result.isNull())
5970       return QualType();
5971   }
5972   else E.get();
5973 
5974   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5975   NewTL.setTypeofLoc(TL.getTypeofLoc());
5976   NewTL.setLParenLoc(TL.getLParenLoc());
5977   NewTL.setRParenLoc(TL.getRParenLoc());
5978 
5979   return Result;
5980 }
5981 
5982 template<typename Derived>
5983 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5984                                                      TypeOfTypeLoc TL) {
5985   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5986   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5987   if (!New_Under_TI)
5988     return QualType();
5989 
5990   QualType Result = TL.getType();
5991   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5992     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5993     if (Result.isNull())
5994       return QualType();
5995   }
5996 
5997   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5998   NewTL.setTypeofLoc(TL.getTypeofLoc());
5999   NewTL.setLParenLoc(TL.getLParenLoc());
6000   NewTL.setRParenLoc(TL.getRParenLoc());
6001   NewTL.setUnderlyingTInfo(New_Under_TI);
6002 
6003   return Result;
6004 }
6005 
6006 template<typename Derived>
6007 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6008                                                        DecltypeTypeLoc TL) {
6009   const DecltypeType *T = TL.getTypePtr();
6010 
6011   // decltype expressions are not potentially evaluated contexts
6012   EnterExpressionEvaluationContext Unevaluated(
6013       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6014       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6015 
6016   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6017   if (E.isInvalid())
6018     return QualType();
6019 
6020   E = getSema().ActOnDecltypeExpression(E.get());
6021   if (E.isInvalid())
6022     return QualType();
6023 
6024   QualType Result = TL.getType();
6025   if (getDerived().AlwaysRebuild() ||
6026       E.get() != T->getUnderlyingExpr()) {
6027     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6028     if (Result.isNull())
6029       return QualType();
6030   }
6031   else E.get();
6032 
6033   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6034   NewTL.setNameLoc(TL.getNameLoc());
6035 
6036   return Result;
6037 }
6038 
6039 template<typename Derived>
6040 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6041                                                             TypeLocBuilder &TLB,
6042                                                      UnaryTransformTypeLoc TL) {
6043   QualType Result = TL.getType();
6044   if (Result->isDependentType()) {
6045     const UnaryTransformType *T = TL.getTypePtr();
6046     QualType NewBase =
6047       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6048     Result = getDerived().RebuildUnaryTransformType(NewBase,
6049                                                     T->getUTTKind(),
6050                                                     TL.getKWLoc());
6051     if (Result.isNull())
6052       return QualType();
6053   }
6054 
6055   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6056   NewTL.setKWLoc(TL.getKWLoc());
6057   NewTL.setParensRange(TL.getParensRange());
6058   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6059   return Result;
6060 }
6061 
6062 template<typename Derived>
6063 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6064     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6065   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6066 
6067   CXXScopeSpec SS;
6068   TemplateName TemplateName = getDerived().TransformTemplateName(
6069       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6070   if (TemplateName.isNull())
6071     return QualType();
6072 
6073   QualType OldDeduced = T->getDeducedType();
6074   QualType NewDeduced;
6075   if (!OldDeduced.isNull()) {
6076     NewDeduced = getDerived().TransformType(OldDeduced);
6077     if (NewDeduced.isNull())
6078       return QualType();
6079   }
6080 
6081   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6082       TemplateName, NewDeduced);
6083   if (Result.isNull())
6084     return QualType();
6085 
6086   DeducedTemplateSpecializationTypeLoc NewTL =
6087       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6088   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6089 
6090   return Result;
6091 }
6092 
6093 template<typename Derived>
6094 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6095                                                      RecordTypeLoc TL) {
6096   const RecordType *T = TL.getTypePtr();
6097   RecordDecl *Record
6098     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6099                                                           T->getDecl()));
6100   if (!Record)
6101     return QualType();
6102 
6103   QualType Result = TL.getType();
6104   if (getDerived().AlwaysRebuild() ||
6105       Record != T->getDecl()) {
6106     Result = getDerived().RebuildRecordType(Record);
6107     if (Result.isNull())
6108       return QualType();
6109   }
6110 
6111   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6112   NewTL.setNameLoc(TL.getNameLoc());
6113 
6114   return Result;
6115 }
6116 
6117 template<typename Derived>
6118 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6119                                                    EnumTypeLoc TL) {
6120   const EnumType *T = TL.getTypePtr();
6121   EnumDecl *Enum
6122     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6123                                                         T->getDecl()));
6124   if (!Enum)
6125     return QualType();
6126 
6127   QualType Result = TL.getType();
6128   if (getDerived().AlwaysRebuild() ||
6129       Enum != T->getDecl()) {
6130     Result = getDerived().RebuildEnumType(Enum);
6131     if (Result.isNull())
6132       return QualType();
6133   }
6134 
6135   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6136   NewTL.setNameLoc(TL.getNameLoc());
6137 
6138   return Result;
6139 }
6140 
6141 template<typename Derived>
6142 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6143                                          TypeLocBuilder &TLB,
6144                                          InjectedClassNameTypeLoc TL) {
6145   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6146                                        TL.getTypePtr()->getDecl());
6147   if (!D) return QualType();
6148 
6149   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6150   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6151   return T;
6152 }
6153 
6154 template<typename Derived>
6155 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6156                                                 TypeLocBuilder &TLB,
6157                                                 TemplateTypeParmTypeLoc TL) {
6158   return TransformTypeSpecType(TLB, TL);
6159 }
6160 
6161 template<typename Derived>
6162 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6163                                          TypeLocBuilder &TLB,
6164                                          SubstTemplateTypeParmTypeLoc TL) {
6165   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6166 
6167   // Substitute into the replacement type, which itself might involve something
6168   // that needs to be transformed. This only tends to occur with default
6169   // template arguments of template template parameters.
6170   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6171   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6172   if (Replacement.isNull())
6173     return QualType();
6174 
6175   // Always canonicalize the replacement type.
6176   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6177   QualType Result
6178     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6179                                                    Replacement);
6180 
6181   // Propagate type-source information.
6182   SubstTemplateTypeParmTypeLoc NewTL
6183     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6184   NewTL.setNameLoc(TL.getNameLoc());
6185   return Result;
6186 
6187 }
6188 
6189 template<typename Derived>
6190 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6191                                           TypeLocBuilder &TLB,
6192                                           SubstTemplateTypeParmPackTypeLoc TL) {
6193   return TransformTypeSpecType(TLB, TL);
6194 }
6195 
6196 template<typename Derived>
6197 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6198                                                         TypeLocBuilder &TLB,
6199                                            TemplateSpecializationTypeLoc TL) {
6200   const TemplateSpecializationType *T = TL.getTypePtr();
6201 
6202   // The nested-name-specifier never matters in a TemplateSpecializationType,
6203   // because we can't have a dependent nested-name-specifier anyway.
6204   CXXScopeSpec SS;
6205   TemplateName Template
6206     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6207                                          TL.getTemplateNameLoc());
6208   if (Template.isNull())
6209     return QualType();
6210 
6211   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6212 }
6213 
6214 template<typename Derived>
6215 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6216                                                      AtomicTypeLoc TL) {
6217   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6218   if (ValueType.isNull())
6219     return QualType();
6220 
6221   QualType Result = TL.getType();
6222   if (getDerived().AlwaysRebuild() ||
6223       ValueType != TL.getValueLoc().getType()) {
6224     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6225     if (Result.isNull())
6226       return QualType();
6227   }
6228 
6229   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6230   NewTL.setKWLoc(TL.getKWLoc());
6231   NewTL.setLParenLoc(TL.getLParenLoc());
6232   NewTL.setRParenLoc(TL.getRParenLoc());
6233 
6234   return Result;
6235 }
6236 
6237 template <typename Derived>
6238 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6239                                                    PipeTypeLoc TL) {
6240   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6241   if (ValueType.isNull())
6242     return QualType();
6243 
6244   QualType Result = TL.getType();
6245   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6246     const PipeType *PT = Result->castAs<PipeType>();
6247     bool isReadPipe = PT->isReadOnly();
6248     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6249     if (Result.isNull())
6250       return QualType();
6251   }
6252 
6253   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6254   NewTL.setKWLoc(TL.getKWLoc());
6255 
6256   return Result;
6257 }
6258 
6259 template <typename Derived>
6260 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6261                                                      ExtIntTypeLoc TL) {
6262   const ExtIntType *EIT = TL.getTypePtr();
6263   QualType Result = TL.getType();
6264 
6265   if (getDerived().AlwaysRebuild()) {
6266     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6267                                             EIT->getNumBits(), TL.getNameLoc());
6268     if (Result.isNull())
6269       return QualType();
6270   }
6271 
6272   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6273   NewTL.setNameLoc(TL.getNameLoc());
6274   return Result;
6275 }
6276 
6277 template <typename Derived>
6278 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6279     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6280   const DependentExtIntType *EIT = TL.getTypePtr();
6281 
6282   EnterExpressionEvaluationContext Unevaluated(
6283       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6284   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6285   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6286 
6287   if (BitsExpr.isInvalid())
6288     return QualType();
6289 
6290   QualType Result = TL.getType();
6291 
6292   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6293     Result = getDerived().RebuildDependentExtIntType(
6294         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6295 
6296     if (Result.isNull())
6297       return QualType();
6298   }
6299 
6300   if (isa<DependentExtIntType>(Result)) {
6301     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6302     NewTL.setNameLoc(TL.getNameLoc());
6303   } else {
6304     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6305     NewTL.setNameLoc(TL.getNameLoc());
6306   }
6307   return Result;
6308 }
6309 
6310   /// Simple iterator that traverses the template arguments in a
6311   /// container that provides a \c getArgLoc() member function.
6312   ///
6313   /// This iterator is intended to be used with the iterator form of
6314   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6315   template<typename ArgLocContainer>
6316   class TemplateArgumentLocContainerIterator {
6317     ArgLocContainer *Container;
6318     unsigned Index;
6319 
6320   public:
6321     typedef TemplateArgumentLoc value_type;
6322     typedef TemplateArgumentLoc reference;
6323     typedef int difference_type;
6324     typedef std::input_iterator_tag iterator_category;
6325 
6326     class pointer {
6327       TemplateArgumentLoc Arg;
6328 
6329     public:
6330       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6331 
6332       const TemplateArgumentLoc *operator->() const {
6333         return &Arg;
6334       }
6335     };
6336 
6337 
6338     TemplateArgumentLocContainerIterator() {}
6339 
6340     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6341                                  unsigned Index)
6342       : Container(&Container), Index(Index) { }
6343 
6344     TemplateArgumentLocContainerIterator &operator++() {
6345       ++Index;
6346       return *this;
6347     }
6348 
6349     TemplateArgumentLocContainerIterator operator++(int) {
6350       TemplateArgumentLocContainerIterator Old(*this);
6351       ++(*this);
6352       return Old;
6353     }
6354 
6355     TemplateArgumentLoc operator*() const {
6356       return Container->getArgLoc(Index);
6357     }
6358 
6359     pointer operator->() const {
6360       return pointer(Container->getArgLoc(Index));
6361     }
6362 
6363     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6364                            const TemplateArgumentLocContainerIterator &Y) {
6365       return X.Container == Y.Container && X.Index == Y.Index;
6366     }
6367 
6368     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6369                            const TemplateArgumentLocContainerIterator &Y) {
6370       return !(X == Y);
6371     }
6372   };
6373 
6374 template<typename Derived>
6375 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6376                                                    AutoTypeLoc TL) {
6377   const AutoType *T = TL.getTypePtr();
6378   QualType OldDeduced = T->getDeducedType();
6379   QualType NewDeduced;
6380   if (!OldDeduced.isNull()) {
6381     NewDeduced = getDerived().TransformType(OldDeduced);
6382     if (NewDeduced.isNull())
6383       return QualType();
6384   }
6385 
6386   ConceptDecl *NewCD = nullptr;
6387   TemplateArgumentListInfo NewTemplateArgs;
6388   NestedNameSpecifierLoc NewNestedNameSpec;
6389   if (TL.getTypePtr()->isConstrained()) {
6390     NewCD = cast_or_null<ConceptDecl>(
6391         getDerived().TransformDecl(
6392             TL.getConceptNameLoc(),
6393             TL.getTypePtr()->getTypeConstraintConcept()));
6394 
6395     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6396     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6397     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6398     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6399                                                 ArgIterator(TL,
6400                                                             TL.getNumArgs()),
6401                                                 NewTemplateArgs))
6402       return QualType();
6403 
6404     if (TL.getNestedNameSpecifierLoc()) {
6405       NewNestedNameSpec
6406         = getDerived().TransformNestedNameSpecifierLoc(
6407             TL.getNestedNameSpecifierLoc());
6408       if (!NewNestedNameSpec)
6409         return QualType();
6410     }
6411   }
6412 
6413   QualType Result = TL.getType();
6414   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6415       T->isDependentType()) {
6416     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6417     NewArgList.reserve(NewArgList.size());
6418     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6419       NewArgList.push_back(ArgLoc.getArgument());
6420     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6421                                           NewArgList);
6422     if (Result.isNull())
6423       return QualType();
6424   }
6425 
6426   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6427   NewTL.setNameLoc(TL.getNameLoc());
6428   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6429   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6430   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6431   NewTL.setFoundDecl(TL.getFoundDecl());
6432   NewTL.setLAngleLoc(TL.getLAngleLoc());
6433   NewTL.setRAngleLoc(TL.getRAngleLoc());
6434   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6435     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6436 
6437   return Result;
6438 }
6439 
6440 template <typename Derived>
6441 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6442                                                         TypeLocBuilder &TLB,
6443                                            TemplateSpecializationTypeLoc TL,
6444                                                       TemplateName Template) {
6445   TemplateArgumentListInfo NewTemplateArgs;
6446   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6447   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6448   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6449     ArgIterator;
6450   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6451                                               ArgIterator(TL, TL.getNumArgs()),
6452                                               NewTemplateArgs))
6453     return QualType();
6454 
6455   // FIXME: maybe don't rebuild if all the template arguments are the same.
6456 
6457   QualType Result =
6458     getDerived().RebuildTemplateSpecializationType(Template,
6459                                                    TL.getTemplateNameLoc(),
6460                                                    NewTemplateArgs);
6461 
6462   if (!Result.isNull()) {
6463     // Specializations of template template parameters are represented as
6464     // TemplateSpecializationTypes, and substitution of type alias templates
6465     // within a dependent context can transform them into
6466     // DependentTemplateSpecializationTypes.
6467     if (isa<DependentTemplateSpecializationType>(Result)) {
6468       DependentTemplateSpecializationTypeLoc NewTL
6469         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6470       NewTL.setElaboratedKeywordLoc(SourceLocation());
6471       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6472       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6473       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6474       NewTL.setLAngleLoc(TL.getLAngleLoc());
6475       NewTL.setRAngleLoc(TL.getRAngleLoc());
6476       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6477         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6478       return Result;
6479     }
6480 
6481     TemplateSpecializationTypeLoc NewTL
6482       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6483     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6484     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6485     NewTL.setLAngleLoc(TL.getLAngleLoc());
6486     NewTL.setRAngleLoc(TL.getRAngleLoc());
6487     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6488       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6489   }
6490 
6491   return Result;
6492 }
6493 
6494 template <typename Derived>
6495 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6496                                      TypeLocBuilder &TLB,
6497                                      DependentTemplateSpecializationTypeLoc TL,
6498                                      TemplateName Template,
6499                                      CXXScopeSpec &SS) {
6500   TemplateArgumentListInfo NewTemplateArgs;
6501   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6502   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6503   typedef TemplateArgumentLocContainerIterator<
6504             DependentTemplateSpecializationTypeLoc> ArgIterator;
6505   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6506                                               ArgIterator(TL, TL.getNumArgs()),
6507                                               NewTemplateArgs))
6508     return QualType();
6509 
6510   // FIXME: maybe don't rebuild if all the template arguments are the same.
6511 
6512   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6513     QualType Result
6514       = getSema().Context.getDependentTemplateSpecializationType(
6515                                                 TL.getTypePtr()->getKeyword(),
6516                                                          DTN->getQualifier(),
6517                                                          DTN->getIdentifier(),
6518                                                                NewTemplateArgs);
6519 
6520     DependentTemplateSpecializationTypeLoc NewTL
6521       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6522     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6523     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6524     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6525     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6526     NewTL.setLAngleLoc(TL.getLAngleLoc());
6527     NewTL.setRAngleLoc(TL.getRAngleLoc());
6528     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6529       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6530     return Result;
6531   }
6532 
6533   QualType Result
6534     = getDerived().RebuildTemplateSpecializationType(Template,
6535                                                      TL.getTemplateNameLoc(),
6536                                                      NewTemplateArgs);
6537 
6538   if (!Result.isNull()) {
6539     /// FIXME: Wrap this in an elaborated-type-specifier?
6540     TemplateSpecializationTypeLoc NewTL
6541       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6542     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6543     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6544     NewTL.setLAngleLoc(TL.getLAngleLoc());
6545     NewTL.setRAngleLoc(TL.getRAngleLoc());
6546     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6547       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6548   }
6549 
6550   return Result;
6551 }
6552 
6553 template<typename Derived>
6554 QualType
6555 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6556                                                 ElaboratedTypeLoc TL) {
6557   const ElaboratedType *T = TL.getTypePtr();
6558 
6559   NestedNameSpecifierLoc QualifierLoc;
6560   // NOTE: the qualifier in an ElaboratedType is optional.
6561   if (TL.getQualifierLoc()) {
6562     QualifierLoc
6563       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6564     if (!QualifierLoc)
6565       return QualType();
6566   }
6567 
6568   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6569   if (NamedT.isNull())
6570     return QualType();
6571 
6572   // C++0x [dcl.type.elab]p2:
6573   //   If the identifier resolves to a typedef-name or the simple-template-id
6574   //   resolves to an alias template specialization, the
6575   //   elaborated-type-specifier is ill-formed.
6576   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6577     if (const TemplateSpecializationType *TST =
6578           NamedT->getAs<TemplateSpecializationType>()) {
6579       TemplateName Template = TST->getTemplateName();
6580       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6581               Template.getAsTemplateDecl())) {
6582         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6583                      diag::err_tag_reference_non_tag)
6584             << TAT << Sema::NTK_TypeAliasTemplate
6585             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6586         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6587       }
6588     }
6589   }
6590 
6591   QualType Result = TL.getType();
6592   if (getDerived().AlwaysRebuild() ||
6593       QualifierLoc != TL.getQualifierLoc() ||
6594       NamedT != T->getNamedType()) {
6595     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6596                                                 T->getKeyword(),
6597                                                 QualifierLoc, NamedT);
6598     if (Result.isNull())
6599       return QualType();
6600   }
6601 
6602   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6603   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6604   NewTL.setQualifierLoc(QualifierLoc);
6605   return Result;
6606 }
6607 
6608 template<typename Derived>
6609 QualType TreeTransform<Derived>::TransformAttributedType(
6610                                                 TypeLocBuilder &TLB,
6611                                                 AttributedTypeLoc TL) {
6612   const AttributedType *oldType = TL.getTypePtr();
6613   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6614   if (modifiedType.isNull())
6615     return QualType();
6616 
6617   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6618   const Attr *oldAttr = TL.getAttr();
6619   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6620   if (oldAttr && !newAttr)
6621     return QualType();
6622 
6623   QualType result = TL.getType();
6624 
6625   // FIXME: dependent operand expressions?
6626   if (getDerived().AlwaysRebuild() ||
6627       modifiedType != oldType->getModifiedType()) {
6628     // TODO: this is really lame; we should really be rebuilding the
6629     // equivalent type from first principles.
6630     QualType equivalentType
6631       = getDerived().TransformType(oldType->getEquivalentType());
6632     if (equivalentType.isNull())
6633       return QualType();
6634 
6635     // Check whether we can add nullability; it is only represented as
6636     // type sugar, and therefore cannot be diagnosed in any other way.
6637     if (auto nullability = oldType->getImmediateNullability()) {
6638       if (!modifiedType->canHaveNullability()) {
6639         SemaRef.Diag(TL.getAttr()->getLocation(),
6640                      diag::err_nullability_nonpointer)
6641             << DiagNullabilityKind(*nullability, false) << modifiedType;
6642         return QualType();
6643       }
6644     }
6645 
6646     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6647                                                modifiedType,
6648                                                equivalentType);
6649   }
6650 
6651   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6652   newTL.setAttr(newAttr);
6653   return result;
6654 }
6655 
6656 template<typename Derived>
6657 QualType
6658 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6659                                            ParenTypeLoc TL) {
6660   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6661   if (Inner.isNull())
6662     return QualType();
6663 
6664   QualType Result = TL.getType();
6665   if (getDerived().AlwaysRebuild() ||
6666       Inner != TL.getInnerLoc().getType()) {
6667     Result = getDerived().RebuildParenType(Inner);
6668     if (Result.isNull())
6669       return QualType();
6670   }
6671 
6672   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6673   NewTL.setLParenLoc(TL.getLParenLoc());
6674   NewTL.setRParenLoc(TL.getRParenLoc());
6675   return Result;
6676 }
6677 
6678 template <typename Derived>
6679 QualType
6680 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6681                                                     MacroQualifiedTypeLoc TL) {
6682   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6683   if (Inner.isNull())
6684     return QualType();
6685 
6686   QualType Result = TL.getType();
6687   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6688     Result =
6689         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6690     if (Result.isNull())
6691       return QualType();
6692   }
6693 
6694   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6695   NewTL.setExpansionLoc(TL.getExpansionLoc());
6696   return Result;
6697 }
6698 
6699 template<typename Derived>
6700 QualType TreeTransform<Derived>::TransformDependentNameType(
6701     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6702   return TransformDependentNameType(TLB, TL, false);
6703 }
6704 
6705 template<typename Derived>
6706 QualType TreeTransform<Derived>::TransformDependentNameType(
6707     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6708   const DependentNameType *T = TL.getTypePtr();
6709 
6710   NestedNameSpecifierLoc QualifierLoc
6711     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6712   if (!QualifierLoc)
6713     return QualType();
6714 
6715   QualType Result
6716     = getDerived().RebuildDependentNameType(T->getKeyword(),
6717                                             TL.getElaboratedKeywordLoc(),
6718                                             QualifierLoc,
6719                                             T->getIdentifier(),
6720                                             TL.getNameLoc(),
6721                                             DeducedTSTContext);
6722   if (Result.isNull())
6723     return QualType();
6724 
6725   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6726     QualType NamedT = ElabT->getNamedType();
6727     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6728 
6729     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6730     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6731     NewTL.setQualifierLoc(QualifierLoc);
6732   } else {
6733     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6734     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6735     NewTL.setQualifierLoc(QualifierLoc);
6736     NewTL.setNameLoc(TL.getNameLoc());
6737   }
6738   return Result;
6739 }
6740 
6741 template<typename Derived>
6742 QualType TreeTransform<Derived>::
6743           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6744                                  DependentTemplateSpecializationTypeLoc TL) {
6745   NestedNameSpecifierLoc QualifierLoc;
6746   if (TL.getQualifierLoc()) {
6747     QualifierLoc
6748       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6749     if (!QualifierLoc)
6750       return QualType();
6751   }
6752 
6753   return getDerived()
6754            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6755 }
6756 
6757 template<typename Derived>
6758 QualType TreeTransform<Derived>::
6759 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6760                                    DependentTemplateSpecializationTypeLoc TL,
6761                                        NestedNameSpecifierLoc QualifierLoc) {
6762   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6763 
6764   TemplateArgumentListInfo NewTemplateArgs;
6765   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6766   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6767 
6768   typedef TemplateArgumentLocContainerIterator<
6769   DependentTemplateSpecializationTypeLoc> ArgIterator;
6770   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6771                                               ArgIterator(TL, TL.getNumArgs()),
6772                                               NewTemplateArgs))
6773     return QualType();
6774 
6775   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6776       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6777       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6778       /*AllowInjectedClassName*/ false);
6779   if (Result.isNull())
6780     return QualType();
6781 
6782   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6783     QualType NamedT = ElabT->getNamedType();
6784 
6785     // Copy information relevant to the template specialization.
6786     TemplateSpecializationTypeLoc NamedTL
6787       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6788     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6789     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6790     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6791     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6792     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6793       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6794 
6795     // Copy information relevant to the elaborated type.
6796     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6797     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6798     NewTL.setQualifierLoc(QualifierLoc);
6799   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6800     DependentTemplateSpecializationTypeLoc SpecTL
6801       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6802     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6803     SpecTL.setQualifierLoc(QualifierLoc);
6804     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6805     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6806     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6807     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6808     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6809       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6810   } else {
6811     TemplateSpecializationTypeLoc SpecTL
6812       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6813     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6814     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6815     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6816     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6817     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6818       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6819   }
6820   return Result;
6821 }
6822 
6823 template<typename Derived>
6824 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6825                                                       PackExpansionTypeLoc TL) {
6826   QualType Pattern
6827     = getDerived().TransformType(TLB, TL.getPatternLoc());
6828   if (Pattern.isNull())
6829     return QualType();
6830 
6831   QualType Result = TL.getType();
6832   if (getDerived().AlwaysRebuild() ||
6833       Pattern != TL.getPatternLoc().getType()) {
6834     Result = getDerived().RebuildPackExpansionType(Pattern,
6835                                            TL.getPatternLoc().getSourceRange(),
6836                                                    TL.getEllipsisLoc(),
6837                                            TL.getTypePtr()->getNumExpansions());
6838     if (Result.isNull())
6839       return QualType();
6840   }
6841 
6842   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6843   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6844   return Result;
6845 }
6846 
6847 template<typename Derived>
6848 QualType
6849 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6850                                                    ObjCInterfaceTypeLoc TL) {
6851   // ObjCInterfaceType is never dependent.
6852   TLB.pushFullCopy(TL);
6853   return TL.getType();
6854 }
6855 
6856 template<typename Derived>
6857 QualType
6858 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6859                                                    ObjCTypeParamTypeLoc TL) {
6860   const ObjCTypeParamType *T = TL.getTypePtr();
6861   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6862       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6863   if (!OTP)
6864     return QualType();
6865 
6866   QualType Result = TL.getType();
6867   if (getDerived().AlwaysRebuild() ||
6868       OTP != T->getDecl()) {
6869     Result = getDerived().RebuildObjCTypeParamType(OTP,
6870                  TL.getProtocolLAngleLoc(),
6871                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6872                                     TL.getNumProtocols()),
6873                  TL.getProtocolLocs(),
6874                  TL.getProtocolRAngleLoc());
6875     if (Result.isNull())
6876       return QualType();
6877   }
6878 
6879   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6880   if (TL.getNumProtocols()) {
6881     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6882     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6883       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6884     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6885   }
6886   return Result;
6887 }
6888 
6889 template<typename Derived>
6890 QualType
6891 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6892                                                 ObjCObjectTypeLoc TL) {
6893   // Transform base type.
6894   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6895   if (BaseType.isNull())
6896     return QualType();
6897 
6898   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6899 
6900   // Transform type arguments.
6901   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6902   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6903     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6904     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6905     QualType TypeArg = TypeArgInfo->getType();
6906     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6907       AnyChanged = true;
6908 
6909       // We have a pack expansion. Instantiate it.
6910       const auto *PackExpansion = PackExpansionLoc.getType()
6911                                     ->castAs<PackExpansionType>();
6912       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6913       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6914                                               Unexpanded);
6915       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6916 
6917       // Determine whether the set of unexpanded parameter packs can
6918       // and should be expanded.
6919       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6920       bool Expand = false;
6921       bool RetainExpansion = false;
6922       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6923       if (getDerived().TryExpandParameterPacks(
6924             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6925             Unexpanded, Expand, RetainExpansion, NumExpansions))
6926         return QualType();
6927 
6928       if (!Expand) {
6929         // We can't expand this pack expansion into separate arguments yet;
6930         // just substitute into the pattern and create a new pack expansion
6931         // type.
6932         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6933 
6934         TypeLocBuilder TypeArgBuilder;
6935         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6936         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6937                                                              PatternLoc);
6938         if (NewPatternType.isNull())
6939           return QualType();
6940 
6941         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6942                                       NewPatternType, NumExpansions);
6943         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6944         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6945         NewTypeArgInfos.push_back(
6946           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6947         continue;
6948       }
6949 
6950       // Substitute into the pack expansion pattern for each slice of the
6951       // pack.
6952       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6953         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6954 
6955         TypeLocBuilder TypeArgBuilder;
6956         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6957 
6958         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6959                                                          PatternLoc);
6960         if (NewTypeArg.isNull())
6961           return QualType();
6962 
6963         NewTypeArgInfos.push_back(
6964           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6965       }
6966 
6967       continue;
6968     }
6969 
6970     TypeLocBuilder TypeArgBuilder;
6971     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6972     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6973     if (NewTypeArg.isNull())
6974       return QualType();
6975 
6976     // If nothing changed, just keep the old TypeSourceInfo.
6977     if (NewTypeArg == TypeArg) {
6978       NewTypeArgInfos.push_back(TypeArgInfo);
6979       continue;
6980     }
6981 
6982     NewTypeArgInfos.push_back(
6983       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6984     AnyChanged = true;
6985   }
6986 
6987   QualType Result = TL.getType();
6988   if (getDerived().AlwaysRebuild() || AnyChanged) {
6989     // Rebuild the type.
6990     Result = getDerived().RebuildObjCObjectType(
6991         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6992         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6993         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6994         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6995 
6996     if (Result.isNull())
6997       return QualType();
6998   }
6999 
7000   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7001   NewT.setHasBaseTypeAsWritten(true);
7002   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7003   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7004     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7005   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7006   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7007   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7008     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7009   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7010   return Result;
7011 }
7012 
7013 template<typename Derived>
7014 QualType
7015 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7016                                                ObjCObjectPointerTypeLoc TL) {
7017   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7018   if (PointeeType.isNull())
7019     return QualType();
7020 
7021   QualType Result = TL.getType();
7022   if (getDerived().AlwaysRebuild() ||
7023       PointeeType != TL.getPointeeLoc().getType()) {
7024     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7025                                                        TL.getStarLoc());
7026     if (Result.isNull())
7027       return QualType();
7028   }
7029 
7030   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7031   NewT.setStarLoc(TL.getStarLoc());
7032   return Result;
7033 }
7034 
7035 //===----------------------------------------------------------------------===//
7036 // Statement transformation
7037 //===----------------------------------------------------------------------===//
7038 template<typename Derived>
7039 StmtResult
7040 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7041   return S;
7042 }
7043 
7044 template<typename Derived>
7045 StmtResult
7046 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7047   return getDerived().TransformCompoundStmt(S, false);
7048 }
7049 
7050 template<typename Derived>
7051 StmtResult
7052 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7053                                               bool IsStmtExpr) {
7054   Sema::CompoundScopeRAII CompoundScope(getSema());
7055 
7056   const Stmt *ExprResult = S->getStmtExprResult();
7057   bool SubStmtInvalid = false;
7058   bool SubStmtChanged = false;
7059   SmallVector<Stmt*, 8> Statements;
7060   for (auto *B : S->body()) {
7061     StmtResult Result = getDerived().TransformStmt(
7062         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7063 
7064     if (Result.isInvalid()) {
7065       // Immediately fail if this was a DeclStmt, since it's very
7066       // likely that this will cause problems for future statements.
7067       if (isa<DeclStmt>(B))
7068         return StmtError();
7069 
7070       // Otherwise, just keep processing substatements and fail later.
7071       SubStmtInvalid = true;
7072       continue;
7073     }
7074 
7075     SubStmtChanged = SubStmtChanged || Result.get() != B;
7076     Statements.push_back(Result.getAs<Stmt>());
7077   }
7078 
7079   if (SubStmtInvalid)
7080     return StmtError();
7081 
7082   if (!getDerived().AlwaysRebuild() &&
7083       !SubStmtChanged)
7084     return S;
7085 
7086   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7087                                           Statements,
7088                                           S->getRBracLoc(),
7089                                           IsStmtExpr);
7090 }
7091 
7092 template<typename Derived>
7093 StmtResult
7094 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7095   ExprResult LHS, RHS;
7096   {
7097     EnterExpressionEvaluationContext Unevaluated(
7098         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7099 
7100     // Transform the left-hand case value.
7101     LHS = getDerived().TransformExpr(S->getLHS());
7102     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7103     if (LHS.isInvalid())
7104       return StmtError();
7105 
7106     // Transform the right-hand case value (for the GNU case-range extension).
7107     RHS = getDerived().TransformExpr(S->getRHS());
7108     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7109     if (RHS.isInvalid())
7110       return StmtError();
7111   }
7112 
7113   // Build the case statement.
7114   // Case statements are always rebuilt so that they will attached to their
7115   // transformed switch statement.
7116   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7117                                                        LHS.get(),
7118                                                        S->getEllipsisLoc(),
7119                                                        RHS.get(),
7120                                                        S->getColonLoc());
7121   if (Case.isInvalid())
7122     return StmtError();
7123 
7124   // Transform the statement following the case
7125   StmtResult SubStmt =
7126       getDerived().TransformStmt(S->getSubStmt());
7127   if (SubStmt.isInvalid())
7128     return StmtError();
7129 
7130   // Attach the body to the case statement
7131   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7132 }
7133 
7134 template <typename Derived>
7135 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7136   // Transform the statement following the default case
7137   StmtResult SubStmt =
7138       getDerived().TransformStmt(S->getSubStmt());
7139   if (SubStmt.isInvalid())
7140     return StmtError();
7141 
7142   // Default statements are always rebuilt
7143   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7144                                          SubStmt.get());
7145 }
7146 
7147 template<typename Derived>
7148 StmtResult
7149 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7150   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7151   if (SubStmt.isInvalid())
7152     return StmtError();
7153 
7154   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7155                                         S->getDecl());
7156   if (!LD)
7157     return StmtError();
7158 
7159   // If we're transforming "in-place" (we're not creating new local
7160   // declarations), assume we're replacing the old label statement
7161   // and clear out the reference to it.
7162   if (LD == S->getDecl())
7163     S->getDecl()->setStmt(nullptr);
7164 
7165   // FIXME: Pass the real colon location in.
7166   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7167                                        cast<LabelDecl>(LD), SourceLocation(),
7168                                        SubStmt.get());
7169 }
7170 
7171 template <typename Derived>
7172 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7173   if (!R)
7174     return R;
7175 
7176   switch (R->getKind()) {
7177 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7178 #define ATTR(X)
7179 #define PRAGMA_SPELLING_ATTR(X)                                                \
7180   case attr::X:                                                                \
7181     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7182 #include "clang/Basic/AttrList.inc"
7183   default:
7184     return R;
7185   }
7186 }
7187 
7188 template <typename Derived>
7189 StmtResult
7190 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7191                                                 StmtDiscardKind SDK) {
7192   bool AttrsChanged = false;
7193   SmallVector<const Attr *, 1> Attrs;
7194 
7195   // Visit attributes and keep track if any are transformed.
7196   for (const auto *I : S->getAttrs()) {
7197     const Attr *R = getDerived().TransformAttr(I);
7198     AttrsChanged |= (I != R);
7199     Attrs.push_back(R);
7200   }
7201 
7202   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7203   if (SubStmt.isInvalid())
7204     return StmtError();
7205 
7206   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7207     return S;
7208 
7209   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7210                                             SubStmt.get());
7211 }
7212 
7213 template<typename Derived>
7214 StmtResult
7215 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7216   // Transform the initialization statement
7217   StmtResult Init = getDerived().TransformStmt(S->getInit());
7218   if (Init.isInvalid())
7219     return StmtError();
7220 
7221   // Transform the condition
7222   Sema::ConditionResult Cond = getDerived().TransformCondition(
7223       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7224       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7225                        : Sema::ConditionKind::Boolean);
7226   if (Cond.isInvalid())
7227     return StmtError();
7228 
7229   // If this is a constexpr if, determine which arm we should instantiate.
7230   llvm::Optional<bool> ConstexprConditionValue;
7231   if (S->isConstexpr())
7232     ConstexprConditionValue = Cond.getKnownValue();
7233 
7234   // Transform the "then" branch.
7235   StmtResult Then;
7236   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7237     Then = getDerived().TransformStmt(S->getThen());
7238     if (Then.isInvalid())
7239       return StmtError();
7240   } else {
7241     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7242   }
7243 
7244   // Transform the "else" branch.
7245   StmtResult Else;
7246   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7247     Else = getDerived().TransformStmt(S->getElse());
7248     if (Else.isInvalid())
7249       return StmtError();
7250   }
7251 
7252   if (!getDerived().AlwaysRebuild() &&
7253       Init.get() == S->getInit() &&
7254       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7255       Then.get() == S->getThen() &&
7256       Else.get() == S->getElse())
7257     return S;
7258 
7259   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
7260                                     Init.get(), Then.get(), S->getElseLoc(),
7261                                     Else.get());
7262 }
7263 
7264 template<typename Derived>
7265 StmtResult
7266 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7267   // Transform the initialization statement
7268   StmtResult Init = getDerived().TransformStmt(S->getInit());
7269   if (Init.isInvalid())
7270     return StmtError();
7271 
7272   // Transform the condition.
7273   Sema::ConditionResult Cond = getDerived().TransformCondition(
7274       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7275       Sema::ConditionKind::Switch);
7276   if (Cond.isInvalid())
7277     return StmtError();
7278 
7279   // Rebuild the switch statement.
7280   StmtResult Switch
7281     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
7282   if (Switch.isInvalid())
7283     return StmtError();
7284 
7285   // Transform the body of the switch statement.
7286   StmtResult Body = getDerived().TransformStmt(S->getBody());
7287   if (Body.isInvalid())
7288     return StmtError();
7289 
7290   // Complete the switch statement.
7291   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7292                                             Body.get());
7293 }
7294 
7295 template<typename Derived>
7296 StmtResult
7297 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7298   // Transform the condition
7299   Sema::ConditionResult Cond = getDerived().TransformCondition(
7300       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7301       Sema::ConditionKind::Boolean);
7302   if (Cond.isInvalid())
7303     return StmtError();
7304 
7305   // Transform the body
7306   StmtResult Body = getDerived().TransformStmt(S->getBody());
7307   if (Body.isInvalid())
7308     return StmtError();
7309 
7310   if (!getDerived().AlwaysRebuild() &&
7311       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7312       Body.get() == S->getBody())
7313     return Owned(S);
7314 
7315   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
7316 }
7317 
7318 template<typename Derived>
7319 StmtResult
7320 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7321   // Transform the body
7322   StmtResult Body = getDerived().TransformStmt(S->getBody());
7323   if (Body.isInvalid())
7324     return StmtError();
7325 
7326   // Transform the condition
7327   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7328   if (Cond.isInvalid())
7329     return StmtError();
7330 
7331   if (!getDerived().AlwaysRebuild() &&
7332       Cond.get() == S->getCond() &&
7333       Body.get() == S->getBody())
7334     return S;
7335 
7336   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7337                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7338                                     S->getRParenLoc());
7339 }
7340 
7341 template<typename Derived>
7342 StmtResult
7343 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7344   if (getSema().getLangOpts().OpenMP)
7345     getSema().startOpenMPLoop();
7346 
7347   // Transform the initialization statement
7348   StmtResult Init = getDerived().TransformStmt(S->getInit());
7349   if (Init.isInvalid())
7350     return StmtError();
7351 
7352   // In OpenMP loop region loop control variable must be captured and be
7353   // private. Perform analysis of first part (if any).
7354   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7355     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7356 
7357   // Transform the condition
7358   Sema::ConditionResult Cond = getDerived().TransformCondition(
7359       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7360       Sema::ConditionKind::Boolean);
7361   if (Cond.isInvalid())
7362     return StmtError();
7363 
7364   // Transform the increment
7365   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7366   if (Inc.isInvalid())
7367     return StmtError();
7368 
7369   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7370   if (S->getInc() && !FullInc.get())
7371     return StmtError();
7372 
7373   // Transform the body
7374   StmtResult Body = getDerived().TransformStmt(S->getBody());
7375   if (Body.isInvalid())
7376     return StmtError();
7377 
7378   if (!getDerived().AlwaysRebuild() &&
7379       Init.get() == S->getInit() &&
7380       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7381       Inc.get() == S->getInc() &&
7382       Body.get() == S->getBody())
7383     return S;
7384 
7385   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7386                                      Init.get(), Cond, FullInc,
7387                                      S->getRParenLoc(), Body.get());
7388 }
7389 
7390 template<typename Derived>
7391 StmtResult
7392 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7393   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7394                                         S->getLabel());
7395   if (!LD)
7396     return StmtError();
7397 
7398   // Goto statements must always be rebuilt, to resolve the label.
7399   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7400                                       cast<LabelDecl>(LD));
7401 }
7402 
7403 template<typename Derived>
7404 StmtResult
7405 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7406   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7407   if (Target.isInvalid())
7408     return StmtError();
7409   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7410 
7411   if (!getDerived().AlwaysRebuild() &&
7412       Target.get() == S->getTarget())
7413     return S;
7414 
7415   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7416                                               Target.get());
7417 }
7418 
7419 template<typename Derived>
7420 StmtResult
7421 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7422   return S;
7423 }
7424 
7425 template<typename Derived>
7426 StmtResult
7427 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7428   return S;
7429 }
7430 
7431 template<typename Derived>
7432 StmtResult
7433 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7434   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7435                                                         /*NotCopyInit*/false);
7436   if (Result.isInvalid())
7437     return StmtError();
7438 
7439   // FIXME: We always rebuild the return statement because there is no way
7440   // to tell whether the return type of the function has changed.
7441   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7442 }
7443 
7444 template<typename Derived>
7445 StmtResult
7446 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7447   bool DeclChanged = false;
7448   SmallVector<Decl *, 4> Decls;
7449   for (auto *D : S->decls()) {
7450     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7451     if (!Transformed)
7452       return StmtError();
7453 
7454     if (Transformed != D)
7455       DeclChanged = true;
7456 
7457     Decls.push_back(Transformed);
7458   }
7459 
7460   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7461     return S;
7462 
7463   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7464 }
7465 
7466 template<typename Derived>
7467 StmtResult
7468 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7469 
7470   SmallVector<Expr*, 8> Constraints;
7471   SmallVector<Expr*, 8> Exprs;
7472   SmallVector<IdentifierInfo *, 4> Names;
7473 
7474   ExprResult AsmString;
7475   SmallVector<Expr*, 8> Clobbers;
7476 
7477   bool ExprsChanged = false;
7478 
7479   // Go through the outputs.
7480   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7481     Names.push_back(S->getOutputIdentifier(I));
7482 
7483     // No need to transform the constraint literal.
7484     Constraints.push_back(S->getOutputConstraintLiteral(I));
7485 
7486     // Transform the output expr.
7487     Expr *OutputExpr = S->getOutputExpr(I);
7488     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7489     if (Result.isInvalid())
7490       return StmtError();
7491 
7492     ExprsChanged |= Result.get() != OutputExpr;
7493 
7494     Exprs.push_back(Result.get());
7495   }
7496 
7497   // Go through the inputs.
7498   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7499     Names.push_back(S->getInputIdentifier(I));
7500 
7501     // No need to transform the constraint literal.
7502     Constraints.push_back(S->getInputConstraintLiteral(I));
7503 
7504     // Transform the input expr.
7505     Expr *InputExpr = S->getInputExpr(I);
7506     ExprResult Result = getDerived().TransformExpr(InputExpr);
7507     if (Result.isInvalid())
7508       return StmtError();
7509 
7510     ExprsChanged |= Result.get() != InputExpr;
7511 
7512     Exprs.push_back(Result.get());
7513   }
7514 
7515   // Go through the Labels.
7516   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7517     Names.push_back(S->getLabelIdentifier(I));
7518 
7519     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7520     if (Result.isInvalid())
7521       return StmtError();
7522     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7523     Exprs.push_back(Result.get());
7524   }
7525   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7526     return S;
7527 
7528   // Go through the clobbers.
7529   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7530     Clobbers.push_back(S->getClobberStringLiteral(I));
7531 
7532   // No need to transform the asm string literal.
7533   AsmString = S->getAsmString();
7534   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7535                                         S->isVolatile(), S->getNumOutputs(),
7536                                         S->getNumInputs(), Names.data(),
7537                                         Constraints, Exprs, AsmString.get(),
7538                                         Clobbers, S->getNumLabels(),
7539                                         S->getRParenLoc());
7540 }
7541 
7542 template<typename Derived>
7543 StmtResult
7544 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7545   ArrayRef<Token> AsmToks =
7546     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7547 
7548   bool HadError = false, HadChange = false;
7549 
7550   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7551   SmallVector<Expr*, 8> TransformedExprs;
7552   TransformedExprs.reserve(SrcExprs.size());
7553   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7554     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7555     if (!Result.isUsable()) {
7556       HadError = true;
7557     } else {
7558       HadChange |= (Result.get() != SrcExprs[i]);
7559       TransformedExprs.push_back(Result.get());
7560     }
7561   }
7562 
7563   if (HadError) return StmtError();
7564   if (!HadChange && !getDerived().AlwaysRebuild())
7565     return Owned(S);
7566 
7567   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7568                                        AsmToks, S->getAsmString(),
7569                                        S->getNumOutputs(), S->getNumInputs(),
7570                                        S->getAllConstraints(), S->getClobbers(),
7571                                        TransformedExprs, S->getEndLoc());
7572 }
7573 
7574 // C++ Coroutines TS
7575 
7576 template<typename Derived>
7577 StmtResult
7578 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7579   auto *ScopeInfo = SemaRef.getCurFunction();
7580   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7581   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7582          ScopeInfo->NeedsCoroutineSuspends &&
7583          ScopeInfo->CoroutineSuspends.first == nullptr &&
7584          ScopeInfo->CoroutineSuspends.second == nullptr &&
7585          "expected clean scope info");
7586 
7587   // Set that we have (possibly-invalid) suspend points before we do anything
7588   // that may fail.
7589   ScopeInfo->setNeedsCoroutineSuspends(false);
7590 
7591   // We re-build the coroutine promise object (and the coroutine parameters its
7592   // type and constructor depend on) based on the types used in our current
7593   // function. We must do so, and set it on the current FunctionScopeInfo,
7594   // before attempting to transform the other parts of the coroutine body
7595   // statement, such as the implicit suspend statements (because those
7596   // statements reference the FunctionScopeInfo::CoroutinePromise).
7597   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7598     return StmtError();
7599   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7600   if (!Promise)
7601     return StmtError();
7602   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7603   ScopeInfo->CoroutinePromise = Promise;
7604 
7605   // Transform the implicit coroutine statements constructed using dependent
7606   // types during the previous parse: initial and final suspensions, the return
7607   // object, and others. We also transform the coroutine function's body.
7608   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7609   if (InitSuspend.isInvalid())
7610     return StmtError();
7611   StmtResult FinalSuspend =
7612       getDerived().TransformStmt(S->getFinalSuspendStmt());
7613   if (FinalSuspend.isInvalid())
7614     return StmtError();
7615   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7616   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7617 
7618   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7619   if (BodyRes.isInvalid())
7620     return StmtError();
7621 
7622   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7623   if (Builder.isInvalid())
7624     return StmtError();
7625 
7626   Expr *ReturnObject = S->getReturnValueInit();
7627   assert(ReturnObject && "the return object is expected to be valid");
7628   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7629                                                      /*NoCopyInit*/ false);
7630   if (Res.isInvalid())
7631     return StmtError();
7632   Builder.ReturnValue = Res.get();
7633 
7634   // If during the previous parse the coroutine still had a dependent promise
7635   // statement, we may need to build some implicit coroutine statements
7636   // (such as exception and fallthrough handlers) for the first time.
7637   if (S->hasDependentPromiseType()) {
7638     // We can only build these statements, however, if the current promise type
7639     // is not dependent.
7640     if (!Promise->getType()->isDependentType()) {
7641       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7642              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7643              "these nodes should not have been built yet");
7644       if (!Builder.buildDependentStatements())
7645         return StmtError();
7646     }
7647   } else {
7648     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7649       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7650       if (Res.isInvalid())
7651         return StmtError();
7652       Builder.OnFallthrough = Res.get();
7653     }
7654 
7655     if (auto *OnException = S->getExceptionHandler()) {
7656       StmtResult Res = getDerived().TransformStmt(OnException);
7657       if (Res.isInvalid())
7658         return StmtError();
7659       Builder.OnException = Res.get();
7660     }
7661 
7662     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7663       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7664       if (Res.isInvalid())
7665         return StmtError();
7666       Builder.ReturnStmtOnAllocFailure = Res.get();
7667     }
7668 
7669     // Transform any additional statements we may have already built
7670     assert(S->getAllocate() && S->getDeallocate() &&
7671            "allocation and deallocation calls must already be built");
7672     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7673     if (AllocRes.isInvalid())
7674       return StmtError();
7675     Builder.Allocate = AllocRes.get();
7676 
7677     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7678     if (DeallocRes.isInvalid())
7679       return StmtError();
7680     Builder.Deallocate = DeallocRes.get();
7681 
7682     assert(S->getResultDecl() && "ResultDecl must already be built");
7683     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7684     if (ResultDecl.isInvalid())
7685       return StmtError();
7686     Builder.ResultDecl = ResultDecl.get();
7687 
7688     if (auto *ReturnStmt = S->getReturnStmt()) {
7689       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7690       if (Res.isInvalid())
7691         return StmtError();
7692       Builder.ReturnStmt = Res.get();
7693     }
7694   }
7695 
7696   return getDerived().RebuildCoroutineBodyStmt(Builder);
7697 }
7698 
7699 template<typename Derived>
7700 StmtResult
7701 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7702   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7703                                                         /*NotCopyInit*/false);
7704   if (Result.isInvalid())
7705     return StmtError();
7706 
7707   // Always rebuild; we don't know if this needs to be injected into a new
7708   // context or if the promise type has changed.
7709   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7710                                           S->isImplicit());
7711 }
7712 
7713 template<typename Derived>
7714 ExprResult
7715 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7716   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7717                                                         /*NotCopyInit*/false);
7718   if (Result.isInvalid())
7719     return ExprError();
7720 
7721   // Always rebuild; we don't know if this needs to be injected into a new
7722   // context or if the promise type has changed.
7723   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7724                                          E->isImplicit());
7725 }
7726 
7727 template <typename Derived>
7728 ExprResult
7729 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7730   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7731                                                         /*NotCopyInit*/ false);
7732   if (OperandResult.isInvalid())
7733     return ExprError();
7734 
7735   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7736           E->getOperatorCoawaitLookup());
7737 
7738   if (LookupResult.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().RebuildDependentCoawaitExpr(
7744       E->getKeywordLoc(), OperandResult.get(),
7745       cast<UnresolvedLookupExpr>(LookupResult.get()));
7746 }
7747 
7748 template<typename Derived>
7749 ExprResult
7750 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7751   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7752                                                         /*NotCopyInit*/false);
7753   if (Result.isInvalid())
7754     return ExprError();
7755 
7756   // Always rebuild; we don't know if this needs to be injected into a new
7757   // context or if the promise type has changed.
7758   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7759 }
7760 
7761 // Objective-C Statements.
7762 
7763 template<typename Derived>
7764 StmtResult
7765 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7766   // Transform the body of the @try.
7767   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7768   if (TryBody.isInvalid())
7769     return StmtError();
7770 
7771   // Transform the @catch statements (if present).
7772   bool AnyCatchChanged = false;
7773   SmallVector<Stmt*, 8> CatchStmts;
7774   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7775     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7776     if (Catch.isInvalid())
7777       return StmtError();
7778     if (Catch.get() != S->getCatchStmt(I))
7779       AnyCatchChanged = true;
7780     CatchStmts.push_back(Catch.get());
7781   }
7782 
7783   // Transform the @finally statement (if present).
7784   StmtResult Finally;
7785   if (S->getFinallyStmt()) {
7786     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7787     if (Finally.isInvalid())
7788       return StmtError();
7789   }
7790 
7791   // If nothing changed, just retain this statement.
7792   if (!getDerived().AlwaysRebuild() &&
7793       TryBody.get() == S->getTryBody() &&
7794       !AnyCatchChanged &&
7795       Finally.get() == S->getFinallyStmt())
7796     return S;
7797 
7798   // Build a new statement.
7799   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7800                                            CatchStmts, Finally.get());
7801 }
7802 
7803 template<typename Derived>
7804 StmtResult
7805 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7806   // Transform the @catch parameter, if there is one.
7807   VarDecl *Var = nullptr;
7808   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7809     TypeSourceInfo *TSInfo = nullptr;
7810     if (FromVar->getTypeSourceInfo()) {
7811       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7812       if (!TSInfo)
7813         return StmtError();
7814     }
7815 
7816     QualType T;
7817     if (TSInfo)
7818       T = TSInfo->getType();
7819     else {
7820       T = getDerived().TransformType(FromVar->getType());
7821       if (T.isNull())
7822         return StmtError();
7823     }
7824 
7825     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7826     if (!Var)
7827       return StmtError();
7828   }
7829 
7830   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7831   if (Body.isInvalid())
7832     return StmtError();
7833 
7834   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7835                                              S->getRParenLoc(),
7836                                              Var, Body.get());
7837 }
7838 
7839 template<typename Derived>
7840 StmtResult
7841 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7842   // Transform the body.
7843   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7844   if (Body.isInvalid())
7845     return StmtError();
7846 
7847   // If nothing changed, just retain this statement.
7848   if (!getDerived().AlwaysRebuild() &&
7849       Body.get() == S->getFinallyBody())
7850     return S;
7851 
7852   // Build a new statement.
7853   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7854                                                Body.get());
7855 }
7856 
7857 template<typename Derived>
7858 StmtResult
7859 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7860   ExprResult Operand;
7861   if (S->getThrowExpr()) {
7862     Operand = getDerived().TransformExpr(S->getThrowExpr());
7863     if (Operand.isInvalid())
7864       return StmtError();
7865   }
7866 
7867   if (!getDerived().AlwaysRebuild() &&
7868       Operand.get() == S->getThrowExpr())
7869     return S;
7870 
7871   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7872 }
7873 
7874 template<typename Derived>
7875 StmtResult
7876 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7877                                                   ObjCAtSynchronizedStmt *S) {
7878   // Transform the object we are locking.
7879   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7880   if (Object.isInvalid())
7881     return StmtError();
7882   Object =
7883     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7884                                                   Object.get());
7885   if (Object.isInvalid())
7886     return StmtError();
7887 
7888   // Transform the body.
7889   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7890   if (Body.isInvalid())
7891     return StmtError();
7892 
7893   // If nothing change, just retain the current statement.
7894   if (!getDerived().AlwaysRebuild() &&
7895       Object.get() == S->getSynchExpr() &&
7896       Body.get() == S->getSynchBody())
7897     return S;
7898 
7899   // Build a new statement.
7900   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7901                                                     Object.get(), Body.get());
7902 }
7903 
7904 template<typename Derived>
7905 StmtResult
7906 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7907                                               ObjCAutoreleasePoolStmt *S) {
7908   // Transform the body.
7909   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7910   if (Body.isInvalid())
7911     return StmtError();
7912 
7913   // If nothing changed, just retain this statement.
7914   if (!getDerived().AlwaysRebuild() &&
7915       Body.get() == S->getSubStmt())
7916     return S;
7917 
7918   // Build a new statement.
7919   return getDerived().RebuildObjCAutoreleasePoolStmt(
7920                         S->getAtLoc(), Body.get());
7921 }
7922 
7923 template<typename Derived>
7924 StmtResult
7925 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7926                                                   ObjCForCollectionStmt *S) {
7927   // Transform the element statement.
7928   StmtResult Element =
7929       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7930   if (Element.isInvalid())
7931     return StmtError();
7932 
7933   // Transform the collection expression.
7934   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7935   if (Collection.isInvalid())
7936     return StmtError();
7937 
7938   // Transform the body.
7939   StmtResult Body = getDerived().TransformStmt(S->getBody());
7940   if (Body.isInvalid())
7941     return StmtError();
7942 
7943   // If nothing changed, just retain this statement.
7944   if (!getDerived().AlwaysRebuild() &&
7945       Element.get() == S->getElement() &&
7946       Collection.get() == S->getCollection() &&
7947       Body.get() == S->getBody())
7948     return S;
7949 
7950   // Build a new statement.
7951   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7952                                                    Element.get(),
7953                                                    Collection.get(),
7954                                                    S->getRParenLoc(),
7955                                                    Body.get());
7956 }
7957 
7958 template <typename Derived>
7959 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7960   // Transform the exception declaration, if any.
7961   VarDecl *Var = nullptr;
7962   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7963     TypeSourceInfo *T =
7964         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7965     if (!T)
7966       return StmtError();
7967 
7968     Var = getDerived().RebuildExceptionDecl(
7969         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7970         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7971     if (!Var || Var->isInvalidDecl())
7972       return StmtError();
7973   }
7974 
7975   // Transform the actual exception handler.
7976   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7977   if (Handler.isInvalid())
7978     return StmtError();
7979 
7980   if (!getDerived().AlwaysRebuild() && !Var &&
7981       Handler.get() == S->getHandlerBlock())
7982     return S;
7983 
7984   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7985 }
7986 
7987 template <typename Derived>
7988 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7989   // Transform the try block itself.
7990   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7991   if (TryBlock.isInvalid())
7992     return StmtError();
7993 
7994   // Transform the handlers.
7995   bool HandlerChanged = false;
7996   SmallVector<Stmt *, 8> Handlers;
7997   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7998     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7999     if (Handler.isInvalid())
8000       return StmtError();
8001 
8002     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8003     Handlers.push_back(Handler.getAs<Stmt>());
8004   }
8005 
8006   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8007       !HandlerChanged)
8008     return S;
8009 
8010   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8011                                         Handlers);
8012 }
8013 
8014 template<typename Derived>
8015 StmtResult
8016 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8017   StmtResult Init =
8018       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8019   if (Init.isInvalid())
8020     return StmtError();
8021 
8022   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8023   if (Range.isInvalid())
8024     return StmtError();
8025 
8026   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8027   if (Begin.isInvalid())
8028     return StmtError();
8029   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8030   if (End.isInvalid())
8031     return StmtError();
8032 
8033   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8034   if (Cond.isInvalid())
8035     return StmtError();
8036   if (Cond.get())
8037     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8038   if (Cond.isInvalid())
8039     return StmtError();
8040   if (Cond.get())
8041     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8042 
8043   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8044   if (Inc.isInvalid())
8045     return StmtError();
8046   if (Inc.get())
8047     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8048 
8049   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8050   if (LoopVar.isInvalid())
8051     return StmtError();
8052 
8053   StmtResult NewStmt = S;
8054   if (getDerived().AlwaysRebuild() ||
8055       Init.get() != S->getInit() ||
8056       Range.get() != S->getRangeStmt() ||
8057       Begin.get() != S->getBeginStmt() ||
8058       End.get() != S->getEndStmt() ||
8059       Cond.get() != S->getCond() ||
8060       Inc.get() != S->getInc() ||
8061       LoopVar.get() != S->getLoopVarStmt()) {
8062     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8063                                                   S->getCoawaitLoc(), Init.get(),
8064                                                   S->getColonLoc(), Range.get(),
8065                                                   Begin.get(), End.get(),
8066                                                   Cond.get(),
8067                                                   Inc.get(), LoopVar.get(),
8068                                                   S->getRParenLoc());
8069     if (NewStmt.isInvalid())
8070       return StmtError();
8071   }
8072 
8073   StmtResult Body = getDerived().TransformStmt(S->getBody());
8074   if (Body.isInvalid())
8075     return StmtError();
8076 
8077   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8078   // it now so we have a new statement to attach the body to.
8079   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8080     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8081                                                   S->getCoawaitLoc(), Init.get(),
8082                                                   S->getColonLoc(), Range.get(),
8083                                                   Begin.get(), End.get(),
8084                                                   Cond.get(),
8085                                                   Inc.get(), LoopVar.get(),
8086                                                   S->getRParenLoc());
8087     if (NewStmt.isInvalid())
8088       return StmtError();
8089   }
8090 
8091   if (NewStmt.get() == S)
8092     return S;
8093 
8094   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8095 }
8096 
8097 template<typename Derived>
8098 StmtResult
8099 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8100                                                     MSDependentExistsStmt *S) {
8101   // Transform the nested-name-specifier, if any.
8102   NestedNameSpecifierLoc QualifierLoc;
8103   if (S->getQualifierLoc()) {
8104     QualifierLoc
8105       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8106     if (!QualifierLoc)
8107       return StmtError();
8108   }
8109 
8110   // Transform the declaration name.
8111   DeclarationNameInfo NameInfo = S->getNameInfo();
8112   if (NameInfo.getName()) {
8113     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8114     if (!NameInfo.getName())
8115       return StmtError();
8116   }
8117 
8118   // Check whether anything changed.
8119   if (!getDerived().AlwaysRebuild() &&
8120       QualifierLoc == S->getQualifierLoc() &&
8121       NameInfo.getName() == S->getNameInfo().getName())
8122     return S;
8123 
8124   // Determine whether this name exists, if we can.
8125   CXXScopeSpec SS;
8126   SS.Adopt(QualifierLoc);
8127   bool Dependent = false;
8128   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8129   case Sema::IER_Exists:
8130     if (S->isIfExists())
8131       break;
8132 
8133     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8134 
8135   case Sema::IER_DoesNotExist:
8136     if (S->isIfNotExists())
8137       break;
8138 
8139     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8140 
8141   case Sema::IER_Dependent:
8142     Dependent = true;
8143     break;
8144 
8145   case Sema::IER_Error:
8146     return StmtError();
8147   }
8148 
8149   // We need to continue with the instantiation, so do so now.
8150   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8151   if (SubStmt.isInvalid())
8152     return StmtError();
8153 
8154   // If we have resolved the name, just transform to the substatement.
8155   if (!Dependent)
8156     return SubStmt;
8157 
8158   // The name is still dependent, so build a dependent expression again.
8159   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8160                                                    S->isIfExists(),
8161                                                    QualifierLoc,
8162                                                    NameInfo,
8163                                                    SubStmt.get());
8164 }
8165 
8166 template<typename Derived>
8167 ExprResult
8168 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8169   NestedNameSpecifierLoc QualifierLoc;
8170   if (E->getQualifierLoc()) {
8171     QualifierLoc
8172     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8173     if (!QualifierLoc)
8174       return ExprError();
8175   }
8176 
8177   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8178     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8179   if (!PD)
8180     return ExprError();
8181 
8182   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8183   if (Base.isInvalid())
8184     return ExprError();
8185 
8186   return new (SemaRef.getASTContext())
8187       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8188                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8189                         QualifierLoc, E->getMemberLoc());
8190 }
8191 
8192 template <typename Derived>
8193 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8194     MSPropertySubscriptExpr *E) {
8195   auto BaseRes = getDerived().TransformExpr(E->getBase());
8196   if (BaseRes.isInvalid())
8197     return ExprError();
8198   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8199   if (IdxRes.isInvalid())
8200     return ExprError();
8201 
8202   if (!getDerived().AlwaysRebuild() &&
8203       BaseRes.get() == E->getBase() &&
8204       IdxRes.get() == E->getIdx())
8205     return E;
8206 
8207   return getDerived().RebuildArraySubscriptExpr(
8208       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8209 }
8210 
8211 template <typename Derived>
8212 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8213   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8214   if (TryBlock.isInvalid())
8215     return StmtError();
8216 
8217   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8218   if (Handler.isInvalid())
8219     return StmtError();
8220 
8221   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8222       Handler.get() == S->getHandler())
8223     return S;
8224 
8225   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8226                                         TryBlock.get(), Handler.get());
8227 }
8228 
8229 template <typename Derived>
8230 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8231   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8232   if (Block.isInvalid())
8233     return StmtError();
8234 
8235   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8236 }
8237 
8238 template <typename Derived>
8239 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8240   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8241   if (FilterExpr.isInvalid())
8242     return StmtError();
8243 
8244   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8245   if (Block.isInvalid())
8246     return StmtError();
8247 
8248   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8249                                            Block.get());
8250 }
8251 
8252 template <typename Derived>
8253 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8254   if (isa<SEHFinallyStmt>(Handler))
8255     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8256   else
8257     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8258 }
8259 
8260 template<typename Derived>
8261 StmtResult
8262 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8263   return S;
8264 }
8265 
8266 //===----------------------------------------------------------------------===//
8267 // OpenMP directive transformation
8268 //===----------------------------------------------------------------------===//
8269 template <typename Derived>
8270 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8271     OMPExecutableDirective *D) {
8272 
8273   // Transform the clauses
8274   llvm::SmallVector<OMPClause *, 16> TClauses;
8275   ArrayRef<OMPClause *> Clauses = D->clauses();
8276   TClauses.reserve(Clauses.size());
8277   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8278        I != E; ++I) {
8279     if (*I) {
8280       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8281       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8282       getDerived().getSema().EndOpenMPClause();
8283       if (Clause)
8284         TClauses.push_back(Clause);
8285     } else {
8286       TClauses.push_back(nullptr);
8287     }
8288   }
8289   StmtResult AssociatedStmt;
8290   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8291     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8292                                                   /*CurScope=*/nullptr);
8293     StmtResult Body;
8294     {
8295       Sema::CompoundScopeRAII CompoundScope(getSema());
8296       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8297       Body = getDerived().TransformStmt(CS);
8298     }
8299     AssociatedStmt =
8300         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8301     if (AssociatedStmt.isInvalid()) {
8302       return StmtError();
8303     }
8304   }
8305   if (TClauses.size() != Clauses.size()) {
8306     return StmtError();
8307   }
8308 
8309   // Transform directive name for 'omp critical' directive.
8310   DeclarationNameInfo DirName;
8311   if (D->getDirectiveKind() == OMPD_critical) {
8312     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8313     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8314   }
8315   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8316   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8317     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8318   } else if (D->getDirectiveKind() == OMPD_cancel) {
8319     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8320   }
8321 
8322   return getDerived().RebuildOMPExecutableDirective(
8323       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8324       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8325 }
8326 
8327 template <typename Derived>
8328 StmtResult
8329 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8330   DeclarationNameInfo DirName;
8331   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8332                                              D->getBeginLoc());
8333   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8334   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8335   return Res;
8336 }
8337 
8338 template <typename Derived>
8339 StmtResult
8340 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8341   DeclarationNameInfo DirName;
8342   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8343                                              D->getBeginLoc());
8344   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8345   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8346   return Res;
8347 }
8348 
8349 template <typename Derived>
8350 StmtResult
8351 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8352   DeclarationNameInfo DirName;
8353   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8354                                              D->getBeginLoc());
8355   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8356   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8357   return Res;
8358 }
8359 
8360 template <typename Derived>
8361 StmtResult
8362 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8363   DeclarationNameInfo DirName;
8364   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8365                                              D->getBeginLoc());
8366   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8367   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8368   return Res;
8369 }
8370 
8371 template <typename Derived>
8372 StmtResult
8373 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8374   DeclarationNameInfo DirName;
8375   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8376                                              D->getBeginLoc());
8377   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8378   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8379   return Res;
8380 }
8381 
8382 template <typename Derived>
8383 StmtResult
8384 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8385   DeclarationNameInfo DirName;
8386   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8387                                              D->getBeginLoc());
8388   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8389   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8390   return Res;
8391 }
8392 
8393 template <typename Derived>
8394 StmtResult
8395 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8396   DeclarationNameInfo DirName;
8397   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8398                                              D->getBeginLoc());
8399   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8400   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8401   return Res;
8402 }
8403 
8404 template <typename Derived>
8405 StmtResult
8406 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8407   DeclarationNameInfo DirName;
8408   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8409                                              D->getBeginLoc());
8410   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8411   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8412   return Res;
8413 }
8414 
8415 template <typename Derived>
8416 StmtResult
8417 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8418   getDerived().getSema().StartOpenMPDSABlock(
8419       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8420   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8421   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8422   return Res;
8423 }
8424 
8425 template <typename Derived>
8426 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8427     OMPParallelForDirective *D) {
8428   DeclarationNameInfo DirName;
8429   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8430                                              nullptr, D->getBeginLoc());
8431   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8432   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8433   return Res;
8434 }
8435 
8436 template <typename Derived>
8437 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8438     OMPParallelForSimdDirective *D) {
8439   DeclarationNameInfo DirName;
8440   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8441                                              nullptr, D->getBeginLoc());
8442   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8443   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8444   return Res;
8445 }
8446 
8447 template <typename Derived>
8448 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8449     OMPParallelMasterDirective *D) {
8450   DeclarationNameInfo DirName;
8451   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8452                                              nullptr, D->getBeginLoc());
8453   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8454   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8455   return Res;
8456 }
8457 
8458 template <typename Derived>
8459 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8460     OMPParallelSectionsDirective *D) {
8461   DeclarationNameInfo DirName;
8462   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8463                                              nullptr, D->getBeginLoc());
8464   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8465   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8466   return Res;
8467 }
8468 
8469 template <typename Derived>
8470 StmtResult
8471 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8472   DeclarationNameInfo DirName;
8473   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8474                                              D->getBeginLoc());
8475   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8476   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8477   return Res;
8478 }
8479 
8480 template <typename Derived>
8481 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8482     OMPTaskyieldDirective *D) {
8483   DeclarationNameInfo DirName;
8484   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8485                                              D->getBeginLoc());
8486   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8487   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8488   return Res;
8489 }
8490 
8491 template <typename Derived>
8492 StmtResult
8493 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8494   DeclarationNameInfo DirName;
8495   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8496                                              D->getBeginLoc());
8497   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8498   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8499   return Res;
8500 }
8501 
8502 template <typename Derived>
8503 StmtResult
8504 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8505   DeclarationNameInfo DirName;
8506   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8507                                              D->getBeginLoc());
8508   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8509   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8510   return Res;
8511 }
8512 
8513 template <typename Derived>
8514 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8515     OMPTaskgroupDirective *D) {
8516   DeclarationNameInfo DirName;
8517   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8518                                              D->getBeginLoc());
8519   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8520   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8521   return Res;
8522 }
8523 
8524 template <typename Derived>
8525 StmtResult
8526 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8527   DeclarationNameInfo DirName;
8528   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8529                                              D->getBeginLoc());
8530   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8531   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8532   return Res;
8533 }
8534 
8535 template <typename Derived>
8536 StmtResult
8537 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8538   DeclarationNameInfo DirName;
8539   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8540                                              D->getBeginLoc());
8541   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8542   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8543   return Res;
8544 }
8545 
8546 template <typename Derived>
8547 StmtResult
8548 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8549   DeclarationNameInfo DirName;
8550   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8551                                              D->getBeginLoc());
8552   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8553   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8554   return Res;
8555 }
8556 
8557 template <typename Derived>
8558 StmtResult
8559 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8560   DeclarationNameInfo DirName;
8561   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8562                                              D->getBeginLoc());
8563   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8564   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8565   return Res;
8566 }
8567 
8568 template <typename Derived>
8569 StmtResult
8570 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8571   DeclarationNameInfo DirName;
8572   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8573                                              D->getBeginLoc());
8574   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8575   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8576   return Res;
8577 }
8578 
8579 template <typename Derived>
8580 StmtResult
8581 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8582   DeclarationNameInfo DirName;
8583   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8584                                              D->getBeginLoc());
8585   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8586   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8587   return Res;
8588 }
8589 
8590 template <typename Derived>
8591 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8592     OMPTargetDataDirective *D) {
8593   DeclarationNameInfo DirName;
8594   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8595                                              D->getBeginLoc());
8596   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8597   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8598   return Res;
8599 }
8600 
8601 template <typename Derived>
8602 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8603     OMPTargetEnterDataDirective *D) {
8604   DeclarationNameInfo DirName;
8605   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8606                                              nullptr, D->getBeginLoc());
8607   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8608   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8609   return Res;
8610 }
8611 
8612 template <typename Derived>
8613 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8614     OMPTargetExitDataDirective *D) {
8615   DeclarationNameInfo DirName;
8616   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8617                                              nullptr, D->getBeginLoc());
8618   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8619   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8620   return Res;
8621 }
8622 
8623 template <typename Derived>
8624 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8625     OMPTargetParallelDirective *D) {
8626   DeclarationNameInfo DirName;
8627   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8628                                              nullptr, D->getBeginLoc());
8629   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8630   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8631   return Res;
8632 }
8633 
8634 template <typename Derived>
8635 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8636     OMPTargetParallelForDirective *D) {
8637   DeclarationNameInfo DirName;
8638   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8639                                              nullptr, D->getBeginLoc());
8640   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8641   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8642   return Res;
8643 }
8644 
8645 template <typename Derived>
8646 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8647     OMPTargetUpdateDirective *D) {
8648   DeclarationNameInfo DirName;
8649   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8650                                              nullptr, D->getBeginLoc());
8651   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8652   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8653   return Res;
8654 }
8655 
8656 template <typename Derived>
8657 StmtResult
8658 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8659   DeclarationNameInfo DirName;
8660   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8661                                              D->getBeginLoc());
8662   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8663   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8664   return Res;
8665 }
8666 
8667 template <typename Derived>
8668 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8669     OMPCancellationPointDirective *D) {
8670   DeclarationNameInfo DirName;
8671   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8672                                              nullptr, D->getBeginLoc());
8673   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8674   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8675   return Res;
8676 }
8677 
8678 template <typename Derived>
8679 StmtResult
8680 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8681   DeclarationNameInfo DirName;
8682   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8683                                              D->getBeginLoc());
8684   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8685   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8686   return Res;
8687 }
8688 
8689 template <typename Derived>
8690 StmtResult
8691 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8692   DeclarationNameInfo DirName;
8693   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8694                                              D->getBeginLoc());
8695   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8696   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8697   return Res;
8698 }
8699 
8700 template <typename Derived>
8701 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8702     OMPTaskLoopSimdDirective *D) {
8703   DeclarationNameInfo DirName;
8704   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8705                                              nullptr, D->getBeginLoc());
8706   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8707   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8708   return Res;
8709 }
8710 
8711 template <typename Derived>
8712 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8713     OMPMasterTaskLoopDirective *D) {
8714   DeclarationNameInfo DirName;
8715   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8716                                              nullptr, D->getBeginLoc());
8717   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8718   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8719   return Res;
8720 }
8721 
8722 template <typename Derived>
8723 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8724     OMPMasterTaskLoopSimdDirective *D) {
8725   DeclarationNameInfo DirName;
8726   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8727                                              nullptr, D->getBeginLoc());
8728   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8729   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8730   return Res;
8731 }
8732 
8733 template <typename Derived>
8734 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8735     OMPParallelMasterTaskLoopDirective *D) {
8736   DeclarationNameInfo DirName;
8737   getDerived().getSema().StartOpenMPDSABlock(
8738       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8739   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8740   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8741   return Res;
8742 }
8743 
8744 template <typename Derived>
8745 StmtResult
8746 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8747     OMPParallelMasterTaskLoopSimdDirective *D) {
8748   DeclarationNameInfo DirName;
8749   getDerived().getSema().StartOpenMPDSABlock(
8750       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8751   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8752   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8753   return Res;
8754 }
8755 
8756 template <typename Derived>
8757 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8758     OMPDistributeDirective *D) {
8759   DeclarationNameInfo DirName;
8760   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8761                                              D->getBeginLoc());
8762   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8763   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8764   return Res;
8765 }
8766 
8767 template <typename Derived>
8768 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8769     OMPDistributeParallelForDirective *D) {
8770   DeclarationNameInfo DirName;
8771   getDerived().getSema().StartOpenMPDSABlock(
8772       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8773   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8774   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8775   return Res;
8776 }
8777 
8778 template <typename Derived>
8779 StmtResult
8780 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8781     OMPDistributeParallelForSimdDirective *D) {
8782   DeclarationNameInfo DirName;
8783   getDerived().getSema().StartOpenMPDSABlock(
8784       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8785   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8786   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8787   return Res;
8788 }
8789 
8790 template <typename Derived>
8791 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8792     OMPDistributeSimdDirective *D) {
8793   DeclarationNameInfo DirName;
8794   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8795                                              nullptr, D->getBeginLoc());
8796   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8797   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8798   return Res;
8799 }
8800 
8801 template <typename Derived>
8802 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8803     OMPTargetParallelForSimdDirective *D) {
8804   DeclarationNameInfo DirName;
8805   getDerived().getSema().StartOpenMPDSABlock(
8806       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8807   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8808   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8809   return Res;
8810 }
8811 
8812 template <typename Derived>
8813 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8814     OMPTargetSimdDirective *D) {
8815   DeclarationNameInfo DirName;
8816   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8817                                              D->getBeginLoc());
8818   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8819   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8820   return Res;
8821 }
8822 
8823 template <typename Derived>
8824 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8825     OMPTeamsDistributeDirective *D) {
8826   DeclarationNameInfo DirName;
8827   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8828                                              nullptr, D->getBeginLoc());
8829   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8830   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8831   return Res;
8832 }
8833 
8834 template <typename Derived>
8835 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8836     OMPTeamsDistributeSimdDirective *D) {
8837   DeclarationNameInfo DirName;
8838   getDerived().getSema().StartOpenMPDSABlock(
8839       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8840   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8841   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8842   return Res;
8843 }
8844 
8845 template <typename Derived>
8846 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8847     OMPTeamsDistributeParallelForSimdDirective *D) {
8848   DeclarationNameInfo DirName;
8849   getDerived().getSema().StartOpenMPDSABlock(
8850       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8851       D->getBeginLoc());
8852   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8853   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8854   return Res;
8855 }
8856 
8857 template <typename Derived>
8858 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8859     OMPTeamsDistributeParallelForDirective *D) {
8860   DeclarationNameInfo DirName;
8861   getDerived().getSema().StartOpenMPDSABlock(
8862       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8863   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8864   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8865   return Res;
8866 }
8867 
8868 template <typename Derived>
8869 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8870     OMPTargetTeamsDirective *D) {
8871   DeclarationNameInfo DirName;
8872   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8873                                              nullptr, D->getBeginLoc());
8874   auto Res = getDerived().TransformOMPExecutableDirective(D);
8875   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8876   return Res;
8877 }
8878 
8879 template <typename Derived>
8880 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8881     OMPTargetTeamsDistributeDirective *D) {
8882   DeclarationNameInfo DirName;
8883   getDerived().getSema().StartOpenMPDSABlock(
8884       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8885   auto Res = getDerived().TransformOMPExecutableDirective(D);
8886   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8887   return Res;
8888 }
8889 
8890 template <typename Derived>
8891 StmtResult
8892 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8893     OMPTargetTeamsDistributeParallelForDirective *D) {
8894   DeclarationNameInfo DirName;
8895   getDerived().getSema().StartOpenMPDSABlock(
8896       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8897       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>::
8905     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8906         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8907   DeclarationNameInfo DirName;
8908   getDerived().getSema().StartOpenMPDSABlock(
8909       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8910       D->getBeginLoc());
8911   auto Res = getDerived().TransformOMPExecutableDirective(D);
8912   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8913   return Res;
8914 }
8915 
8916 template <typename Derived>
8917 StmtResult
8918 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8919     OMPTargetTeamsDistributeSimdDirective *D) {
8920   DeclarationNameInfo DirName;
8921   getDerived().getSema().StartOpenMPDSABlock(
8922       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8923   auto Res = getDerived().TransformOMPExecutableDirective(D);
8924   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8925   return Res;
8926 }
8927 
8928 
8929 //===----------------------------------------------------------------------===//
8930 // OpenMP clause transformation
8931 //===----------------------------------------------------------------------===//
8932 template <typename Derived>
8933 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8934   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8935   if (Cond.isInvalid())
8936     return nullptr;
8937   return getDerived().RebuildOMPIfClause(
8938       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8939       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8940 }
8941 
8942 template <typename Derived>
8943 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8944   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8945   if (Cond.isInvalid())
8946     return nullptr;
8947   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8948                                             C->getLParenLoc(), C->getEndLoc());
8949 }
8950 
8951 template <typename Derived>
8952 OMPClause *
8953 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8954   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8955   if (NumThreads.isInvalid())
8956     return nullptr;
8957   return getDerived().RebuildOMPNumThreadsClause(
8958       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8959 }
8960 
8961 template <typename Derived>
8962 OMPClause *
8963 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8964   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8965   if (E.isInvalid())
8966     return nullptr;
8967   return getDerived().RebuildOMPSafelenClause(
8968       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8969 }
8970 
8971 template <typename Derived>
8972 OMPClause *
8973 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8974   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8975   if (E.isInvalid())
8976     return nullptr;
8977   return getDerived().RebuildOMPAllocatorClause(
8978       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8979 }
8980 
8981 template <typename Derived>
8982 OMPClause *
8983 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8984   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8985   if (E.isInvalid())
8986     return nullptr;
8987   return getDerived().RebuildOMPSimdlenClause(
8988       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8989 }
8990 
8991 template <typename Derived>
8992 OMPClause *
8993 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8994   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8995   if (E.isInvalid())
8996     return nullptr;
8997   return getDerived().RebuildOMPCollapseClause(
8998       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8999 }
9000 
9001 template <typename Derived>
9002 OMPClause *
9003 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9004   return getDerived().RebuildOMPDefaultClause(
9005       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9006       C->getLParenLoc(), C->getEndLoc());
9007 }
9008 
9009 template <typename Derived>
9010 OMPClause *
9011 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9012   return getDerived().RebuildOMPProcBindClause(
9013       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9014       C->getLParenLoc(), C->getEndLoc());
9015 }
9016 
9017 template <typename Derived>
9018 OMPClause *
9019 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9020   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9021   if (E.isInvalid())
9022     return nullptr;
9023   return getDerived().RebuildOMPScheduleClause(
9024       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9025       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9026       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9027       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9028 }
9029 
9030 template <typename Derived>
9031 OMPClause *
9032 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9033   ExprResult E;
9034   if (auto *Num = C->getNumForLoops()) {
9035     E = getDerived().TransformExpr(Num);
9036     if (E.isInvalid())
9037       return nullptr;
9038   }
9039   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9040                                               C->getLParenLoc(), E.get());
9041 }
9042 
9043 template <typename Derived>
9044 OMPClause *
9045 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9046   ExprResult E;
9047   if (Expr *Evt = C->getEventHandler()) {
9048     E = getDerived().TransformExpr(Evt);
9049     if (E.isInvalid())
9050       return nullptr;
9051   }
9052   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9053                                              C->getLParenLoc(), C->getEndLoc());
9054 }
9055 
9056 template <typename Derived>
9057 OMPClause *
9058 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9059   // No need to rebuild this clause, no template-dependent parameters.
9060   return C;
9061 }
9062 
9063 template <typename Derived>
9064 OMPClause *
9065 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9066   // No need to rebuild this clause, no template-dependent parameters.
9067   return C;
9068 }
9069 
9070 template <typename Derived>
9071 OMPClause *
9072 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9073   // No need to rebuild this clause, no template-dependent parameters.
9074   return C;
9075 }
9076 
9077 template <typename Derived>
9078 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9079   // No need to rebuild this clause, no template-dependent parameters.
9080   return C;
9081 }
9082 
9083 template <typename Derived>
9084 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9085   // No need to rebuild this clause, no template-dependent parameters.
9086   return C;
9087 }
9088 
9089 template <typename Derived>
9090 OMPClause *
9091 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9092   // No need to rebuild this clause, no template-dependent parameters.
9093   return C;
9094 }
9095 
9096 template <typename Derived>
9097 OMPClause *
9098 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9099   // No need to rebuild this clause, no template-dependent parameters.
9100   return C;
9101 }
9102 
9103 template <typename Derived>
9104 OMPClause *
9105 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9106   // No need to rebuild this clause, no template-dependent parameters.
9107   return C;
9108 }
9109 
9110 template <typename Derived>
9111 OMPClause *
9112 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9113   // No need to rebuild this clause, no template-dependent parameters.
9114   return C;
9115 }
9116 
9117 template <typename Derived>
9118 OMPClause *
9119 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9120   // No need to rebuild this clause, no template-dependent parameters.
9121   return C;
9122 }
9123 
9124 template <typename Derived>
9125 OMPClause *
9126 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9127   // No need to rebuild this clause, no template-dependent parameters.
9128   return C;
9129 }
9130 
9131 template <typename Derived>
9132 OMPClause *
9133 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9134   // No need to rebuild this clause, no template-dependent parameters.
9135   return C;
9136 }
9137 
9138 template <typename Derived>
9139 OMPClause *
9140 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9141   // No need to rebuild this clause, no template-dependent parameters.
9142   return C;
9143 }
9144 
9145 template <typename Derived>
9146 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9147   // No need to rebuild this clause, no template-dependent parameters.
9148   return C;
9149 }
9150 
9151 template <typename Derived>
9152 OMPClause *
9153 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9154   // No need to rebuild this clause, no template-dependent parameters.
9155   return C;
9156 }
9157 
9158 template <typename Derived>
9159 OMPClause *
9160 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9161   // No need to rebuild this clause, no template-dependent parameters.
9162   return C;
9163 }
9164 
9165 template <typename Derived>
9166 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9167     OMPUnifiedAddressClause *C) {
9168   llvm_unreachable("unified_address clause cannot appear in dependent context");
9169 }
9170 
9171 template <typename Derived>
9172 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9173     OMPUnifiedSharedMemoryClause *C) {
9174   llvm_unreachable(
9175       "unified_shared_memory clause cannot appear in dependent context");
9176 }
9177 
9178 template <typename Derived>
9179 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9180     OMPReverseOffloadClause *C) {
9181   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9182 }
9183 
9184 template <typename Derived>
9185 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9186     OMPDynamicAllocatorsClause *C) {
9187   llvm_unreachable(
9188       "dynamic_allocators clause cannot appear in dependent context");
9189 }
9190 
9191 template <typename Derived>
9192 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9193     OMPAtomicDefaultMemOrderClause *C) {
9194   llvm_unreachable(
9195       "atomic_default_mem_order clause cannot appear in dependent context");
9196 }
9197 
9198 template <typename Derived>
9199 OMPClause *
9200 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9201   llvm::SmallVector<Expr *, 16> Vars;
9202   Vars.reserve(C->varlist_size());
9203   for (auto *VE : C->varlists()) {
9204     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9205     if (EVar.isInvalid())
9206       return nullptr;
9207     Vars.push_back(EVar.get());
9208   }
9209   return getDerived().RebuildOMPPrivateClause(
9210       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9211 }
9212 
9213 template <typename Derived>
9214 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9215     OMPFirstprivateClause *C) {
9216   llvm::SmallVector<Expr *, 16> Vars;
9217   Vars.reserve(C->varlist_size());
9218   for (auto *VE : C->varlists()) {
9219     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9220     if (EVar.isInvalid())
9221       return nullptr;
9222     Vars.push_back(EVar.get());
9223   }
9224   return getDerived().RebuildOMPFirstprivateClause(
9225       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9226 }
9227 
9228 template <typename Derived>
9229 OMPClause *
9230 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9231   llvm::SmallVector<Expr *, 16> Vars;
9232   Vars.reserve(C->varlist_size());
9233   for (auto *VE : C->varlists()) {
9234     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9235     if (EVar.isInvalid())
9236       return nullptr;
9237     Vars.push_back(EVar.get());
9238   }
9239   return getDerived().RebuildOMPLastprivateClause(
9240       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9241       C->getLParenLoc(), C->getEndLoc());
9242 }
9243 
9244 template <typename Derived>
9245 OMPClause *
9246 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9247   llvm::SmallVector<Expr *, 16> Vars;
9248   Vars.reserve(C->varlist_size());
9249   for (auto *VE : C->varlists()) {
9250     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9251     if (EVar.isInvalid())
9252       return nullptr;
9253     Vars.push_back(EVar.get());
9254   }
9255   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9256                                              C->getLParenLoc(), C->getEndLoc());
9257 }
9258 
9259 template <typename Derived>
9260 OMPClause *
9261 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9262   llvm::SmallVector<Expr *, 16> Vars;
9263   Vars.reserve(C->varlist_size());
9264   for (auto *VE : C->varlists()) {
9265     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9266     if (EVar.isInvalid())
9267       return nullptr;
9268     Vars.push_back(EVar.get());
9269   }
9270   CXXScopeSpec ReductionIdScopeSpec;
9271   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9272 
9273   DeclarationNameInfo NameInfo = C->getNameInfo();
9274   if (NameInfo.getName()) {
9275     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9276     if (!NameInfo.getName())
9277       return nullptr;
9278   }
9279   // Build a list of all UDR decls with the same names ranged by the Scopes.
9280   // The Scope boundary is a duplication of the previous decl.
9281   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9282   for (auto *E : C->reduction_ops()) {
9283     // Transform all the decls.
9284     if (E) {
9285       auto *ULE = cast<UnresolvedLookupExpr>(E);
9286       UnresolvedSet<8> Decls;
9287       for (auto *D : ULE->decls()) {
9288         NamedDecl *InstD =
9289             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9290         Decls.addDecl(InstD, InstD->getAccess());
9291       }
9292       UnresolvedReductions.push_back(
9293        UnresolvedLookupExpr::Create(
9294           SemaRef.Context, /*NamingClass=*/nullptr,
9295           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9296           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9297           Decls.begin(), Decls.end()));
9298     } else
9299       UnresolvedReductions.push_back(nullptr);
9300   }
9301   return getDerived().RebuildOMPReductionClause(
9302       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9303       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9304       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9305 }
9306 
9307 template <typename Derived>
9308 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9309     OMPTaskReductionClause *C) {
9310   llvm::SmallVector<Expr *, 16> Vars;
9311   Vars.reserve(C->varlist_size());
9312   for (auto *VE : C->varlists()) {
9313     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9314     if (EVar.isInvalid())
9315       return nullptr;
9316     Vars.push_back(EVar.get());
9317   }
9318   CXXScopeSpec ReductionIdScopeSpec;
9319   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9320 
9321   DeclarationNameInfo NameInfo = C->getNameInfo();
9322   if (NameInfo.getName()) {
9323     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9324     if (!NameInfo.getName())
9325       return nullptr;
9326   }
9327   // Build a list of all UDR decls with the same names ranged by the Scopes.
9328   // The Scope boundary is a duplication of the previous decl.
9329   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9330   for (auto *E : C->reduction_ops()) {
9331     // Transform all the decls.
9332     if (E) {
9333       auto *ULE = cast<UnresolvedLookupExpr>(E);
9334       UnresolvedSet<8> Decls;
9335       for (auto *D : ULE->decls()) {
9336         NamedDecl *InstD =
9337             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9338         Decls.addDecl(InstD, InstD->getAccess());
9339       }
9340       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9341           SemaRef.Context, /*NamingClass=*/nullptr,
9342           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9343           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9344     } else
9345       UnresolvedReductions.push_back(nullptr);
9346   }
9347   return getDerived().RebuildOMPTaskReductionClause(
9348       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9349       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9350 }
9351 
9352 template <typename Derived>
9353 OMPClause *
9354 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9355   llvm::SmallVector<Expr *, 16> Vars;
9356   Vars.reserve(C->varlist_size());
9357   for (auto *VE : C->varlists()) {
9358     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9359     if (EVar.isInvalid())
9360       return nullptr;
9361     Vars.push_back(EVar.get());
9362   }
9363   CXXScopeSpec ReductionIdScopeSpec;
9364   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9365 
9366   DeclarationNameInfo NameInfo = C->getNameInfo();
9367   if (NameInfo.getName()) {
9368     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9369     if (!NameInfo.getName())
9370       return nullptr;
9371   }
9372   // Build a list of all UDR decls with the same names ranged by the Scopes.
9373   // The Scope boundary is a duplication of the previous decl.
9374   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9375   for (auto *E : C->reduction_ops()) {
9376     // Transform all the decls.
9377     if (E) {
9378       auto *ULE = cast<UnresolvedLookupExpr>(E);
9379       UnresolvedSet<8> Decls;
9380       for (auto *D : ULE->decls()) {
9381         NamedDecl *InstD =
9382             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9383         Decls.addDecl(InstD, InstD->getAccess());
9384       }
9385       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9386           SemaRef.Context, /*NamingClass=*/nullptr,
9387           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9388           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9389     } else
9390       UnresolvedReductions.push_back(nullptr);
9391   }
9392   return getDerived().RebuildOMPInReductionClause(
9393       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9394       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9395 }
9396 
9397 template <typename Derived>
9398 OMPClause *
9399 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9400   llvm::SmallVector<Expr *, 16> Vars;
9401   Vars.reserve(C->varlist_size());
9402   for (auto *VE : C->varlists()) {
9403     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9404     if (EVar.isInvalid())
9405       return nullptr;
9406     Vars.push_back(EVar.get());
9407   }
9408   ExprResult Step = getDerived().TransformExpr(C->getStep());
9409   if (Step.isInvalid())
9410     return nullptr;
9411   return getDerived().RebuildOMPLinearClause(
9412       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9413       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9414 }
9415 
9416 template <typename Derived>
9417 OMPClause *
9418 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9419   llvm::SmallVector<Expr *, 16> Vars;
9420   Vars.reserve(C->varlist_size());
9421   for (auto *VE : C->varlists()) {
9422     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9423     if (EVar.isInvalid())
9424       return nullptr;
9425     Vars.push_back(EVar.get());
9426   }
9427   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9428   if (Alignment.isInvalid())
9429     return nullptr;
9430   return getDerived().RebuildOMPAlignedClause(
9431       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9432       C->getColonLoc(), C->getEndLoc());
9433 }
9434 
9435 template <typename Derived>
9436 OMPClause *
9437 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9438   llvm::SmallVector<Expr *, 16> Vars;
9439   Vars.reserve(C->varlist_size());
9440   for (auto *VE : C->varlists()) {
9441     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9442     if (EVar.isInvalid())
9443       return nullptr;
9444     Vars.push_back(EVar.get());
9445   }
9446   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9447                                              C->getLParenLoc(), C->getEndLoc());
9448 }
9449 
9450 template <typename Derived>
9451 OMPClause *
9452 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9453   llvm::SmallVector<Expr *, 16> Vars;
9454   Vars.reserve(C->varlist_size());
9455   for (auto *VE : C->varlists()) {
9456     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9457     if (EVar.isInvalid())
9458       return nullptr;
9459     Vars.push_back(EVar.get());
9460   }
9461   return getDerived().RebuildOMPCopyprivateClause(
9462       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9463 }
9464 
9465 template <typename Derived>
9466 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9467   llvm::SmallVector<Expr *, 16> Vars;
9468   Vars.reserve(C->varlist_size());
9469   for (auto *VE : C->varlists()) {
9470     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9471     if (EVar.isInvalid())
9472       return nullptr;
9473     Vars.push_back(EVar.get());
9474   }
9475   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9476                                             C->getLParenLoc(), C->getEndLoc());
9477 }
9478 
9479 template <typename Derived>
9480 OMPClause *
9481 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9482   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9483   if (E.isInvalid())
9484     return nullptr;
9485   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9486                                              C->getLParenLoc(), C->getEndLoc());
9487 }
9488 
9489 template <typename Derived>
9490 OMPClause *
9491 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9492   llvm::SmallVector<Expr *, 16> Vars;
9493   Expr *DepModifier = C->getModifier();
9494   if (DepModifier) {
9495     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9496     if (DepModRes.isInvalid())
9497       return nullptr;
9498     DepModifier = DepModRes.get();
9499   }
9500   Vars.reserve(C->varlist_size());
9501   for (auto *VE : C->varlists()) {
9502     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9503     if (EVar.isInvalid())
9504       return nullptr;
9505     Vars.push_back(EVar.get());
9506   }
9507   return getDerived().RebuildOMPDependClause(
9508       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9509       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9510       C->getEndLoc());
9511 }
9512 
9513 template <typename Derived>
9514 OMPClause *
9515 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9516   ExprResult E = getDerived().TransformExpr(C->getDevice());
9517   if (E.isInvalid())
9518     return nullptr;
9519   return getDerived().RebuildOMPDeviceClause(
9520       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9521       C->getModifierLoc(), C->getEndLoc());
9522 }
9523 
9524 template <typename Derived, class T>
9525 bool transformOMPMappableExprListClause(
9526     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9527     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9528     DeclarationNameInfo &MapperIdInfo,
9529     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9530   // Transform expressions in the list.
9531   Vars.reserve(C->varlist_size());
9532   for (auto *VE : C->varlists()) {
9533     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9534     if (EVar.isInvalid())
9535       return true;
9536     Vars.push_back(EVar.get());
9537   }
9538   // Transform mapper scope specifier and identifier.
9539   NestedNameSpecifierLoc QualifierLoc;
9540   if (C->getMapperQualifierLoc()) {
9541     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9542         C->getMapperQualifierLoc());
9543     if (!QualifierLoc)
9544       return true;
9545   }
9546   MapperIdScopeSpec.Adopt(QualifierLoc);
9547   MapperIdInfo = C->getMapperIdInfo();
9548   if (MapperIdInfo.getName()) {
9549     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9550     if (!MapperIdInfo.getName())
9551       return true;
9552   }
9553   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9554   // the previous user-defined mapper lookup in dependent environment.
9555   for (auto *E : C->mapperlists()) {
9556     // Transform all the decls.
9557     if (E) {
9558       auto *ULE = cast<UnresolvedLookupExpr>(E);
9559       UnresolvedSet<8> Decls;
9560       for (auto *D : ULE->decls()) {
9561         NamedDecl *InstD =
9562             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9563         Decls.addDecl(InstD, InstD->getAccess());
9564       }
9565       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9566           TT.getSema().Context, /*NamingClass=*/nullptr,
9567           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9568           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9569           Decls.end()));
9570     } else {
9571       UnresolvedMappers.push_back(nullptr);
9572     }
9573   }
9574   return false;
9575 }
9576 
9577 template <typename Derived>
9578 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9579   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9580   llvm::SmallVector<Expr *, 16> Vars;
9581   CXXScopeSpec MapperIdScopeSpec;
9582   DeclarationNameInfo MapperIdInfo;
9583   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9584   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9585           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9586     return nullptr;
9587   return getDerived().RebuildOMPMapClause(
9588       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9589       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9590       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9591 }
9592 
9593 template <typename Derived>
9594 OMPClause *
9595 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9596   Expr *Allocator = C->getAllocator();
9597   if (Allocator) {
9598     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9599     if (AllocatorRes.isInvalid())
9600       return nullptr;
9601     Allocator = AllocatorRes.get();
9602   }
9603   llvm::SmallVector<Expr *, 16> Vars;
9604   Vars.reserve(C->varlist_size());
9605   for (auto *VE : C->varlists()) {
9606     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9607     if (EVar.isInvalid())
9608       return nullptr;
9609     Vars.push_back(EVar.get());
9610   }
9611   return getDerived().RebuildOMPAllocateClause(
9612       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9613       C->getEndLoc());
9614 }
9615 
9616 template <typename Derived>
9617 OMPClause *
9618 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9619   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9620   if (E.isInvalid())
9621     return nullptr;
9622   return getDerived().RebuildOMPNumTeamsClause(
9623       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9624 }
9625 
9626 template <typename Derived>
9627 OMPClause *
9628 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9629   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9630   if (E.isInvalid())
9631     return nullptr;
9632   return getDerived().RebuildOMPThreadLimitClause(
9633       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9634 }
9635 
9636 template <typename Derived>
9637 OMPClause *
9638 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9639   ExprResult E = getDerived().TransformExpr(C->getPriority());
9640   if (E.isInvalid())
9641     return nullptr;
9642   return getDerived().RebuildOMPPriorityClause(
9643       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9644 }
9645 
9646 template <typename Derived>
9647 OMPClause *
9648 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9649   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9650   if (E.isInvalid())
9651     return nullptr;
9652   return getDerived().RebuildOMPGrainsizeClause(
9653       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9654 }
9655 
9656 template <typename Derived>
9657 OMPClause *
9658 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9659   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9660   if (E.isInvalid())
9661     return nullptr;
9662   return getDerived().RebuildOMPNumTasksClause(
9663       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9664 }
9665 
9666 template <typename Derived>
9667 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9668   ExprResult E = getDerived().TransformExpr(C->getHint());
9669   if (E.isInvalid())
9670     return nullptr;
9671   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9672                                            C->getLParenLoc(), C->getEndLoc());
9673 }
9674 
9675 template <typename Derived>
9676 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9677     OMPDistScheduleClause *C) {
9678   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9679   if (E.isInvalid())
9680     return nullptr;
9681   return getDerived().RebuildOMPDistScheduleClause(
9682       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9683       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9684 }
9685 
9686 template <typename Derived>
9687 OMPClause *
9688 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9689   // Rebuild Defaultmap Clause since we need to invoke the checking of
9690   // defaultmap(none:variable-category) after template initialization.
9691   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9692                                                  C->getDefaultmapKind(),
9693                                                  C->getBeginLoc(),
9694                                                  C->getLParenLoc(),
9695                                                  C->getDefaultmapModifierLoc(),
9696                                                  C->getDefaultmapKindLoc(),
9697                                                  C->getEndLoc());
9698 }
9699 
9700 template <typename Derived>
9701 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9702   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9703   llvm::SmallVector<Expr *, 16> Vars;
9704   CXXScopeSpec MapperIdScopeSpec;
9705   DeclarationNameInfo MapperIdInfo;
9706   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9707   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9708           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9709     return nullptr;
9710   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
9711                                          Locs, UnresolvedMappers);
9712 }
9713 
9714 template <typename Derived>
9715 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9716   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9717   llvm::SmallVector<Expr *, 16> Vars;
9718   CXXScopeSpec MapperIdScopeSpec;
9719   DeclarationNameInfo MapperIdInfo;
9720   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9721   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9722           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9723     return nullptr;
9724   return getDerived().RebuildOMPFromClause(
9725       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9726 }
9727 
9728 template <typename Derived>
9729 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9730     OMPUseDevicePtrClause *C) {
9731   llvm::SmallVector<Expr *, 16> Vars;
9732   Vars.reserve(C->varlist_size());
9733   for (auto *VE : C->varlists()) {
9734     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9735     if (EVar.isInvalid())
9736       return nullptr;
9737     Vars.push_back(EVar.get());
9738   }
9739   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9740   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9741 }
9742 
9743 template <typename Derived>
9744 OMPClause *
9745 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9746   llvm::SmallVector<Expr *, 16> Vars;
9747   Vars.reserve(C->varlist_size());
9748   for (auto *VE : C->varlists()) {
9749     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9750     if (EVar.isInvalid())
9751       return nullptr;
9752     Vars.push_back(EVar.get());
9753   }
9754   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9755   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9756 }
9757 
9758 template <typename Derived>
9759 OMPClause *
9760 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9761   llvm::SmallVector<Expr *, 16> Vars;
9762   Vars.reserve(C->varlist_size());
9763   for (auto *VE : C->varlists()) {
9764     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9765     if (EVar.isInvalid())
9766       return nullptr;
9767     Vars.push_back(EVar.get());
9768   }
9769   return getDerived().RebuildOMPNontemporalClause(
9770       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9771 }
9772 
9773 template <typename Derived>
9774 OMPClause *
9775 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
9776   llvm::SmallVector<Expr *, 16> Vars;
9777   Vars.reserve(C->varlist_size());
9778   for (auto *VE : C->varlists()) {
9779     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9780     if (EVar.isInvalid())
9781       return nullptr;
9782     Vars.push_back(EVar.get());
9783   }
9784   return getDerived().RebuildOMPInclusiveClause(
9785       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9786 }
9787 
9788 template <typename Derived>
9789 OMPClause *
9790 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
9791   llvm::SmallVector<Expr *, 16> Vars;
9792   Vars.reserve(C->varlist_size());
9793   for (auto *VE : C->varlists()) {
9794     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9795     if (EVar.isInvalid())
9796       return nullptr;
9797     Vars.push_back(EVar.get());
9798   }
9799   return getDerived().RebuildOMPExclusiveClause(
9800       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9801 }
9802 
9803 template <typename Derived>
9804 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
9805     OMPUsesAllocatorsClause *C) {
9806   SmallVector<Sema::UsesAllocatorsData, 16> Data;
9807   Data.reserve(C->getNumberOfAllocators());
9808   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
9809     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
9810     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
9811     if (Allocator.isInvalid())
9812       continue;
9813     ExprResult AllocatorTraits;
9814     if (Expr *AT = D.AllocatorTraits) {
9815       AllocatorTraits = getDerived().TransformExpr(AT);
9816       if (AllocatorTraits.isInvalid())
9817         continue;
9818     }
9819     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
9820     NewD.Allocator = Allocator.get();
9821     NewD.AllocatorTraits = AllocatorTraits.get();
9822     NewD.LParenLoc = D.LParenLoc;
9823     NewD.RParenLoc = D.RParenLoc;
9824   }
9825   return getDerived().RebuildOMPUsesAllocatorsClause(
9826       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9827 }
9828 
9829 template <typename Derived>
9830 OMPClause *
9831 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
9832   SmallVector<Expr *, 4> Locators;
9833   Locators.reserve(C->varlist_size());
9834   ExprResult ModifierRes;
9835   if (Expr *Modifier = C->getModifier()) {
9836     ModifierRes = getDerived().TransformExpr(Modifier);
9837     if (ModifierRes.isInvalid())
9838       return nullptr;
9839   }
9840   for (Expr *E : C->varlists()) {
9841     ExprResult Locator = getDerived().TransformExpr(E);
9842     if (Locator.isInvalid())
9843       continue;
9844     Locators.push_back(Locator.get());
9845   }
9846   return getDerived().RebuildOMPAffinityClause(
9847       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
9848       ModifierRes.get(), Locators);
9849 }
9850 
9851 template <typename Derived>
9852 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9853   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9854                                             C->getBeginLoc(), C->getLParenLoc(),
9855                                             C->getEndLoc());
9856 }
9857 
9858 //===----------------------------------------------------------------------===//
9859 // Expression transformation
9860 //===----------------------------------------------------------------------===//
9861 template<typename Derived>
9862 ExprResult
9863 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9864   return TransformExpr(E->getSubExpr());
9865 }
9866 
9867 template<typename Derived>
9868 ExprResult
9869 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9870   if (!E->isTypeDependent())
9871     return E;
9872 
9873   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9874                                             E->getIdentKind());
9875 }
9876 
9877 template<typename Derived>
9878 ExprResult
9879 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9880   NestedNameSpecifierLoc QualifierLoc;
9881   if (E->getQualifierLoc()) {
9882     QualifierLoc
9883       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9884     if (!QualifierLoc)
9885       return ExprError();
9886   }
9887 
9888   ValueDecl *ND
9889     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9890                                                          E->getDecl()));
9891   if (!ND)
9892     return ExprError();
9893 
9894   NamedDecl *Found = ND;
9895   if (E->getFoundDecl() != E->getDecl()) {
9896     Found = cast_or_null<NamedDecl>(
9897         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9898     if (!Found)
9899       return ExprError();
9900   }
9901 
9902   DeclarationNameInfo NameInfo = E->getNameInfo();
9903   if (NameInfo.getName()) {
9904     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9905     if (!NameInfo.getName())
9906       return ExprError();
9907   }
9908 
9909   if (!getDerived().AlwaysRebuild() &&
9910       QualifierLoc == E->getQualifierLoc() &&
9911       ND == E->getDecl() &&
9912       Found == E->getFoundDecl() &&
9913       NameInfo.getName() == E->getDecl()->getDeclName() &&
9914       !E->hasExplicitTemplateArgs()) {
9915 
9916     // Mark it referenced in the new context regardless.
9917     // FIXME: this is a bit instantiation-specific.
9918     SemaRef.MarkDeclRefReferenced(E);
9919 
9920     return E;
9921   }
9922 
9923   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9924   if (E->hasExplicitTemplateArgs()) {
9925     TemplateArgs = &TransArgs;
9926     TransArgs.setLAngleLoc(E->getLAngleLoc());
9927     TransArgs.setRAngleLoc(E->getRAngleLoc());
9928     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9929                                                 E->getNumTemplateArgs(),
9930                                                 TransArgs))
9931       return ExprError();
9932   }
9933 
9934   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9935                                          Found, TemplateArgs);
9936 }
9937 
9938 template<typename Derived>
9939 ExprResult
9940 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9941   return E;
9942 }
9943 
9944 template <typename Derived>
9945 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9946     FixedPointLiteral *E) {
9947   return E;
9948 }
9949 
9950 template<typename Derived>
9951 ExprResult
9952 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9953   return E;
9954 }
9955 
9956 template<typename Derived>
9957 ExprResult
9958 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9959   return E;
9960 }
9961 
9962 template<typename Derived>
9963 ExprResult
9964 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9965   return E;
9966 }
9967 
9968 template<typename Derived>
9969 ExprResult
9970 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9971   return E;
9972 }
9973 
9974 template<typename Derived>
9975 ExprResult
9976 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9977   if (FunctionDecl *FD = E->getDirectCallee())
9978     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9979   return SemaRef.MaybeBindToTemporary(E);
9980 }
9981 
9982 template<typename Derived>
9983 ExprResult
9984 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9985   ExprResult ControllingExpr =
9986     getDerived().TransformExpr(E->getControllingExpr());
9987   if (ControllingExpr.isInvalid())
9988     return ExprError();
9989 
9990   SmallVector<Expr *, 4> AssocExprs;
9991   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9992   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
9993     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9994     if (TSI) {
9995       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9996       if (!AssocType)
9997         return ExprError();
9998       AssocTypes.push_back(AssocType);
9999     } else {
10000       AssocTypes.push_back(nullptr);
10001     }
10002 
10003     ExprResult AssocExpr =
10004         getDerived().TransformExpr(Assoc.getAssociationExpr());
10005     if (AssocExpr.isInvalid())
10006       return ExprError();
10007     AssocExprs.push_back(AssocExpr.get());
10008   }
10009 
10010   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10011                                                   E->getDefaultLoc(),
10012                                                   E->getRParenLoc(),
10013                                                   ControllingExpr.get(),
10014                                                   AssocTypes,
10015                                                   AssocExprs);
10016 }
10017 
10018 template<typename Derived>
10019 ExprResult
10020 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10021   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10022   if (SubExpr.isInvalid())
10023     return ExprError();
10024 
10025   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10026     return E;
10027 
10028   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10029                                        E->getRParen());
10030 }
10031 
10032 /// The operand of a unary address-of operator has special rules: it's
10033 /// allowed to refer to a non-static member of a class even if there's no 'this'
10034 /// object available.
10035 template<typename Derived>
10036 ExprResult
10037 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10038   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10039     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10040   else
10041     return getDerived().TransformExpr(E);
10042 }
10043 
10044 template<typename Derived>
10045 ExprResult
10046 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10047   ExprResult SubExpr;
10048   if (E->getOpcode() == UO_AddrOf)
10049     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10050   else
10051     SubExpr = TransformExpr(E->getSubExpr());
10052   if (SubExpr.isInvalid())
10053     return ExprError();
10054 
10055   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10056     return E;
10057 
10058   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10059                                            E->getOpcode(),
10060                                            SubExpr.get());
10061 }
10062 
10063 template<typename Derived>
10064 ExprResult
10065 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10066   // Transform the type.
10067   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10068   if (!Type)
10069     return ExprError();
10070 
10071   // Transform all of the components into components similar to what the
10072   // parser uses.
10073   // FIXME: It would be slightly more efficient in the non-dependent case to
10074   // just map FieldDecls, rather than requiring the rebuilder to look for
10075   // the fields again. However, __builtin_offsetof is rare enough in
10076   // template code that we don't care.
10077   bool ExprChanged = false;
10078   typedef Sema::OffsetOfComponent Component;
10079   SmallVector<Component, 4> Components;
10080   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10081     const OffsetOfNode &ON = E->getComponent(I);
10082     Component Comp;
10083     Comp.isBrackets = true;
10084     Comp.LocStart = ON.getSourceRange().getBegin();
10085     Comp.LocEnd = ON.getSourceRange().getEnd();
10086     switch (ON.getKind()) {
10087     case OffsetOfNode::Array: {
10088       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10089       ExprResult Index = getDerived().TransformExpr(FromIndex);
10090       if (Index.isInvalid())
10091         return ExprError();
10092 
10093       ExprChanged = ExprChanged || Index.get() != FromIndex;
10094       Comp.isBrackets = true;
10095       Comp.U.E = Index.get();
10096       break;
10097     }
10098 
10099     case OffsetOfNode::Field:
10100     case OffsetOfNode::Identifier:
10101       Comp.isBrackets = false;
10102       Comp.U.IdentInfo = ON.getFieldName();
10103       if (!Comp.U.IdentInfo)
10104         continue;
10105 
10106       break;
10107 
10108     case OffsetOfNode::Base:
10109       // Will be recomputed during the rebuild.
10110       continue;
10111     }
10112 
10113     Components.push_back(Comp);
10114   }
10115 
10116   // If nothing changed, retain the existing expression.
10117   if (!getDerived().AlwaysRebuild() &&
10118       Type == E->getTypeSourceInfo() &&
10119       !ExprChanged)
10120     return E;
10121 
10122   // Build a new offsetof expression.
10123   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10124                                           Components, E->getRParenLoc());
10125 }
10126 
10127 template<typename Derived>
10128 ExprResult
10129 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10130   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10131          "opaque value expression requires transformation");
10132   return E;
10133 }
10134 
10135 template<typename Derived>
10136 ExprResult
10137 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10138   return E;
10139 }
10140 
10141 template <typename Derived>
10142 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10143   llvm::SmallVector<Expr *, 8> Children;
10144   bool Changed = false;
10145   for (Expr *C : E->subExpressions()) {
10146     ExprResult NewC = getDerived().TransformExpr(C);
10147     if (NewC.isInvalid())
10148       return ExprError();
10149     Children.push_back(NewC.get());
10150 
10151     Changed |= NewC.get() != C;
10152   }
10153   if (!getDerived().AlwaysRebuild() && !Changed)
10154     return E;
10155   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10156                                           Children);
10157 }
10158 
10159 template<typename Derived>
10160 ExprResult
10161 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10162   // Rebuild the syntactic form.  The original syntactic form has
10163   // opaque-value expressions in it, so strip those away and rebuild
10164   // the result.  This is a really awful way of doing this, but the
10165   // better solution (rebuilding the semantic expressions and
10166   // rebinding OVEs as necessary) doesn't work; we'd need
10167   // TreeTransform to not strip away implicit conversions.
10168   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10169   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10170   if (result.isInvalid()) return ExprError();
10171 
10172   // If that gives us a pseudo-object result back, the pseudo-object
10173   // expression must have been an lvalue-to-rvalue conversion which we
10174   // should reapply.
10175   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10176     result = SemaRef.checkPseudoObjectRValue(result.get());
10177 
10178   return result;
10179 }
10180 
10181 template<typename Derived>
10182 ExprResult
10183 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10184                                                 UnaryExprOrTypeTraitExpr *E) {
10185   if (E->isArgumentType()) {
10186     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10187 
10188     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10189     if (!NewT)
10190       return ExprError();
10191 
10192     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10193       return E;
10194 
10195     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10196                                                     E->getKind(),
10197                                                     E->getSourceRange());
10198   }
10199 
10200   // C++0x [expr.sizeof]p1:
10201   //   The operand is either an expression, which is an unevaluated operand
10202   //   [...]
10203   EnterExpressionEvaluationContext Unevaluated(
10204       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10205       Sema::ReuseLambdaContextDecl);
10206 
10207   // Try to recover if we have something like sizeof(T::X) where X is a type.
10208   // Notably, there must be *exactly* one set of parens if X is a type.
10209   TypeSourceInfo *RecoveryTSI = nullptr;
10210   ExprResult SubExpr;
10211   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10212   if (auto *DRE =
10213           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10214     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10215         PE, DRE, false, &RecoveryTSI);
10216   else
10217     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10218 
10219   if (RecoveryTSI) {
10220     return getDerived().RebuildUnaryExprOrTypeTrait(
10221         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10222   } else if (SubExpr.isInvalid())
10223     return ExprError();
10224 
10225   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10226     return E;
10227 
10228   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10229                                                   E->getOperatorLoc(),
10230                                                   E->getKind(),
10231                                                   E->getSourceRange());
10232 }
10233 
10234 template<typename Derived>
10235 ExprResult
10236 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10237   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10238   if (LHS.isInvalid())
10239     return ExprError();
10240 
10241   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10242   if (RHS.isInvalid())
10243     return ExprError();
10244 
10245 
10246   if (!getDerived().AlwaysRebuild() &&
10247       LHS.get() == E->getLHS() &&
10248       RHS.get() == E->getRHS())
10249     return E;
10250 
10251   return getDerived().RebuildArraySubscriptExpr(
10252       LHS.get(),
10253       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10254 }
10255 
10256 template <typename Derived>
10257 ExprResult
10258 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10259   ExprResult Base = getDerived().TransformExpr(E->getBase());
10260   if (Base.isInvalid())
10261     return ExprError();
10262 
10263   ExprResult LowerBound;
10264   if (E->getLowerBound()) {
10265     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10266     if (LowerBound.isInvalid())
10267       return ExprError();
10268   }
10269 
10270   ExprResult Length;
10271   if (E->getLength()) {
10272     Length = getDerived().TransformExpr(E->getLength());
10273     if (Length.isInvalid())
10274       return ExprError();
10275   }
10276 
10277   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10278       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10279     return E;
10280 
10281   return getDerived().RebuildOMPArraySectionExpr(
10282       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
10283       Length.get(), E->getRBracketLoc());
10284 }
10285 
10286 template <typename Derived>
10287 ExprResult
10288 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10289   ExprResult Base = getDerived().TransformExpr(E->getBase());
10290   if (Base.isInvalid())
10291     return ExprError();
10292 
10293   SmallVector<Expr *, 4> Dims;
10294   bool ErrorFound = false;
10295   for (Expr *Dim : E->getDimensions()) {
10296     ExprResult DimRes = getDerived().TransformExpr(Dim);
10297     if (DimRes.isInvalid()) {
10298       ErrorFound = true;
10299       continue;
10300     }
10301     Dims.push_back(DimRes.get());
10302   }
10303 
10304   if (ErrorFound)
10305     return ExprError();
10306   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10307                                                  E->getRParenLoc(), Dims,
10308                                                  E->getBracketsRanges());
10309 }
10310 
10311 template <typename Derived>
10312 ExprResult
10313 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10314   unsigned NumIterators = E->numOfIterators();
10315   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10316 
10317   bool ErrorFound = false;
10318   bool NeedToRebuild = getDerived().AlwaysRebuild();
10319   for (unsigned I = 0; I < NumIterators; ++I) {
10320     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10321     Data[I].DeclIdent = D->getIdentifier();
10322     Data[I].DeclIdentLoc = D->getLocation();
10323     if (D->getLocation() == D->getBeginLoc()) {
10324       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10325              "Implicit type must be int.");
10326     } else {
10327       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10328       QualType DeclTy = getDerived().TransformType(D->getType());
10329       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10330     }
10331     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10332     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10333     ExprResult End = getDerived().TransformExpr(Range.End);
10334     ExprResult Step = getDerived().TransformExpr(Range.Step);
10335     ErrorFound = ErrorFound ||
10336                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10337                                                !Data[I].Type.get().isNull())) ||
10338                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10339     if (ErrorFound)
10340       continue;
10341     Data[I].Range.Begin = Begin.get();
10342     Data[I].Range.End = End.get();
10343     Data[I].Range.Step = Step.get();
10344     Data[I].AssignLoc = E->getAssignLoc(I);
10345     Data[I].ColonLoc = E->getColonLoc(I);
10346     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10347     NeedToRebuild =
10348         NeedToRebuild ||
10349         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10350                                        D->getType().getTypePtrOrNull()) ||
10351         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10352         Range.Step != Data[I].Range.Step;
10353   }
10354   if (ErrorFound)
10355     return ExprError();
10356   if (!NeedToRebuild)
10357     return E;
10358 
10359   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10360       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10361   if (!Res.isUsable())
10362     return Res;
10363   auto *IE = cast<OMPIteratorExpr>(Res.get());
10364   for (unsigned I = 0; I < NumIterators; ++I)
10365     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10366                                       IE->getIteratorDecl(I));
10367   return Res;
10368 }
10369 
10370 template<typename Derived>
10371 ExprResult
10372 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10373   // Transform the callee.
10374   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10375   if (Callee.isInvalid())
10376     return ExprError();
10377 
10378   // Transform arguments.
10379   bool ArgChanged = false;
10380   SmallVector<Expr*, 8> Args;
10381   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10382                                   &ArgChanged))
10383     return ExprError();
10384 
10385   if (!getDerived().AlwaysRebuild() &&
10386       Callee.get() == E->getCallee() &&
10387       !ArgChanged)
10388     return SemaRef.MaybeBindToTemporary(E);
10389 
10390   // FIXME: Wrong source location information for the '('.
10391   SourceLocation FakeLParenLoc
10392     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10393   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10394                                       Args,
10395                                       E->getRParenLoc());
10396 }
10397 
10398 template<typename Derived>
10399 ExprResult
10400 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10401   ExprResult Base = getDerived().TransformExpr(E->getBase());
10402   if (Base.isInvalid())
10403     return ExprError();
10404 
10405   NestedNameSpecifierLoc QualifierLoc;
10406   if (E->hasQualifier()) {
10407     QualifierLoc
10408       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10409 
10410     if (!QualifierLoc)
10411       return ExprError();
10412   }
10413   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10414 
10415   ValueDecl *Member
10416     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10417                                                          E->getMemberDecl()));
10418   if (!Member)
10419     return ExprError();
10420 
10421   NamedDecl *FoundDecl = E->getFoundDecl();
10422   if (FoundDecl == E->getMemberDecl()) {
10423     FoundDecl = Member;
10424   } else {
10425     FoundDecl = cast_or_null<NamedDecl>(
10426                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10427     if (!FoundDecl)
10428       return ExprError();
10429   }
10430 
10431   if (!getDerived().AlwaysRebuild() &&
10432       Base.get() == E->getBase() &&
10433       QualifierLoc == E->getQualifierLoc() &&
10434       Member == E->getMemberDecl() &&
10435       FoundDecl == E->getFoundDecl() &&
10436       !E->hasExplicitTemplateArgs()) {
10437 
10438     // Mark it referenced in the new context regardless.
10439     // FIXME: this is a bit instantiation-specific.
10440     SemaRef.MarkMemberReferenced(E);
10441 
10442     return E;
10443   }
10444 
10445   TemplateArgumentListInfo TransArgs;
10446   if (E->hasExplicitTemplateArgs()) {
10447     TransArgs.setLAngleLoc(E->getLAngleLoc());
10448     TransArgs.setRAngleLoc(E->getRAngleLoc());
10449     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10450                                                 E->getNumTemplateArgs(),
10451                                                 TransArgs))
10452       return ExprError();
10453   }
10454 
10455   // FIXME: Bogus source location for the operator
10456   SourceLocation FakeOperatorLoc =
10457       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10458 
10459   // FIXME: to do this check properly, we will need to preserve the
10460   // first-qualifier-in-scope here, just in case we had a dependent
10461   // base (and therefore couldn't do the check) and a
10462   // nested-name-qualifier (and therefore could do the lookup).
10463   NamedDecl *FirstQualifierInScope = nullptr;
10464   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10465   if (MemberNameInfo.getName()) {
10466     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10467     if (!MemberNameInfo.getName())
10468       return ExprError();
10469   }
10470 
10471   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10472                                         E->isArrow(),
10473                                         QualifierLoc,
10474                                         TemplateKWLoc,
10475                                         MemberNameInfo,
10476                                         Member,
10477                                         FoundDecl,
10478                                         (E->hasExplicitTemplateArgs()
10479                                            ? &TransArgs : nullptr),
10480                                         FirstQualifierInScope);
10481 }
10482 
10483 template<typename Derived>
10484 ExprResult
10485 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10486   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10487   if (LHS.isInvalid())
10488     return ExprError();
10489 
10490   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10491   if (RHS.isInvalid())
10492     return ExprError();
10493 
10494   if (!getDerived().AlwaysRebuild() &&
10495       LHS.get() == E->getLHS() &&
10496       RHS.get() == E->getRHS())
10497     return E;
10498 
10499   if (E->isCompoundAssignmentOp())
10500     // FPFeatures has already been established from trailing storage
10501     return getDerived().RebuildBinaryOperator(
10502         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10503   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10504   getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts());
10505 
10506   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10507                                             LHS.get(), RHS.get());
10508 }
10509 
10510 template <typename Derived>
10511 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10512     CXXRewrittenBinaryOperator *E) {
10513   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10514 
10515   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10516   if (LHS.isInvalid())
10517     return ExprError();
10518 
10519   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10520   if (RHS.isInvalid())
10521     return ExprError();
10522 
10523   if (!getDerived().AlwaysRebuild() &&
10524       LHS.get() == Decomp.LHS &&
10525       RHS.get() == Decomp.RHS)
10526     return E;
10527 
10528   // Extract the already-resolved callee declarations so that we can restrict
10529   // ourselves to using them as the unqualified lookup results when rebuilding.
10530   UnresolvedSet<2> UnqualLookups;
10531   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10532                             const_cast<Expr *>(Decomp.InnerBinOp)};
10533   for (Expr *PossibleBinOp : PossibleBinOps) {
10534     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10535     if (!Op)
10536       continue;
10537     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10538     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10539       continue;
10540 
10541     // Transform the callee in case we built a call to a local extern
10542     // declaration.
10543     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10544         E->getOperatorLoc(), Callee->getFoundDecl()));
10545     if (!Found)
10546       return ExprError();
10547     UnqualLookups.addDecl(Found);
10548   }
10549 
10550   return getDerived().RebuildCXXRewrittenBinaryOperator(
10551       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10552 }
10553 
10554 template<typename Derived>
10555 ExprResult
10556 TreeTransform<Derived>::TransformCompoundAssignOperator(
10557                                                       CompoundAssignOperator *E) {
10558   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10559   getSema().CurFPFeatures = E->getFPFeatures(getSema().getLangOpts());
10560   return getDerived().TransformBinaryOperator(E);
10561 }
10562 
10563 template<typename Derived>
10564 ExprResult TreeTransform<Derived>::
10565 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10566   // Just rebuild the common and RHS expressions and see whether we
10567   // get any changes.
10568 
10569   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10570   if (commonExpr.isInvalid())
10571     return ExprError();
10572 
10573   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10574   if (rhs.isInvalid())
10575     return ExprError();
10576 
10577   if (!getDerived().AlwaysRebuild() &&
10578       commonExpr.get() == e->getCommon() &&
10579       rhs.get() == e->getFalseExpr())
10580     return e;
10581 
10582   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10583                                                  e->getQuestionLoc(),
10584                                                  nullptr,
10585                                                  e->getColonLoc(),
10586                                                  rhs.get());
10587 }
10588 
10589 template<typename Derived>
10590 ExprResult
10591 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10592   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10593   if (Cond.isInvalid())
10594     return ExprError();
10595 
10596   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10597   if (LHS.isInvalid())
10598     return ExprError();
10599 
10600   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10601   if (RHS.isInvalid())
10602     return ExprError();
10603 
10604   if (!getDerived().AlwaysRebuild() &&
10605       Cond.get() == E->getCond() &&
10606       LHS.get() == E->getLHS() &&
10607       RHS.get() == E->getRHS())
10608     return E;
10609 
10610   return getDerived().RebuildConditionalOperator(Cond.get(),
10611                                                  E->getQuestionLoc(),
10612                                                  LHS.get(),
10613                                                  E->getColonLoc(),
10614                                                  RHS.get());
10615 }
10616 
10617 template<typename Derived>
10618 ExprResult
10619 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10620   // Implicit casts are eliminated during transformation, since they
10621   // will be recomputed by semantic analysis after transformation.
10622   return getDerived().TransformExpr(E->getSubExprAsWritten());
10623 }
10624 
10625 template<typename Derived>
10626 ExprResult
10627 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10628   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10629   if (!Type)
10630     return ExprError();
10631 
10632   ExprResult SubExpr
10633     = getDerived().TransformExpr(E->getSubExprAsWritten());
10634   if (SubExpr.isInvalid())
10635     return ExprError();
10636 
10637   if (!getDerived().AlwaysRebuild() &&
10638       Type == E->getTypeInfoAsWritten() &&
10639       SubExpr.get() == E->getSubExpr())
10640     return E;
10641 
10642   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10643                                             Type,
10644                                             E->getRParenLoc(),
10645                                             SubExpr.get());
10646 }
10647 
10648 template<typename Derived>
10649 ExprResult
10650 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10651   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10652   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10653   if (!NewT)
10654     return ExprError();
10655 
10656   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10657   if (Init.isInvalid())
10658     return ExprError();
10659 
10660   if (!getDerived().AlwaysRebuild() &&
10661       OldT == NewT &&
10662       Init.get() == E->getInitializer())
10663     return SemaRef.MaybeBindToTemporary(E);
10664 
10665   // Note: the expression type doesn't necessarily match the
10666   // type-as-written, but that's okay, because it should always be
10667   // derivable from the initializer.
10668 
10669   return getDerived().RebuildCompoundLiteralExpr(
10670       E->getLParenLoc(), NewT,
10671       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10672 }
10673 
10674 template<typename Derived>
10675 ExprResult
10676 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10677   ExprResult Base = getDerived().TransformExpr(E->getBase());
10678   if (Base.isInvalid())
10679     return ExprError();
10680 
10681   if (!getDerived().AlwaysRebuild() &&
10682       Base.get() == E->getBase())
10683     return E;
10684 
10685   // FIXME: Bad source location
10686   SourceLocation FakeOperatorLoc =
10687       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10688   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10689                                                   E->getAccessorLoc(),
10690                                                   E->getAccessor());
10691 }
10692 
10693 template<typename Derived>
10694 ExprResult
10695 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10696   if (InitListExpr *Syntactic = E->getSyntacticForm())
10697     E = Syntactic;
10698 
10699   bool InitChanged = false;
10700 
10701   EnterExpressionEvaluationContext Context(
10702       getSema(), EnterExpressionEvaluationContext::InitList);
10703 
10704   SmallVector<Expr*, 4> Inits;
10705   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10706                                   Inits, &InitChanged))
10707     return ExprError();
10708 
10709   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10710     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10711     // in some cases. We can't reuse it in general, because the syntactic and
10712     // semantic forms are linked, and we can't know that semantic form will
10713     // match even if the syntactic form does.
10714   }
10715 
10716   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10717                                       E->getRBraceLoc());
10718 }
10719 
10720 template<typename Derived>
10721 ExprResult
10722 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10723   Designation Desig;
10724 
10725   // transform the initializer value
10726   ExprResult Init = getDerived().TransformExpr(E->getInit());
10727   if (Init.isInvalid())
10728     return ExprError();
10729 
10730   // transform the designators.
10731   SmallVector<Expr*, 4> ArrayExprs;
10732   bool ExprChanged = false;
10733   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10734     if (D.isFieldDesignator()) {
10735       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10736                                                D.getDotLoc(),
10737                                                D.getFieldLoc()));
10738       if (D.getField()) {
10739         FieldDecl *Field = cast_or_null<FieldDecl>(
10740             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10741         if (Field != D.getField())
10742           // Rebuild the expression when the transformed FieldDecl is
10743           // different to the already assigned FieldDecl.
10744           ExprChanged = true;
10745       } else {
10746         // Ensure that the designator expression is rebuilt when there isn't
10747         // a resolved FieldDecl in the designator as we don't want to assign
10748         // a FieldDecl to a pattern designator that will be instantiated again.
10749         ExprChanged = true;
10750       }
10751       continue;
10752     }
10753 
10754     if (D.isArrayDesignator()) {
10755       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10756       if (Index.isInvalid())
10757         return ExprError();
10758 
10759       Desig.AddDesignator(
10760           Designator::getArray(Index.get(), D.getLBracketLoc()));
10761 
10762       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10763       ArrayExprs.push_back(Index.get());
10764       continue;
10765     }
10766 
10767     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10768     ExprResult Start
10769       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10770     if (Start.isInvalid())
10771       return ExprError();
10772 
10773     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10774     if (End.isInvalid())
10775       return ExprError();
10776 
10777     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10778                                                   End.get(),
10779                                                   D.getLBracketLoc(),
10780                                                   D.getEllipsisLoc()));
10781 
10782     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10783                   End.get() != E->getArrayRangeEnd(D);
10784 
10785     ArrayExprs.push_back(Start.get());
10786     ArrayExprs.push_back(End.get());
10787   }
10788 
10789   if (!getDerived().AlwaysRebuild() &&
10790       Init.get() == E->getInit() &&
10791       !ExprChanged)
10792     return E;
10793 
10794   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10795                                                 E->getEqualOrColonLoc(),
10796                                                 E->usesGNUSyntax(), Init.get());
10797 }
10798 
10799 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10800 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10801 template<typename Derived>
10802 ExprResult
10803 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10804     DesignatedInitUpdateExpr *E) {
10805   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10806                    "initializer");
10807   return ExprError();
10808 }
10809 
10810 template<typename Derived>
10811 ExprResult
10812 TreeTransform<Derived>::TransformNoInitExpr(
10813     NoInitExpr *E) {
10814   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10815   return ExprError();
10816 }
10817 
10818 template<typename Derived>
10819 ExprResult
10820 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10821   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10822   return ExprError();
10823 }
10824 
10825 template<typename Derived>
10826 ExprResult
10827 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10828   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10829   return ExprError();
10830 }
10831 
10832 template<typename Derived>
10833 ExprResult
10834 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10835                                                      ImplicitValueInitExpr *E) {
10836   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10837 
10838   // FIXME: Will we ever have proper type location here? Will we actually
10839   // need to transform the type?
10840   QualType T = getDerived().TransformType(E->getType());
10841   if (T.isNull())
10842     return ExprError();
10843 
10844   if (!getDerived().AlwaysRebuild() &&
10845       T == E->getType())
10846     return E;
10847 
10848   return getDerived().RebuildImplicitValueInitExpr(T);
10849 }
10850 
10851 template<typename Derived>
10852 ExprResult
10853 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10854   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10855   if (!TInfo)
10856     return ExprError();
10857 
10858   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10859   if (SubExpr.isInvalid())
10860     return ExprError();
10861 
10862   if (!getDerived().AlwaysRebuild() &&
10863       TInfo == E->getWrittenTypeInfo() &&
10864       SubExpr.get() == E->getSubExpr())
10865     return E;
10866 
10867   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10868                                        TInfo, E->getRParenLoc());
10869 }
10870 
10871 template<typename Derived>
10872 ExprResult
10873 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10874   bool ArgumentChanged = false;
10875   SmallVector<Expr*, 4> Inits;
10876   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10877                      &ArgumentChanged))
10878     return ExprError();
10879 
10880   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10881                                            Inits,
10882                                            E->getRParenLoc());
10883 }
10884 
10885 /// Transform an address-of-label expression.
10886 ///
10887 /// By default, the transformation of an address-of-label expression always
10888 /// rebuilds the expression, so that the label identifier can be resolved to
10889 /// the corresponding label statement by semantic analysis.
10890 template<typename Derived>
10891 ExprResult
10892 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
10893   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
10894                                         E->getLabel());
10895   if (!LD)
10896     return ExprError();
10897 
10898   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
10899                                            cast<LabelDecl>(LD));
10900 }
10901 
10902 template<typename Derived>
10903 ExprResult
10904 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
10905   SemaRef.ActOnStartStmtExpr();
10906   StmtResult SubStmt
10907     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
10908   if (SubStmt.isInvalid()) {
10909     SemaRef.ActOnStmtExprError();
10910     return ExprError();
10911   }
10912 
10913   unsigned OldDepth = E->getTemplateDepth();
10914   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
10915 
10916   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
10917       SubStmt.get() == E->getSubStmt()) {
10918     // Calling this an 'error' is unintuitive, but it does the right thing.
10919     SemaRef.ActOnStmtExprError();
10920     return SemaRef.MaybeBindToTemporary(E);
10921   }
10922 
10923   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
10924                                       E->getRParenLoc(), NewDepth);
10925 }
10926 
10927 template<typename Derived>
10928 ExprResult
10929 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
10930   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10931   if (Cond.isInvalid())
10932     return ExprError();
10933 
10934   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10935   if (LHS.isInvalid())
10936     return ExprError();
10937 
10938   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10939   if (RHS.isInvalid())
10940     return ExprError();
10941 
10942   if (!getDerived().AlwaysRebuild() &&
10943       Cond.get() == E->getCond() &&
10944       LHS.get() == E->getLHS() &&
10945       RHS.get() == E->getRHS())
10946     return E;
10947 
10948   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
10949                                         Cond.get(), LHS.get(), RHS.get(),
10950                                         E->getRParenLoc());
10951 }
10952 
10953 template<typename Derived>
10954 ExprResult
10955 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
10956   return E;
10957 }
10958 
10959 template<typename Derived>
10960 ExprResult
10961 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
10962   switch (E->getOperator()) {
10963   case OO_New:
10964   case OO_Delete:
10965   case OO_Array_New:
10966   case OO_Array_Delete:
10967     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
10968 
10969   case OO_Call: {
10970     // This is a call to an object's operator().
10971     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
10972 
10973     // Transform the object itself.
10974     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
10975     if (Object.isInvalid())
10976       return ExprError();
10977 
10978     // FIXME: Poor location information
10979     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10980         static_cast<Expr *>(Object.get())->getEndLoc());
10981 
10982     // Transform the call arguments.
10983     SmallVector<Expr*, 8> Args;
10984     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10985                                     Args))
10986       return ExprError();
10987 
10988     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10989                                         E->getEndLoc());
10990   }
10991 
10992 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10993   case OO_##Name:
10994 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10995 #include "clang/Basic/OperatorKinds.def"
10996   case OO_Subscript:
10997     // Handled below.
10998     break;
10999 
11000   case OO_Conditional:
11001     llvm_unreachable("conditional operator is not actually overloadable");
11002 
11003   case OO_None:
11004   case NUM_OVERLOADED_OPERATORS:
11005     llvm_unreachable("not an overloaded operator?");
11006   }
11007 
11008   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11009   if (Callee.isInvalid())
11010     return ExprError();
11011 
11012   ExprResult First;
11013   if (E->getOperator() == OO_Amp)
11014     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11015   else
11016     First = getDerived().TransformExpr(E->getArg(0));
11017   if (First.isInvalid())
11018     return ExprError();
11019 
11020   ExprResult Second;
11021   if (E->getNumArgs() == 2) {
11022     Second = getDerived().TransformExpr(E->getArg(1));
11023     if (Second.isInvalid())
11024       return ExprError();
11025   }
11026 
11027   if (!getDerived().AlwaysRebuild() &&
11028       Callee.get() == E->getCallee() &&
11029       First.get() == E->getArg(0) &&
11030       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11031     return SemaRef.MaybeBindToTemporary(E);
11032 
11033   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11034   getSema().CurFPFeatures = E->getFPFeatures();
11035 
11036   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11037                                                  E->getOperatorLoc(),
11038                                                  Callee.get(),
11039                                                  First.get(),
11040                                                  Second.get());
11041 }
11042 
11043 template<typename Derived>
11044 ExprResult
11045 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11046   return getDerived().TransformCallExpr(E);
11047 }
11048 
11049 template <typename Derived>
11050 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11051   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11052                          getSema().CurContext != E->getParentContext();
11053 
11054   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11055     return E;
11056 
11057   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11058                                            E->getEndLoc(),
11059                                            getSema().CurContext);
11060 }
11061 
11062 template<typename Derived>
11063 ExprResult
11064 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11065   // Transform the callee.
11066   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11067   if (Callee.isInvalid())
11068     return ExprError();
11069 
11070   // Transform exec config.
11071   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11072   if (EC.isInvalid())
11073     return ExprError();
11074 
11075   // Transform arguments.
11076   bool ArgChanged = false;
11077   SmallVector<Expr*, 8> Args;
11078   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11079                                   &ArgChanged))
11080     return ExprError();
11081 
11082   if (!getDerived().AlwaysRebuild() &&
11083       Callee.get() == E->getCallee() &&
11084       !ArgChanged)
11085     return SemaRef.MaybeBindToTemporary(E);
11086 
11087   // FIXME: Wrong source location information for the '('.
11088   SourceLocation FakeLParenLoc
11089     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11090   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11091                                       Args,
11092                                       E->getRParenLoc(), EC.get());
11093 }
11094 
11095 template<typename Derived>
11096 ExprResult
11097 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11098   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11099   if (!Type)
11100     return ExprError();
11101 
11102   ExprResult SubExpr
11103     = getDerived().TransformExpr(E->getSubExprAsWritten());
11104   if (SubExpr.isInvalid())
11105     return ExprError();
11106 
11107   if (!getDerived().AlwaysRebuild() &&
11108       Type == E->getTypeInfoAsWritten() &&
11109       SubExpr.get() == E->getSubExpr())
11110     return E;
11111   return getDerived().RebuildCXXNamedCastExpr(
11112       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11113       Type, E->getAngleBrackets().getEnd(),
11114       // FIXME. this should be '(' location
11115       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11116 }
11117 
11118 template<typename Derived>
11119 ExprResult
11120 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11121   TypeSourceInfo *TSI =
11122       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11123   if (!TSI)
11124     return ExprError();
11125 
11126   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11127   if (Sub.isInvalid())
11128     return ExprError();
11129 
11130   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11131                                                 Sub.get(), BCE->getEndLoc());
11132 }
11133 
11134 template<typename Derived>
11135 ExprResult
11136 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11137   return getDerived().TransformCXXNamedCastExpr(E);
11138 }
11139 
11140 template<typename Derived>
11141 ExprResult
11142 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11143   return getDerived().TransformCXXNamedCastExpr(E);
11144 }
11145 
11146 template<typename Derived>
11147 ExprResult
11148 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11149                                                       CXXReinterpretCastExpr *E) {
11150   return getDerived().TransformCXXNamedCastExpr(E);
11151 }
11152 
11153 template<typename Derived>
11154 ExprResult
11155 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11156   return getDerived().TransformCXXNamedCastExpr(E);
11157 }
11158 
11159 template<typename Derived>
11160 ExprResult
11161 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11162   return getDerived().TransformCXXNamedCastExpr(E);
11163 }
11164 
11165 template<typename Derived>
11166 ExprResult
11167 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11168                                                      CXXFunctionalCastExpr *E) {
11169   TypeSourceInfo *Type =
11170       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11171   if (!Type)
11172     return ExprError();
11173 
11174   ExprResult SubExpr
11175     = getDerived().TransformExpr(E->getSubExprAsWritten());
11176   if (SubExpr.isInvalid())
11177     return ExprError();
11178 
11179   if (!getDerived().AlwaysRebuild() &&
11180       Type == E->getTypeInfoAsWritten() &&
11181       SubExpr.get() == E->getSubExpr())
11182     return E;
11183 
11184   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11185                                                    E->getLParenLoc(),
11186                                                    SubExpr.get(),
11187                                                    E->getRParenLoc(),
11188                                                    E->isListInitialization());
11189 }
11190 
11191 template<typename Derived>
11192 ExprResult
11193 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11194   if (E->isTypeOperand()) {
11195     TypeSourceInfo *TInfo
11196       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11197     if (!TInfo)
11198       return ExprError();
11199 
11200     if (!getDerived().AlwaysRebuild() &&
11201         TInfo == E->getTypeOperandSourceInfo())
11202       return E;
11203 
11204     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11205                                              TInfo, E->getEndLoc());
11206   }
11207 
11208   // We don't know whether the subexpression is potentially evaluated until
11209   // after we perform semantic analysis.  We speculatively assume it is
11210   // unevaluated; it will get fixed later if the subexpression is in fact
11211   // potentially evaluated.
11212   EnterExpressionEvaluationContext Unevaluated(
11213       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11214       Sema::ReuseLambdaContextDecl);
11215 
11216   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11217   if (SubExpr.isInvalid())
11218     return ExprError();
11219 
11220   if (!getDerived().AlwaysRebuild() &&
11221       SubExpr.get() == E->getExprOperand())
11222     return E;
11223 
11224   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11225                                            SubExpr.get(), E->getEndLoc());
11226 }
11227 
11228 template<typename Derived>
11229 ExprResult
11230 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11231   if (E->isTypeOperand()) {
11232     TypeSourceInfo *TInfo
11233       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11234     if (!TInfo)
11235       return ExprError();
11236 
11237     if (!getDerived().AlwaysRebuild() &&
11238         TInfo == E->getTypeOperandSourceInfo())
11239       return E;
11240 
11241     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11242                                              TInfo, E->getEndLoc());
11243   }
11244 
11245   EnterExpressionEvaluationContext Unevaluated(
11246       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11247 
11248   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11249   if (SubExpr.isInvalid())
11250     return ExprError();
11251 
11252   if (!getDerived().AlwaysRebuild() &&
11253       SubExpr.get() == E->getExprOperand())
11254     return E;
11255 
11256   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11257                                            SubExpr.get(), E->getEndLoc());
11258 }
11259 
11260 template<typename Derived>
11261 ExprResult
11262 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11263   return E;
11264 }
11265 
11266 template<typename Derived>
11267 ExprResult
11268 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11269                                                      CXXNullPtrLiteralExpr *E) {
11270   return E;
11271 }
11272 
11273 template<typename Derived>
11274 ExprResult
11275 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11276   QualType T = getSema().getCurrentThisType();
11277 
11278   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11279     // Mark it referenced in the new context regardless.
11280     // FIXME: this is a bit instantiation-specific.
11281     getSema().MarkThisReferenced(E);
11282     return E;
11283   }
11284 
11285   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11286 }
11287 
11288 template<typename Derived>
11289 ExprResult
11290 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11291   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11292   if (SubExpr.isInvalid())
11293     return ExprError();
11294 
11295   if (!getDerived().AlwaysRebuild() &&
11296       SubExpr.get() == E->getSubExpr())
11297     return E;
11298 
11299   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11300                                           E->isThrownVariableInScope());
11301 }
11302 
11303 template<typename Derived>
11304 ExprResult
11305 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11306   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11307       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11308   if (!Param)
11309     return ExprError();
11310 
11311   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11312       E->getUsedContext() == SemaRef.CurContext)
11313     return E;
11314 
11315   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11316 }
11317 
11318 template<typename Derived>
11319 ExprResult
11320 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11321   FieldDecl *Field = cast_or_null<FieldDecl>(
11322       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11323   if (!Field)
11324     return ExprError();
11325 
11326   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11327       E->getUsedContext() == SemaRef.CurContext)
11328     return E;
11329 
11330   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11331 }
11332 
11333 template<typename Derived>
11334 ExprResult
11335 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11336                                                     CXXScalarValueInitExpr *E) {
11337   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11338   if (!T)
11339     return ExprError();
11340 
11341   if (!getDerived().AlwaysRebuild() &&
11342       T == E->getTypeSourceInfo())
11343     return E;
11344 
11345   return getDerived().RebuildCXXScalarValueInitExpr(T,
11346                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11347                                                     E->getRParenLoc());
11348 }
11349 
11350 template<typename Derived>
11351 ExprResult
11352 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11353   // Transform the type that we're allocating
11354   TypeSourceInfo *AllocTypeInfo =
11355       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11356   if (!AllocTypeInfo)
11357     return ExprError();
11358 
11359   // Transform the size of the array we're allocating (if any).
11360   Optional<Expr *> ArraySize;
11361   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11362     ExprResult NewArraySize;
11363     if (*OldArraySize) {
11364       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11365       if (NewArraySize.isInvalid())
11366         return ExprError();
11367     }
11368     ArraySize = NewArraySize.get();
11369   }
11370 
11371   // Transform the placement arguments (if any).
11372   bool ArgumentChanged = false;
11373   SmallVector<Expr*, 8> PlacementArgs;
11374   if (getDerived().TransformExprs(E->getPlacementArgs(),
11375                                   E->getNumPlacementArgs(), true,
11376                                   PlacementArgs, &ArgumentChanged))
11377     return ExprError();
11378 
11379   // Transform the initializer (if any).
11380   Expr *OldInit = E->getInitializer();
11381   ExprResult NewInit;
11382   if (OldInit)
11383     NewInit = getDerived().TransformInitializer(OldInit, true);
11384   if (NewInit.isInvalid())
11385     return ExprError();
11386 
11387   // Transform new operator and delete operator.
11388   FunctionDecl *OperatorNew = nullptr;
11389   if (E->getOperatorNew()) {
11390     OperatorNew = cast_or_null<FunctionDecl>(
11391         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11392     if (!OperatorNew)
11393       return ExprError();
11394   }
11395 
11396   FunctionDecl *OperatorDelete = nullptr;
11397   if (E->getOperatorDelete()) {
11398     OperatorDelete = cast_or_null<FunctionDecl>(
11399         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11400     if (!OperatorDelete)
11401       return ExprError();
11402   }
11403 
11404   if (!getDerived().AlwaysRebuild() &&
11405       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11406       ArraySize == E->getArraySize() &&
11407       NewInit.get() == OldInit &&
11408       OperatorNew == E->getOperatorNew() &&
11409       OperatorDelete == E->getOperatorDelete() &&
11410       !ArgumentChanged) {
11411     // Mark any declarations we need as referenced.
11412     // FIXME: instantiation-specific.
11413     if (OperatorNew)
11414       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11415     if (OperatorDelete)
11416       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11417 
11418     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11419       QualType ElementType
11420         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11421       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11422         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11423         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11424           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11425         }
11426       }
11427     }
11428 
11429     return E;
11430   }
11431 
11432   QualType AllocType = AllocTypeInfo->getType();
11433   if (!ArraySize) {
11434     // If no array size was specified, but the new expression was
11435     // instantiated with an array type (e.g., "new T" where T is
11436     // instantiated with "int[4]"), extract the outer bound from the
11437     // array type as our array size. We do this with constant and
11438     // dependently-sized array types.
11439     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11440     if (!ArrayT) {
11441       // Do nothing
11442     } else if (const ConstantArrayType *ConsArrayT
11443                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11444       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11445                                          SemaRef.Context.getSizeType(),
11446                                          /*FIXME:*/ E->getBeginLoc());
11447       AllocType = ConsArrayT->getElementType();
11448     } else if (const DependentSizedArrayType *DepArrayT
11449                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11450       if (DepArrayT->getSizeExpr()) {
11451         ArraySize = DepArrayT->getSizeExpr();
11452         AllocType = DepArrayT->getElementType();
11453       }
11454     }
11455   }
11456 
11457   return getDerived().RebuildCXXNewExpr(
11458       E->getBeginLoc(), E->isGlobalNew(),
11459       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11460       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11461       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11462 }
11463 
11464 template<typename Derived>
11465 ExprResult
11466 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11467   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11468   if (Operand.isInvalid())
11469     return ExprError();
11470 
11471   // Transform the delete operator, if known.
11472   FunctionDecl *OperatorDelete = nullptr;
11473   if (E->getOperatorDelete()) {
11474     OperatorDelete = cast_or_null<FunctionDecl>(
11475         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11476     if (!OperatorDelete)
11477       return ExprError();
11478   }
11479 
11480   if (!getDerived().AlwaysRebuild() &&
11481       Operand.get() == E->getArgument() &&
11482       OperatorDelete == E->getOperatorDelete()) {
11483     // Mark any declarations we need as referenced.
11484     // FIXME: instantiation-specific.
11485     if (OperatorDelete)
11486       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11487 
11488     if (!E->getArgument()->isTypeDependent()) {
11489       QualType Destroyed = SemaRef.Context.getBaseElementType(
11490                                                          E->getDestroyedType());
11491       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11492         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11493         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11494                                        SemaRef.LookupDestructor(Record));
11495       }
11496     }
11497 
11498     return E;
11499   }
11500 
11501   return getDerived().RebuildCXXDeleteExpr(
11502       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11503 }
11504 
11505 template<typename Derived>
11506 ExprResult
11507 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11508                                                      CXXPseudoDestructorExpr *E) {
11509   ExprResult Base = getDerived().TransformExpr(E->getBase());
11510   if (Base.isInvalid())
11511     return ExprError();
11512 
11513   ParsedType ObjectTypePtr;
11514   bool MayBePseudoDestructor = false;
11515   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11516                                               E->getOperatorLoc(),
11517                                         E->isArrow()? tok::arrow : tok::period,
11518                                               ObjectTypePtr,
11519                                               MayBePseudoDestructor);
11520   if (Base.isInvalid())
11521     return ExprError();
11522 
11523   QualType ObjectType = ObjectTypePtr.get();
11524   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11525   if (QualifierLoc) {
11526     QualifierLoc
11527       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11528     if (!QualifierLoc)
11529       return ExprError();
11530   }
11531   CXXScopeSpec SS;
11532   SS.Adopt(QualifierLoc);
11533 
11534   PseudoDestructorTypeStorage Destroyed;
11535   if (E->getDestroyedTypeInfo()) {
11536     TypeSourceInfo *DestroyedTypeInfo
11537       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11538                                                 ObjectType, nullptr, SS);
11539     if (!DestroyedTypeInfo)
11540       return ExprError();
11541     Destroyed = DestroyedTypeInfo;
11542   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11543     // We aren't likely to be able to resolve the identifier down to a type
11544     // now anyway, so just retain the identifier.
11545     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11546                                             E->getDestroyedTypeLoc());
11547   } else {
11548     // Look for a destructor known with the given name.
11549     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11550                                               *E->getDestroyedTypeIdentifier(),
11551                                                 E->getDestroyedTypeLoc(),
11552                                                 /*Scope=*/nullptr,
11553                                                 SS, ObjectTypePtr,
11554                                                 false);
11555     if (!T)
11556       return ExprError();
11557 
11558     Destroyed
11559       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11560                                                  E->getDestroyedTypeLoc());
11561   }
11562 
11563   TypeSourceInfo *ScopeTypeInfo = nullptr;
11564   if (E->getScopeTypeInfo()) {
11565     CXXScopeSpec EmptySS;
11566     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11567                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11568     if (!ScopeTypeInfo)
11569       return ExprError();
11570   }
11571 
11572   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11573                                                      E->getOperatorLoc(),
11574                                                      E->isArrow(),
11575                                                      SS,
11576                                                      ScopeTypeInfo,
11577                                                      E->getColonColonLoc(),
11578                                                      E->getTildeLoc(),
11579                                                      Destroyed);
11580 }
11581 
11582 template <typename Derived>
11583 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11584                                                         bool RequiresADL,
11585                                                         LookupResult &R) {
11586   // Transform all the decls.
11587   bool AllEmptyPacks = true;
11588   for (auto *OldD : Old->decls()) {
11589     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11590     if (!InstD) {
11591       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11592       // This can happen because of dependent hiding.
11593       if (isa<UsingShadowDecl>(OldD))
11594         continue;
11595       else {
11596         R.clear();
11597         return true;
11598       }
11599     }
11600 
11601     // Expand using pack declarations.
11602     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11603     ArrayRef<NamedDecl*> Decls = SingleDecl;
11604     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11605       Decls = UPD->expansions();
11606 
11607     // Expand using declarations.
11608     for (auto *D : Decls) {
11609       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11610         for (auto *SD : UD->shadows())
11611           R.addDecl(SD);
11612       } else {
11613         R.addDecl(D);
11614       }
11615     }
11616 
11617     AllEmptyPacks &= Decls.empty();
11618   };
11619 
11620   // C++ [temp.res]/8.4.2:
11621   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11622   //   a name in the template definition found a using-declaration, but the
11623   //   lookup in the corresponding scope in the instantiation odoes not find
11624   //   any declarations because the using-declaration was a pack expansion and
11625   //   the corresponding pack is empty
11626   if (AllEmptyPacks && !RequiresADL) {
11627     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11628         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11629     return true;
11630   }
11631 
11632   // Resolve a kind, but don't do any further analysis.  If it's
11633   // ambiguous, the callee needs to deal with it.
11634   R.resolveKind();
11635   return false;
11636 }
11637 
11638 template<typename Derived>
11639 ExprResult
11640 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11641                                                   UnresolvedLookupExpr *Old) {
11642   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11643                  Sema::LookupOrdinaryName);
11644 
11645   // Transform the declaration set.
11646   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11647     return ExprError();
11648 
11649   // Rebuild the nested-name qualifier, if present.
11650   CXXScopeSpec SS;
11651   if (Old->getQualifierLoc()) {
11652     NestedNameSpecifierLoc QualifierLoc
11653       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11654     if (!QualifierLoc)
11655       return ExprError();
11656 
11657     SS.Adopt(QualifierLoc);
11658   }
11659 
11660   if (Old->getNamingClass()) {
11661     CXXRecordDecl *NamingClass
11662       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11663                                                             Old->getNameLoc(),
11664                                                         Old->getNamingClass()));
11665     if (!NamingClass) {
11666       R.clear();
11667       return ExprError();
11668     }
11669 
11670     R.setNamingClass(NamingClass);
11671   }
11672 
11673   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11674 
11675   // If we have neither explicit template arguments, nor the template keyword,
11676   // it's a normal declaration name or member reference.
11677   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11678     NamedDecl *D = R.getAsSingle<NamedDecl>();
11679     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11680     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11681     // give a good diagnostic.
11682     if (D && D->isCXXInstanceMember()) {
11683       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11684                                                      /*TemplateArgs=*/nullptr,
11685                                                      /*Scope=*/nullptr);
11686     }
11687 
11688     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11689   }
11690 
11691   // If we have template arguments, rebuild them, then rebuild the
11692   // templateid expression.
11693   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11694   if (Old->hasExplicitTemplateArgs() &&
11695       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11696                                               Old->getNumTemplateArgs(),
11697                                               TransArgs)) {
11698     R.clear();
11699     return ExprError();
11700   }
11701 
11702   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11703                                             Old->requiresADL(), &TransArgs);
11704 }
11705 
11706 template<typename Derived>
11707 ExprResult
11708 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11709   bool ArgChanged = false;
11710   SmallVector<TypeSourceInfo *, 4> Args;
11711   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11712     TypeSourceInfo *From = E->getArg(I);
11713     TypeLoc FromTL = From->getTypeLoc();
11714     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11715       TypeLocBuilder TLB;
11716       TLB.reserve(FromTL.getFullDataSize());
11717       QualType To = getDerived().TransformType(TLB, FromTL);
11718       if (To.isNull())
11719         return ExprError();
11720 
11721       if (To == From->getType())
11722         Args.push_back(From);
11723       else {
11724         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11725         ArgChanged = true;
11726       }
11727       continue;
11728     }
11729 
11730     ArgChanged = true;
11731 
11732     // We have a pack expansion. Instantiate it.
11733     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11734     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11735     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11736     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11737 
11738     // Determine whether the set of unexpanded parameter packs can and should
11739     // be expanded.
11740     bool Expand = true;
11741     bool RetainExpansion = false;
11742     Optional<unsigned> OrigNumExpansions =
11743         ExpansionTL.getTypePtr()->getNumExpansions();
11744     Optional<unsigned> NumExpansions = OrigNumExpansions;
11745     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11746                                              PatternTL.getSourceRange(),
11747                                              Unexpanded,
11748                                              Expand, RetainExpansion,
11749                                              NumExpansions))
11750       return ExprError();
11751 
11752     if (!Expand) {
11753       // The transform has determined that we should perform a simple
11754       // transformation on the pack expansion, producing another pack
11755       // expansion.
11756       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11757 
11758       TypeLocBuilder TLB;
11759       TLB.reserve(From->getTypeLoc().getFullDataSize());
11760 
11761       QualType To = getDerived().TransformType(TLB, PatternTL);
11762       if (To.isNull())
11763         return ExprError();
11764 
11765       To = getDerived().RebuildPackExpansionType(To,
11766                                                  PatternTL.getSourceRange(),
11767                                                  ExpansionTL.getEllipsisLoc(),
11768                                                  NumExpansions);
11769       if (To.isNull())
11770         return ExprError();
11771 
11772       PackExpansionTypeLoc ToExpansionTL
11773         = TLB.push<PackExpansionTypeLoc>(To);
11774       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11775       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11776       continue;
11777     }
11778 
11779     // Expand the pack expansion by substituting for each argument in the
11780     // pack(s).
11781     for (unsigned I = 0; I != *NumExpansions; ++I) {
11782       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11783       TypeLocBuilder TLB;
11784       TLB.reserve(PatternTL.getFullDataSize());
11785       QualType To = getDerived().TransformType(TLB, PatternTL);
11786       if (To.isNull())
11787         return ExprError();
11788 
11789       if (To->containsUnexpandedParameterPack()) {
11790         To = getDerived().RebuildPackExpansionType(To,
11791                                                    PatternTL.getSourceRange(),
11792                                                    ExpansionTL.getEllipsisLoc(),
11793                                                    NumExpansions);
11794         if (To.isNull())
11795           return ExprError();
11796 
11797         PackExpansionTypeLoc ToExpansionTL
11798           = TLB.push<PackExpansionTypeLoc>(To);
11799         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11800       }
11801 
11802       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11803     }
11804 
11805     if (!RetainExpansion)
11806       continue;
11807 
11808     // If we're supposed to retain a pack expansion, do so by temporarily
11809     // forgetting the partially-substituted parameter pack.
11810     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11811 
11812     TypeLocBuilder TLB;
11813     TLB.reserve(From->getTypeLoc().getFullDataSize());
11814 
11815     QualType To = getDerived().TransformType(TLB, PatternTL);
11816     if (To.isNull())
11817       return ExprError();
11818 
11819     To = getDerived().RebuildPackExpansionType(To,
11820                                                PatternTL.getSourceRange(),
11821                                                ExpansionTL.getEllipsisLoc(),
11822                                                NumExpansions);
11823     if (To.isNull())
11824       return ExprError();
11825 
11826     PackExpansionTypeLoc ToExpansionTL
11827       = TLB.push<PackExpansionTypeLoc>(To);
11828     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11829     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11830   }
11831 
11832   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11833     return E;
11834 
11835   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11836                                        E->getEndLoc());
11837 }
11838 
11839 template<typename Derived>
11840 ExprResult
11841 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11842                                                  ConceptSpecializationExpr *E) {
11843   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11844   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11845   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11846                                               Old->NumTemplateArgs, TransArgs))
11847     return ExprError();
11848 
11849   return getDerived().RebuildConceptSpecializationExpr(
11850       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11851       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11852       &TransArgs);
11853 }
11854 
11855 template<typename Derived>
11856 ExprResult
11857 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11858   SmallVector<ParmVarDecl*, 4> TransParams;
11859   SmallVector<QualType, 4> TransParamTypes;
11860   Sema::ExtParameterInfoBuilder ExtParamInfos;
11861 
11862   // C++2a [expr.prim.req]p2
11863   // Expressions appearing within a requirement-body are unevaluated operands.
11864   EnterExpressionEvaluationContext Ctx(
11865       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11866 
11867   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11868       getSema().Context, getSema().CurContext,
11869       E->getBody()->getBeginLoc());
11870 
11871   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11872 
11873   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11874                                                E->getLocalParameters(),
11875                                                /*ParamTypes=*/nullptr,
11876                                                /*ParamInfos=*/nullptr,
11877                                                TransParamTypes, &TransParams,
11878                                                ExtParamInfos))
11879     return ExprError();
11880 
11881   for (ParmVarDecl *Param : TransParams)
11882     Param->setDeclContext(Body);
11883 
11884   SmallVector<concepts::Requirement *, 4> TransReqs;
11885   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
11886                                                      TransReqs))
11887     return ExprError();
11888 
11889   for (concepts::Requirement *Req : TransReqs) {
11890     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
11891       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
11892         ER->getReturnTypeRequirement()
11893                 .getTypeConstraintTemplateParameterList()->getParam(0)
11894                 ->setDeclContext(Body);
11895       }
11896     }
11897   }
11898 
11899   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
11900                                           TransParams, TransReqs,
11901                                           E->getRBraceLoc());
11902 }
11903 
11904 template<typename Derived>
11905 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
11906     ArrayRef<concepts::Requirement *> Reqs,
11907     SmallVectorImpl<concepts::Requirement *> &Transformed) {
11908   for (concepts::Requirement *Req : Reqs) {
11909     concepts::Requirement *TransReq = nullptr;
11910     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
11911       TransReq = getDerived().TransformTypeRequirement(TypeReq);
11912     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
11913       TransReq = getDerived().TransformExprRequirement(ExprReq);
11914     else
11915       TransReq = getDerived().TransformNestedRequirement(
11916                      cast<concepts::NestedRequirement>(Req));
11917     if (!TransReq)
11918       return true;
11919     Transformed.push_back(TransReq);
11920   }
11921   return false;
11922 }
11923 
11924 template<typename Derived>
11925 concepts::TypeRequirement *
11926 TreeTransform<Derived>::TransformTypeRequirement(
11927     concepts::TypeRequirement *Req) {
11928   if (Req->isSubstitutionFailure()) {
11929     if (getDerived().AlwaysRebuild())
11930       return getDerived().RebuildTypeRequirement(
11931               Req->getSubstitutionDiagnostic());
11932     return Req;
11933   }
11934   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
11935   if (!TransType)
11936     return nullptr;
11937   return getDerived().RebuildTypeRequirement(TransType);
11938 }
11939 
11940 template<typename Derived>
11941 concepts::ExprRequirement *
11942 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
11943   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
11944   if (Req->isExprSubstitutionFailure())
11945     TransExpr = Req->getExprSubstitutionDiagnostic();
11946   else {
11947     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
11948     if (TransExprRes.isInvalid())
11949       return nullptr;
11950     TransExpr = TransExprRes.get();
11951   }
11952 
11953   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
11954   const auto &RetReq = Req->getReturnTypeRequirement();
11955   if (RetReq.isEmpty())
11956     TransRetReq.emplace();
11957   else if (RetReq.isSubstitutionFailure())
11958     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
11959   else if (RetReq.isTypeConstraint()) {
11960     TemplateParameterList *OrigTPL =
11961         RetReq.getTypeConstraintTemplateParameterList();
11962     TemplateParameterList *TPL =
11963         getDerived().TransformTemplateParameterList(OrigTPL);
11964     if (!TPL)
11965       return nullptr;
11966     TransRetReq.emplace(TPL);
11967   }
11968   assert(TransRetReq.hasValue() &&
11969          "All code paths leading here must set TransRetReq");
11970   if (Expr *E = TransExpr.dyn_cast<Expr *>())
11971     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
11972                                                Req->getNoexceptLoc(),
11973                                                std::move(*TransRetReq));
11974   return getDerived().RebuildExprRequirement(
11975       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
11976       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
11977 }
11978 
11979 template<typename Derived>
11980 concepts::NestedRequirement *
11981 TreeTransform<Derived>::TransformNestedRequirement(
11982     concepts::NestedRequirement *Req) {
11983   if (Req->isSubstitutionFailure()) {
11984     if (getDerived().AlwaysRebuild())
11985       return getDerived().RebuildNestedRequirement(
11986           Req->getSubstitutionDiagnostic());
11987     return Req;
11988   }
11989   ExprResult TransConstraint =
11990       getDerived().TransformExpr(Req->getConstraintExpr());
11991   if (TransConstraint.isInvalid())
11992     return nullptr;
11993   return getDerived().RebuildNestedRequirement(TransConstraint.get());
11994 }
11995 
11996 template<typename Derived>
11997 ExprResult
11998 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
11999   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12000   if (!T)
12001     return ExprError();
12002 
12003   if (!getDerived().AlwaysRebuild() &&
12004       T == E->getQueriedTypeSourceInfo())
12005     return E;
12006 
12007   ExprResult SubExpr;
12008   {
12009     EnterExpressionEvaluationContext Unevaluated(
12010         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12011     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12012     if (SubExpr.isInvalid())
12013       return ExprError();
12014 
12015     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12016       return E;
12017   }
12018 
12019   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12020                                             SubExpr.get(), E->getEndLoc());
12021 }
12022 
12023 template<typename Derived>
12024 ExprResult
12025 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12026   ExprResult SubExpr;
12027   {
12028     EnterExpressionEvaluationContext Unevaluated(
12029         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12030     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12031     if (SubExpr.isInvalid())
12032       return ExprError();
12033 
12034     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12035       return E;
12036   }
12037 
12038   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12039                                              SubExpr.get(), E->getEndLoc());
12040 }
12041 
12042 template <typename Derived>
12043 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12044     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12045     TypeSourceInfo **RecoveryTSI) {
12046   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12047       DRE, AddrTaken, RecoveryTSI);
12048 
12049   // Propagate both errors and recovered types, which return ExprEmpty.
12050   if (!NewDRE.isUsable())
12051     return NewDRE;
12052 
12053   // We got an expr, wrap it up in parens.
12054   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12055     return PE;
12056   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12057                                        PE->getRParen());
12058 }
12059 
12060 template <typename Derived>
12061 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12062     DependentScopeDeclRefExpr *E) {
12063   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12064                                             nullptr);
12065 }
12066 
12067 template<typename Derived>
12068 ExprResult
12069 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12070                                                DependentScopeDeclRefExpr *E,
12071                                                bool IsAddressOfOperand,
12072                                                TypeSourceInfo **RecoveryTSI) {
12073   assert(E->getQualifierLoc());
12074   NestedNameSpecifierLoc QualifierLoc
12075   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12076   if (!QualifierLoc)
12077     return ExprError();
12078   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12079 
12080   // TODO: If this is a conversion-function-id, verify that the
12081   // destination type name (if present) resolves the same way after
12082   // instantiation as it did in the local scope.
12083 
12084   DeclarationNameInfo NameInfo
12085     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12086   if (!NameInfo.getName())
12087     return ExprError();
12088 
12089   if (!E->hasExplicitTemplateArgs()) {
12090     if (!getDerived().AlwaysRebuild() &&
12091         QualifierLoc == E->getQualifierLoc() &&
12092         // Note: it is sufficient to compare the Name component of NameInfo:
12093         // if name has not changed, DNLoc has not changed either.
12094         NameInfo.getName() == E->getDeclName())
12095       return E;
12096 
12097     return getDerived().RebuildDependentScopeDeclRefExpr(
12098         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12099         IsAddressOfOperand, RecoveryTSI);
12100   }
12101 
12102   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12103   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12104                                               E->getNumTemplateArgs(),
12105                                               TransArgs))
12106     return ExprError();
12107 
12108   return getDerived().RebuildDependentScopeDeclRefExpr(
12109       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12110       RecoveryTSI);
12111 }
12112 
12113 template<typename Derived>
12114 ExprResult
12115 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12116   // CXXConstructExprs other than for list-initialization and
12117   // CXXTemporaryObjectExpr are always implicit, so when we have
12118   // a 1-argument construction we just transform that argument.
12119   if (getDerived().AllowSkippingCXXConstructExpr() &&
12120       ((E->getNumArgs() == 1 ||
12121         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12122        (!getDerived().DropCallArgument(E->getArg(0))) &&
12123        !E->isListInitialization()))
12124     return getDerived().TransformExpr(E->getArg(0));
12125 
12126   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12127 
12128   QualType T = getDerived().TransformType(E->getType());
12129   if (T.isNull())
12130     return ExprError();
12131 
12132   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12133       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12134   if (!Constructor)
12135     return ExprError();
12136 
12137   bool ArgumentChanged = false;
12138   SmallVector<Expr*, 8> Args;
12139   {
12140     EnterExpressionEvaluationContext Context(
12141         getSema(), EnterExpressionEvaluationContext::InitList,
12142         E->isListInitialization());
12143     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12144                                     &ArgumentChanged))
12145       return ExprError();
12146   }
12147 
12148   if (!getDerived().AlwaysRebuild() &&
12149       T == E->getType() &&
12150       Constructor == E->getConstructor() &&
12151       !ArgumentChanged) {
12152     // Mark the constructor as referenced.
12153     // FIXME: Instantiation-specific
12154     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12155     return E;
12156   }
12157 
12158   return getDerived().RebuildCXXConstructExpr(
12159       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12160       E->hadMultipleCandidates(), E->isListInitialization(),
12161       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12162       E->getConstructionKind(), E->getParenOrBraceRange());
12163 }
12164 
12165 template<typename Derived>
12166 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12167     CXXInheritedCtorInitExpr *E) {
12168   QualType T = getDerived().TransformType(E->getType());
12169   if (T.isNull())
12170     return ExprError();
12171 
12172   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12173       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12174   if (!Constructor)
12175     return ExprError();
12176 
12177   if (!getDerived().AlwaysRebuild() &&
12178       T == E->getType() &&
12179       Constructor == E->getConstructor()) {
12180     // Mark the constructor as referenced.
12181     // FIXME: Instantiation-specific
12182     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12183     return E;
12184   }
12185 
12186   return getDerived().RebuildCXXInheritedCtorInitExpr(
12187       T, E->getLocation(), Constructor,
12188       E->constructsVBase(), E->inheritedFromVBase());
12189 }
12190 
12191 /// Transform a C++ temporary-binding expression.
12192 ///
12193 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12194 /// transform the subexpression and return that.
12195 template<typename Derived>
12196 ExprResult
12197 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12198   return getDerived().TransformExpr(E->getSubExpr());
12199 }
12200 
12201 /// Transform a C++ expression that contains cleanups that should
12202 /// be run after the expression is evaluated.
12203 ///
12204 /// Since ExprWithCleanups nodes are implicitly generated, we
12205 /// just transform the subexpression and return that.
12206 template<typename Derived>
12207 ExprResult
12208 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12209   return getDerived().TransformExpr(E->getSubExpr());
12210 }
12211 
12212 template<typename Derived>
12213 ExprResult
12214 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12215                                                     CXXTemporaryObjectExpr *E) {
12216   TypeSourceInfo *T =
12217       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12218   if (!T)
12219     return ExprError();
12220 
12221   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12222       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12223   if (!Constructor)
12224     return ExprError();
12225 
12226   bool ArgumentChanged = false;
12227   SmallVector<Expr*, 8> Args;
12228   Args.reserve(E->getNumArgs());
12229   {
12230     EnterExpressionEvaluationContext Context(
12231         getSema(), EnterExpressionEvaluationContext::InitList,
12232         E->isListInitialization());
12233     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12234                        &ArgumentChanged))
12235       return ExprError();
12236   }
12237 
12238   if (!getDerived().AlwaysRebuild() &&
12239       T == E->getTypeSourceInfo() &&
12240       Constructor == E->getConstructor() &&
12241       !ArgumentChanged) {
12242     // FIXME: Instantiation-specific
12243     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12244     return SemaRef.MaybeBindToTemporary(E);
12245   }
12246 
12247   // FIXME: We should just pass E->isListInitialization(), but we're not
12248   // prepared to handle list-initialization without a child InitListExpr.
12249   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12250   return getDerived().RebuildCXXTemporaryObjectExpr(
12251       T, LParenLoc, Args, E->getEndLoc(),
12252       /*ListInitialization=*/LParenLoc.isInvalid());
12253 }
12254 
12255 template<typename Derived>
12256 ExprResult
12257 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12258   // Transform any init-capture expressions before entering the scope of the
12259   // lambda body, because they are not semantically within that scope.
12260   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12261   struct TransformedInitCapture {
12262     // The location of the ... if the result is retaining a pack expansion.
12263     SourceLocation EllipsisLoc;
12264     // Zero or more expansions of the init-capture.
12265     SmallVector<InitCaptureInfoTy, 4> Expansions;
12266   };
12267   SmallVector<TransformedInitCapture, 4> InitCaptures;
12268   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12269   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12270                                     CEnd = E->capture_end();
12271        C != CEnd; ++C) {
12272     if (!E->isInitCapture(C))
12273       continue;
12274 
12275     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12276     VarDecl *OldVD = C->getCapturedVar();
12277 
12278     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12279                                 Optional<unsigned> NumExpansions) {
12280       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12281           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12282 
12283       if (NewExprInitResult.isInvalid()) {
12284         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12285         return;
12286       }
12287       Expr *NewExprInit = NewExprInitResult.get();
12288 
12289       QualType NewInitCaptureType =
12290           getSema().buildLambdaInitCaptureInitialization(
12291               C->getLocation(), OldVD->getType()->isReferenceType(),
12292               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12293               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12294               NewExprInit);
12295       Result.Expansions.push_back(
12296           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12297     };
12298 
12299     // If this is an init-capture pack, consider expanding the pack now.
12300     if (OldVD->isParameterPack()) {
12301       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12302                                              ->getTypeLoc()
12303                                              .castAs<PackExpansionTypeLoc>();
12304       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12305       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12306 
12307       // Determine whether the set of unexpanded parameter packs can and should
12308       // be expanded.
12309       bool Expand = true;
12310       bool RetainExpansion = false;
12311       Optional<unsigned> OrigNumExpansions =
12312           ExpansionTL.getTypePtr()->getNumExpansions();
12313       Optional<unsigned> NumExpansions = OrigNumExpansions;
12314       if (getDerived().TryExpandParameterPacks(
12315               ExpansionTL.getEllipsisLoc(),
12316               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12317               RetainExpansion, NumExpansions))
12318         return ExprError();
12319       if (Expand) {
12320         for (unsigned I = 0; I != *NumExpansions; ++I) {
12321           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12322           SubstInitCapture(SourceLocation(), None);
12323         }
12324       }
12325       if (!Expand || RetainExpansion) {
12326         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12327         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12328         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12329       }
12330     } else {
12331       SubstInitCapture(SourceLocation(), None);
12332     }
12333   }
12334 
12335   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12336   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12337 
12338   // Transform the template parameters, and add them to the current
12339   // instantiation scope. The null case is handled correctly.
12340   auto TPL = getDerived().TransformTemplateParameterList(
12341       E->getTemplateParameterList());
12342   LSI->GLTemplateParameterList = TPL;
12343 
12344   // Transform the type of the original lambda's call operator.
12345   // The transformation MUST be done in the CurrentInstantiationScope since
12346   // it introduces a mapping of the original to the newly created
12347   // transformed parameters.
12348   TypeSourceInfo *NewCallOpTSI = nullptr;
12349   {
12350     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12351     FunctionProtoTypeLoc OldCallOpFPTL =
12352         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12353 
12354     TypeLocBuilder NewCallOpTLBuilder;
12355     SmallVector<QualType, 4> ExceptionStorage;
12356     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12357     QualType NewCallOpType = TransformFunctionProtoType(
12358         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12359         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12360           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12361                                               ExceptionStorage, Changed);
12362         });
12363     if (NewCallOpType.isNull())
12364       return ExprError();
12365     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12366                                                         NewCallOpType);
12367   }
12368 
12369   // Transform the trailing requires clause
12370   ExprResult NewTrailingRequiresClause;
12371   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12372     // FIXME: Concepts: Substitution into requires clause should only happen
12373     //                  when checking satisfaction.
12374     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12375 
12376   // Create the local class that will describe the lambda.
12377   // FIXME: KnownDependent below is wrong when substituting inside a templated
12378   // context that isn't a DeclContext (such as a variable template).
12379   CXXRecordDecl *OldClass = E->getLambdaClass();
12380   CXXRecordDecl *Class
12381     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12382                                         NewCallOpTSI,
12383                                         /*KnownDependent=*/false,
12384                                         E->getCaptureDefault());
12385   getDerived().transformedLocalDecl(OldClass, {Class});
12386 
12387   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
12388   if (getDerived().ReplacingOriginal())
12389     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
12390                                OldClass->hasKnownLambdaInternalLinkage(),
12391                                OldClass->getLambdaContextDecl());
12392 
12393   // Build the call operator.
12394   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12395       Class, E->getIntroducerRange(), NewCallOpTSI,
12396       E->getCallOperator()->getEndLoc(),
12397       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12398       E->getCallOperator()->getConstexprKind(),
12399       NewTrailingRequiresClause.get());
12400 
12401   LSI->CallOperator = NewCallOperator;
12402 
12403   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12404   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12405 
12406   // Number the lambda for linkage purposes if necessary.
12407   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12408 
12409   // Introduce the context of the call operator.
12410   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12411                                  /*NewThisContext*/false);
12412 
12413   // Enter the scope of the lambda.
12414   getSema().buildLambdaScope(LSI, NewCallOperator,
12415                              E->getIntroducerRange(),
12416                              E->getCaptureDefault(),
12417                              E->getCaptureDefaultLoc(),
12418                              E->hasExplicitParameters(),
12419                              E->hasExplicitResultType(),
12420                              E->isMutable());
12421 
12422   bool Invalid = false;
12423 
12424   // Transform captures.
12425   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12426                                  CEnd = E->capture_end();
12427        C != CEnd; ++C) {
12428     // When we hit the first implicit capture, tell Sema that we've finished
12429     // the list of explicit captures.
12430     if (C->isImplicit())
12431       break;
12432 
12433     // Capturing 'this' is trivial.
12434     if (C->capturesThis()) {
12435       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12436                                     /*BuildAndDiagnose*/ true, nullptr,
12437                                     C->getCaptureKind() == LCK_StarThis);
12438       continue;
12439     }
12440     // Captured expression will be recaptured during captured variables
12441     // rebuilding.
12442     if (C->capturesVLAType())
12443       continue;
12444 
12445     // Rebuild init-captures, including the implied field declaration.
12446     if (E->isInitCapture(C)) {
12447       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12448 
12449       VarDecl *OldVD = C->getCapturedVar();
12450       llvm::SmallVector<Decl*, 4> NewVDs;
12451 
12452       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12453         ExprResult Init = Info.first;
12454         QualType InitQualType = Info.second;
12455         if (Init.isInvalid() || InitQualType.isNull()) {
12456           Invalid = true;
12457           break;
12458         }
12459         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12460             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12461             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12462         if (!NewVD) {
12463           Invalid = true;
12464           break;
12465         }
12466         NewVDs.push_back(NewVD);
12467         getSema().addInitCapture(LSI, NewVD);
12468       }
12469 
12470       if (Invalid)
12471         break;
12472 
12473       getDerived().transformedLocalDecl(OldVD, NewVDs);
12474       continue;
12475     }
12476 
12477     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12478 
12479     // Determine the capture kind for Sema.
12480     Sema::TryCaptureKind Kind
12481       = C->isImplicit()? Sema::TryCapture_Implicit
12482                        : C->getCaptureKind() == LCK_ByCopy
12483                            ? Sema::TryCapture_ExplicitByVal
12484                            : Sema::TryCapture_ExplicitByRef;
12485     SourceLocation EllipsisLoc;
12486     if (C->isPackExpansion()) {
12487       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12488       bool ShouldExpand = false;
12489       bool RetainExpansion = false;
12490       Optional<unsigned> NumExpansions;
12491       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12492                                                C->getLocation(),
12493                                                Unexpanded,
12494                                                ShouldExpand, RetainExpansion,
12495                                                NumExpansions)) {
12496         Invalid = true;
12497         continue;
12498       }
12499 
12500       if (ShouldExpand) {
12501         // The transform has determined that we should perform an expansion;
12502         // transform and capture each of the arguments.
12503         // expansion of the pattern. Do so.
12504         VarDecl *Pack = C->getCapturedVar();
12505         for (unsigned I = 0; I != *NumExpansions; ++I) {
12506           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12507           VarDecl *CapturedVar
12508             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12509                                                                Pack));
12510           if (!CapturedVar) {
12511             Invalid = true;
12512             continue;
12513           }
12514 
12515           // Capture the transformed variable.
12516           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12517         }
12518 
12519         // FIXME: Retain a pack expansion if RetainExpansion is true.
12520 
12521         continue;
12522       }
12523 
12524       EllipsisLoc = C->getEllipsisLoc();
12525     }
12526 
12527     // Transform the captured variable.
12528     VarDecl *CapturedVar
12529       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12530                                                          C->getCapturedVar()));
12531     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12532       Invalid = true;
12533       continue;
12534     }
12535 
12536     // Capture the transformed variable.
12537     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12538                                  EllipsisLoc);
12539   }
12540   getSema().finishLambdaExplicitCaptures(LSI);
12541 
12542   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12543   // evaluation context even if we're not transforming the function body.
12544   getSema().PushExpressionEvaluationContext(
12545       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12546 
12547   // Instantiate the body of the lambda expression.
12548   StmtResult Body =
12549       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12550 
12551   // ActOnLambda* will pop the function scope for us.
12552   FuncScopeCleanup.disable();
12553 
12554   if (Body.isInvalid()) {
12555     SavedContext.pop();
12556     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12557                                /*IsInstantiation=*/true);
12558     return ExprError();
12559   }
12560 
12561   // Copy the LSI before ActOnFinishFunctionBody removes it.
12562   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12563   // the call operator.
12564   auto LSICopy = *LSI;
12565   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12566                                     /*IsInstantiation*/ true);
12567   SavedContext.pop();
12568 
12569   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12570                                    &LSICopy);
12571 }
12572 
12573 template<typename Derived>
12574 StmtResult
12575 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12576   return TransformStmt(S);
12577 }
12578 
12579 template<typename Derived>
12580 StmtResult
12581 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12582   // Transform captures.
12583   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12584                                  CEnd = E->capture_end();
12585        C != CEnd; ++C) {
12586     // When we hit the first implicit capture, tell Sema that we've finished
12587     // the list of explicit captures.
12588     if (!C->isImplicit())
12589       continue;
12590 
12591     // Capturing 'this' is trivial.
12592     if (C->capturesThis()) {
12593       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12594                                     /*BuildAndDiagnose*/ true, nullptr,
12595                                     C->getCaptureKind() == LCK_StarThis);
12596       continue;
12597     }
12598     // Captured expression will be recaptured during captured variables
12599     // rebuilding.
12600     if (C->capturesVLAType())
12601       continue;
12602 
12603     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12604     assert(!E->isInitCapture(C) && "implicit init-capture?");
12605 
12606     // Transform the captured variable.
12607     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12608         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12609     if (!CapturedVar || CapturedVar->isInvalidDecl())
12610       return StmtError();
12611 
12612     // Capture the transformed variable.
12613     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12614   }
12615 
12616   return S;
12617 }
12618 
12619 template<typename Derived>
12620 ExprResult
12621 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12622                                                   CXXUnresolvedConstructExpr *E) {
12623   TypeSourceInfo *T =
12624       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12625   if (!T)
12626     return ExprError();
12627 
12628   bool ArgumentChanged = false;
12629   SmallVector<Expr*, 8> Args;
12630   Args.reserve(E->arg_size());
12631   {
12632     EnterExpressionEvaluationContext Context(
12633         getSema(), EnterExpressionEvaluationContext::InitList,
12634         E->isListInitialization());
12635     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12636                                     &ArgumentChanged))
12637       return ExprError();
12638   }
12639 
12640   if (!getDerived().AlwaysRebuild() &&
12641       T == E->getTypeSourceInfo() &&
12642       !ArgumentChanged)
12643     return E;
12644 
12645   // FIXME: we're faking the locations of the commas
12646   return getDerived().RebuildCXXUnresolvedConstructExpr(
12647       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12648 }
12649 
12650 template<typename Derived>
12651 ExprResult
12652 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12653                                              CXXDependentScopeMemberExpr *E) {
12654   // Transform the base of the expression.
12655   ExprResult Base((Expr*) nullptr);
12656   Expr *OldBase;
12657   QualType BaseType;
12658   QualType ObjectType;
12659   if (!E->isImplicitAccess()) {
12660     OldBase = E->getBase();
12661     Base = getDerived().TransformExpr(OldBase);
12662     if (Base.isInvalid())
12663       return ExprError();
12664 
12665     // Start the member reference and compute the object's type.
12666     ParsedType ObjectTy;
12667     bool MayBePseudoDestructor = false;
12668     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12669                                                 E->getOperatorLoc(),
12670                                       E->isArrow()? tok::arrow : tok::period,
12671                                                 ObjectTy,
12672                                                 MayBePseudoDestructor);
12673     if (Base.isInvalid())
12674       return ExprError();
12675 
12676     ObjectType = ObjectTy.get();
12677     BaseType = ((Expr*) Base.get())->getType();
12678   } else {
12679     OldBase = nullptr;
12680     BaseType = getDerived().TransformType(E->getBaseType());
12681     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12682   }
12683 
12684   // Transform the first part of the nested-name-specifier that qualifies
12685   // the member name.
12686   NamedDecl *FirstQualifierInScope
12687     = getDerived().TransformFirstQualifierInScope(
12688                                             E->getFirstQualifierFoundInScope(),
12689                                             E->getQualifierLoc().getBeginLoc());
12690 
12691   NestedNameSpecifierLoc QualifierLoc;
12692   if (E->getQualifier()) {
12693     QualifierLoc
12694       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12695                                                      ObjectType,
12696                                                      FirstQualifierInScope);
12697     if (!QualifierLoc)
12698       return ExprError();
12699   }
12700 
12701   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12702 
12703   // TODO: If this is a conversion-function-id, verify that the
12704   // destination type name (if present) resolves the same way after
12705   // instantiation as it did in the local scope.
12706 
12707   DeclarationNameInfo NameInfo
12708     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12709   if (!NameInfo.getName())
12710     return ExprError();
12711 
12712   if (!E->hasExplicitTemplateArgs()) {
12713     // This is a reference to a member without an explicitly-specified
12714     // template argument list. Optimize for this common case.
12715     if (!getDerived().AlwaysRebuild() &&
12716         Base.get() == OldBase &&
12717         BaseType == E->getBaseType() &&
12718         QualifierLoc == E->getQualifierLoc() &&
12719         NameInfo.getName() == E->getMember() &&
12720         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12721       return E;
12722 
12723     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12724                                                        BaseType,
12725                                                        E->isArrow(),
12726                                                        E->getOperatorLoc(),
12727                                                        QualifierLoc,
12728                                                        TemplateKWLoc,
12729                                                        FirstQualifierInScope,
12730                                                        NameInfo,
12731                                                        /*TemplateArgs*/nullptr);
12732   }
12733 
12734   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12735   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12736                                               E->getNumTemplateArgs(),
12737                                               TransArgs))
12738     return ExprError();
12739 
12740   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12741                                                      BaseType,
12742                                                      E->isArrow(),
12743                                                      E->getOperatorLoc(),
12744                                                      QualifierLoc,
12745                                                      TemplateKWLoc,
12746                                                      FirstQualifierInScope,
12747                                                      NameInfo,
12748                                                      &TransArgs);
12749 }
12750 
12751 template<typename Derived>
12752 ExprResult
12753 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12754   // Transform the base of the expression.
12755   ExprResult Base((Expr*) nullptr);
12756   QualType BaseType;
12757   if (!Old->isImplicitAccess()) {
12758     Base = getDerived().TransformExpr(Old->getBase());
12759     if (Base.isInvalid())
12760       return ExprError();
12761     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12762                                                      Old->isArrow());
12763     if (Base.isInvalid())
12764       return ExprError();
12765     BaseType = Base.get()->getType();
12766   } else {
12767     BaseType = getDerived().TransformType(Old->getBaseType());
12768   }
12769 
12770   NestedNameSpecifierLoc QualifierLoc;
12771   if (Old->getQualifierLoc()) {
12772     QualifierLoc
12773     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12774     if (!QualifierLoc)
12775       return ExprError();
12776   }
12777 
12778   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12779 
12780   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12781                  Sema::LookupOrdinaryName);
12782 
12783   // Transform the declaration set.
12784   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12785     return ExprError();
12786 
12787   // Determine the naming class.
12788   if (Old->getNamingClass()) {
12789     CXXRecordDecl *NamingClass
12790       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12791                                                           Old->getMemberLoc(),
12792                                                         Old->getNamingClass()));
12793     if (!NamingClass)
12794       return ExprError();
12795 
12796     R.setNamingClass(NamingClass);
12797   }
12798 
12799   TemplateArgumentListInfo TransArgs;
12800   if (Old->hasExplicitTemplateArgs()) {
12801     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12802     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12803     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12804                                                 Old->getNumTemplateArgs(),
12805                                                 TransArgs))
12806       return ExprError();
12807   }
12808 
12809   // FIXME: to do this check properly, we will need to preserve the
12810   // first-qualifier-in-scope here, just in case we had a dependent
12811   // base (and therefore couldn't do the check) and a
12812   // nested-name-qualifier (and therefore could do the lookup).
12813   NamedDecl *FirstQualifierInScope = nullptr;
12814 
12815   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12816                                                   BaseType,
12817                                                   Old->getOperatorLoc(),
12818                                                   Old->isArrow(),
12819                                                   QualifierLoc,
12820                                                   TemplateKWLoc,
12821                                                   FirstQualifierInScope,
12822                                                   R,
12823                                               (Old->hasExplicitTemplateArgs()
12824                                                   ? &TransArgs : nullptr));
12825 }
12826 
12827 template<typename Derived>
12828 ExprResult
12829 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12830   EnterExpressionEvaluationContext Unevaluated(
12831       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12832   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12833   if (SubExpr.isInvalid())
12834     return ExprError();
12835 
12836   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12837     return E;
12838 
12839   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12840 }
12841 
12842 template<typename Derived>
12843 ExprResult
12844 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12845   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12846   if (Pattern.isInvalid())
12847     return ExprError();
12848 
12849   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12850     return E;
12851 
12852   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12853                                            E->getNumExpansions());
12854 }
12855 
12856 template<typename Derived>
12857 ExprResult
12858 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12859   // If E is not value-dependent, then nothing will change when we transform it.
12860   // Note: This is an instantiation-centric view.
12861   if (!E->isValueDependent())
12862     return E;
12863 
12864   EnterExpressionEvaluationContext Unevaluated(
12865       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12866 
12867   ArrayRef<TemplateArgument> PackArgs;
12868   TemplateArgument ArgStorage;
12869 
12870   // Find the argument list to transform.
12871   if (E->isPartiallySubstituted()) {
12872     PackArgs = E->getPartialArguments();
12873   } else if (E->isValueDependent()) {
12874     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12875     bool ShouldExpand = false;
12876     bool RetainExpansion = false;
12877     Optional<unsigned> NumExpansions;
12878     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12879                                              Unexpanded,
12880                                              ShouldExpand, RetainExpansion,
12881                                              NumExpansions))
12882       return ExprError();
12883 
12884     // If we need to expand the pack, build a template argument from it and
12885     // expand that.
12886     if (ShouldExpand) {
12887       auto *Pack = E->getPack();
12888       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
12889         ArgStorage = getSema().Context.getPackExpansionType(
12890             getSema().Context.getTypeDeclType(TTPD), None);
12891       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
12892         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
12893       } else {
12894         auto *VD = cast<ValueDecl>(Pack);
12895         ExprResult DRE = getSema().BuildDeclRefExpr(
12896             VD, VD->getType().getNonLValueExprType(getSema().Context),
12897             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
12898             E->getPackLoc());
12899         if (DRE.isInvalid())
12900           return ExprError();
12901         ArgStorage = new (getSema().Context) PackExpansionExpr(
12902             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
12903       }
12904       PackArgs = ArgStorage;
12905     }
12906   }
12907 
12908   // If we're not expanding the pack, just transform the decl.
12909   if (!PackArgs.size()) {
12910     auto *Pack = cast_or_null<NamedDecl>(
12911         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
12912     if (!Pack)
12913       return ExprError();
12914     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
12915                                               E->getPackLoc(),
12916                                               E->getRParenLoc(), None, None);
12917   }
12918 
12919   // Try to compute the result without performing a partial substitution.
12920   Optional<unsigned> Result = 0;
12921   for (const TemplateArgument &Arg : PackArgs) {
12922     if (!Arg.isPackExpansion()) {
12923       Result = *Result + 1;
12924       continue;
12925     }
12926 
12927     TemplateArgumentLoc ArgLoc;
12928     InventTemplateArgumentLoc(Arg, ArgLoc);
12929 
12930     // Find the pattern of the pack expansion.
12931     SourceLocation Ellipsis;
12932     Optional<unsigned> OrigNumExpansions;
12933     TemplateArgumentLoc Pattern =
12934         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
12935                                                           OrigNumExpansions);
12936 
12937     // Substitute under the pack expansion. Do not expand the pack (yet).
12938     TemplateArgumentLoc OutPattern;
12939     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12940     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
12941                                                /*Uneval*/ true))
12942       return true;
12943 
12944     // See if we can determine the number of arguments from the result.
12945     Optional<unsigned> NumExpansions =
12946         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
12947     if (!NumExpansions) {
12948       // No: we must be in an alias template expansion, and we're going to need
12949       // to actually expand the packs.
12950       Result = None;
12951       break;
12952     }
12953 
12954     Result = *Result + *NumExpansions;
12955   }
12956 
12957   // Common case: we could determine the number of expansions without
12958   // substituting.
12959   if (Result)
12960     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12961                                               E->getPackLoc(),
12962                                               E->getRParenLoc(), *Result, None);
12963 
12964   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
12965                                                E->getPackLoc());
12966   {
12967     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
12968     typedef TemplateArgumentLocInventIterator<
12969         Derived, const TemplateArgument*> PackLocIterator;
12970     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
12971                                    PackLocIterator(*this, PackArgs.end()),
12972                                    TransformedPackArgs, /*Uneval*/true))
12973       return ExprError();
12974   }
12975 
12976   // Check whether we managed to fully-expand the pack.
12977   // FIXME: Is it possible for us to do so and not hit the early exit path?
12978   SmallVector<TemplateArgument, 8> Args;
12979   bool PartialSubstitution = false;
12980   for (auto &Loc : TransformedPackArgs.arguments()) {
12981     Args.push_back(Loc.getArgument());
12982     if (Loc.getArgument().isPackExpansion())
12983       PartialSubstitution = true;
12984   }
12985 
12986   if (PartialSubstitution)
12987     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12988                                               E->getPackLoc(),
12989                                               E->getRParenLoc(), None, Args);
12990 
12991   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
12992                                             E->getPackLoc(), E->getRParenLoc(),
12993                                             Args.size(), None);
12994 }
12995 
12996 template<typename Derived>
12997 ExprResult
12998 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
12999                                           SubstNonTypeTemplateParmPackExpr *E) {
13000   // Default behavior is to do nothing with this transformation.
13001   return E;
13002 }
13003 
13004 template<typename Derived>
13005 ExprResult
13006 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13007                                           SubstNonTypeTemplateParmExpr *E) {
13008   // Default behavior is to do nothing with this transformation.
13009   return E;
13010 }
13011 
13012 template<typename Derived>
13013 ExprResult
13014 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13015   // Default behavior is to do nothing with this transformation.
13016   return E;
13017 }
13018 
13019 template<typename Derived>
13020 ExprResult
13021 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13022                                                   MaterializeTemporaryExpr *E) {
13023   return getDerived().TransformExpr(E->getSubExpr());
13024 }
13025 
13026 template<typename Derived>
13027 ExprResult
13028 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13029   Expr *Pattern = E->getPattern();
13030 
13031   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13032   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13033   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13034 
13035   // Determine whether the set of unexpanded parameter packs can and should
13036   // be expanded.
13037   bool Expand = true;
13038   bool RetainExpansion = false;
13039   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13040                      NumExpansions = OrigNumExpansions;
13041   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13042                                            Pattern->getSourceRange(),
13043                                            Unexpanded,
13044                                            Expand, RetainExpansion,
13045                                            NumExpansions))
13046     return true;
13047 
13048   if (!Expand) {
13049     // Do not expand any packs here, just transform and rebuild a fold
13050     // expression.
13051     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13052 
13053     ExprResult LHS =
13054         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13055     if (LHS.isInvalid())
13056       return true;
13057 
13058     ExprResult RHS =
13059         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13060     if (RHS.isInvalid())
13061       return true;
13062 
13063     if (!getDerived().AlwaysRebuild() &&
13064         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13065       return E;
13066 
13067     return getDerived().RebuildCXXFoldExpr(
13068         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
13069         RHS.get(), E->getEndLoc(), NumExpansions);
13070   }
13071 
13072   // The transform has determined that we should perform an elementwise
13073   // expansion of the pattern. Do so.
13074   ExprResult Result = getDerived().TransformExpr(E->getInit());
13075   if (Result.isInvalid())
13076     return true;
13077   bool LeftFold = E->isLeftFold();
13078 
13079   // If we're retaining an expansion for a right fold, it is the innermost
13080   // component and takes the init (if any).
13081   if (!LeftFold && RetainExpansion) {
13082     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13083 
13084     ExprResult Out = getDerived().TransformExpr(Pattern);
13085     if (Out.isInvalid())
13086       return true;
13087 
13088     Result = getDerived().RebuildCXXFoldExpr(
13089         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
13090         Result.get(), E->getEndLoc(), OrigNumExpansions);
13091     if (Result.isInvalid())
13092       return true;
13093   }
13094 
13095   for (unsigned I = 0; I != *NumExpansions; ++I) {
13096     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13097         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13098     ExprResult Out = getDerived().TransformExpr(Pattern);
13099     if (Out.isInvalid())
13100       return true;
13101 
13102     if (Out.get()->containsUnexpandedParameterPack()) {
13103       // We still have a pack; retain a pack expansion for this slice.
13104       Result = getDerived().RebuildCXXFoldExpr(
13105           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13106           E->getOperator(), E->getEllipsisLoc(),
13107           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13108           OrigNumExpansions);
13109     } else if (Result.isUsable()) {
13110       // We've got down to a single element; build a binary operator.
13111       Result = getDerived().RebuildBinaryOperator(
13112           E->getEllipsisLoc(), E->getOperator(),
13113           LeftFold ? Result.get() : Out.get(),
13114           LeftFold ? Out.get() : Result.get());
13115     } else
13116       Result = Out;
13117 
13118     if (Result.isInvalid())
13119       return true;
13120   }
13121 
13122   // If we're retaining an expansion for a left fold, it is the outermost
13123   // component and takes the complete expansion so far as its init (if any).
13124   if (LeftFold && RetainExpansion) {
13125     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13126 
13127     ExprResult Out = getDerived().TransformExpr(Pattern);
13128     if (Out.isInvalid())
13129       return true;
13130 
13131     Result = getDerived().RebuildCXXFoldExpr(
13132         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
13133         Out.get(), E->getEndLoc(), OrigNumExpansions);
13134     if (Result.isInvalid())
13135       return true;
13136   }
13137 
13138   // If we had no init and an empty pack, and we're not retaining an expansion,
13139   // then produce a fallback value or error.
13140   if (Result.isUnset())
13141     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13142                                                 E->getOperator());
13143 
13144   return Result;
13145 }
13146 
13147 template<typename Derived>
13148 ExprResult
13149 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13150     CXXStdInitializerListExpr *E) {
13151   return getDerived().TransformExpr(E->getSubExpr());
13152 }
13153 
13154 template<typename Derived>
13155 ExprResult
13156 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13157   return SemaRef.MaybeBindToTemporary(E);
13158 }
13159 
13160 template<typename Derived>
13161 ExprResult
13162 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13163   return E;
13164 }
13165 
13166 template<typename Derived>
13167 ExprResult
13168 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13169   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13170   if (SubExpr.isInvalid())
13171     return ExprError();
13172 
13173   if (!getDerived().AlwaysRebuild() &&
13174       SubExpr.get() == E->getSubExpr())
13175     return E;
13176 
13177   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13178 }
13179 
13180 template<typename Derived>
13181 ExprResult
13182 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13183   // Transform each of the elements.
13184   SmallVector<Expr *, 8> Elements;
13185   bool ArgChanged = false;
13186   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13187                                   /*IsCall=*/false, Elements, &ArgChanged))
13188     return ExprError();
13189 
13190   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13191     return SemaRef.MaybeBindToTemporary(E);
13192 
13193   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13194                                               Elements.data(),
13195                                               Elements.size());
13196 }
13197 
13198 template<typename Derived>
13199 ExprResult
13200 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13201                                                     ObjCDictionaryLiteral *E) {
13202   // Transform each of the elements.
13203   SmallVector<ObjCDictionaryElement, 8> Elements;
13204   bool ArgChanged = false;
13205   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13206     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13207 
13208     if (OrigElement.isPackExpansion()) {
13209       // This key/value element is a pack expansion.
13210       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13211       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13212       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13213       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13214 
13215       // Determine whether the set of unexpanded parameter packs can
13216       // and should be expanded.
13217       bool Expand = true;
13218       bool RetainExpansion = false;
13219       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13220       Optional<unsigned> NumExpansions = OrigNumExpansions;
13221       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13222                                OrigElement.Value->getEndLoc());
13223       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13224                                                PatternRange, Unexpanded, Expand,
13225                                                RetainExpansion, NumExpansions))
13226         return ExprError();
13227 
13228       if (!Expand) {
13229         // The transform has determined that we should perform a simple
13230         // transformation on the pack expansion, producing another pack
13231         // expansion.
13232         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13233         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13234         if (Key.isInvalid())
13235           return ExprError();
13236 
13237         if (Key.get() != OrigElement.Key)
13238           ArgChanged = true;
13239 
13240         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13241         if (Value.isInvalid())
13242           return ExprError();
13243 
13244         if (Value.get() != OrigElement.Value)
13245           ArgChanged = true;
13246 
13247         ObjCDictionaryElement Expansion = {
13248           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13249         };
13250         Elements.push_back(Expansion);
13251         continue;
13252       }
13253 
13254       // Record right away that the argument was changed.  This needs
13255       // to happen even if the array expands to nothing.
13256       ArgChanged = true;
13257 
13258       // The transform has determined that we should perform an elementwise
13259       // expansion of the pattern. Do so.
13260       for (unsigned I = 0; I != *NumExpansions; ++I) {
13261         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13262         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13263         if (Key.isInvalid())
13264           return ExprError();
13265 
13266         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13267         if (Value.isInvalid())
13268           return ExprError();
13269 
13270         ObjCDictionaryElement Element = {
13271           Key.get(), Value.get(), SourceLocation(), NumExpansions
13272         };
13273 
13274         // If any unexpanded parameter packs remain, we still have a
13275         // pack expansion.
13276         // FIXME: Can this really happen?
13277         if (Key.get()->containsUnexpandedParameterPack() ||
13278             Value.get()->containsUnexpandedParameterPack())
13279           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13280 
13281         Elements.push_back(Element);
13282       }
13283 
13284       // FIXME: Retain a pack expansion if RetainExpansion is true.
13285 
13286       // We've finished with this pack expansion.
13287       continue;
13288     }
13289 
13290     // Transform and check key.
13291     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13292     if (Key.isInvalid())
13293       return ExprError();
13294 
13295     if (Key.get() != OrigElement.Key)
13296       ArgChanged = true;
13297 
13298     // Transform and check value.
13299     ExprResult Value
13300       = getDerived().TransformExpr(OrigElement.Value);
13301     if (Value.isInvalid())
13302       return ExprError();
13303 
13304     if (Value.get() != OrigElement.Value)
13305       ArgChanged = true;
13306 
13307     ObjCDictionaryElement Element = {
13308       Key.get(), Value.get(), SourceLocation(), None
13309     };
13310     Elements.push_back(Element);
13311   }
13312 
13313   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13314     return SemaRef.MaybeBindToTemporary(E);
13315 
13316   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13317                                                    Elements);
13318 }
13319 
13320 template<typename Derived>
13321 ExprResult
13322 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13323   TypeSourceInfo *EncodedTypeInfo
13324     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13325   if (!EncodedTypeInfo)
13326     return ExprError();
13327 
13328   if (!getDerived().AlwaysRebuild() &&
13329       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13330     return E;
13331 
13332   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13333                                             EncodedTypeInfo,
13334                                             E->getRParenLoc());
13335 }
13336 
13337 template<typename Derived>
13338 ExprResult TreeTransform<Derived>::
13339 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13340   // This is a kind of implicit conversion, and it needs to get dropped
13341   // and recomputed for the same general reasons that ImplicitCastExprs
13342   // do, as well a more specific one: this expression is only valid when
13343   // it appears *immediately* as an argument expression.
13344   return getDerived().TransformExpr(E->getSubExpr());
13345 }
13346 
13347 template<typename Derived>
13348 ExprResult TreeTransform<Derived>::
13349 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13350   TypeSourceInfo *TSInfo
13351     = getDerived().TransformType(E->getTypeInfoAsWritten());
13352   if (!TSInfo)
13353     return ExprError();
13354 
13355   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13356   if (Result.isInvalid())
13357     return ExprError();
13358 
13359   if (!getDerived().AlwaysRebuild() &&
13360       TSInfo == E->getTypeInfoAsWritten() &&
13361       Result.get() == E->getSubExpr())
13362     return E;
13363 
13364   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13365                                       E->getBridgeKeywordLoc(), TSInfo,
13366                                       Result.get());
13367 }
13368 
13369 template <typename Derived>
13370 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13371     ObjCAvailabilityCheckExpr *E) {
13372   return E;
13373 }
13374 
13375 template<typename Derived>
13376 ExprResult
13377 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13378   // Transform arguments.
13379   bool ArgChanged = false;
13380   SmallVector<Expr*, 8> Args;
13381   Args.reserve(E->getNumArgs());
13382   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13383                                   &ArgChanged))
13384     return ExprError();
13385 
13386   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13387     // Class message: transform the receiver type.
13388     TypeSourceInfo *ReceiverTypeInfo
13389       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13390     if (!ReceiverTypeInfo)
13391       return ExprError();
13392 
13393     // If nothing changed, just retain the existing message send.
13394     if (!getDerived().AlwaysRebuild() &&
13395         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13396       return SemaRef.MaybeBindToTemporary(E);
13397 
13398     // Build a new class message send.
13399     SmallVector<SourceLocation, 16> SelLocs;
13400     E->getSelectorLocs(SelLocs);
13401     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13402                                                E->getSelector(),
13403                                                SelLocs,
13404                                                E->getMethodDecl(),
13405                                                E->getLeftLoc(),
13406                                                Args,
13407                                                E->getRightLoc());
13408   }
13409   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13410            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13411     if (!E->getMethodDecl())
13412       return ExprError();
13413 
13414     // Build a new class message send to 'super'.
13415     SmallVector<SourceLocation, 16> SelLocs;
13416     E->getSelectorLocs(SelLocs);
13417     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13418                                                E->getSelector(),
13419                                                SelLocs,
13420                                                E->getReceiverType(),
13421                                                E->getMethodDecl(),
13422                                                E->getLeftLoc(),
13423                                                Args,
13424                                                E->getRightLoc());
13425   }
13426 
13427   // Instance message: transform the receiver
13428   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13429          "Only class and instance messages may be instantiated");
13430   ExprResult Receiver
13431     = getDerived().TransformExpr(E->getInstanceReceiver());
13432   if (Receiver.isInvalid())
13433     return ExprError();
13434 
13435   // If nothing changed, just retain the existing message send.
13436   if (!getDerived().AlwaysRebuild() &&
13437       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13438     return SemaRef.MaybeBindToTemporary(E);
13439 
13440   // Build a new instance message send.
13441   SmallVector<SourceLocation, 16> SelLocs;
13442   E->getSelectorLocs(SelLocs);
13443   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13444                                              E->getSelector(),
13445                                              SelLocs,
13446                                              E->getMethodDecl(),
13447                                              E->getLeftLoc(),
13448                                              Args,
13449                                              E->getRightLoc());
13450 }
13451 
13452 template<typename Derived>
13453 ExprResult
13454 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13455   return E;
13456 }
13457 
13458 template<typename Derived>
13459 ExprResult
13460 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13461   return E;
13462 }
13463 
13464 template<typename Derived>
13465 ExprResult
13466 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13467   // Transform the base expression.
13468   ExprResult Base = getDerived().TransformExpr(E->getBase());
13469   if (Base.isInvalid())
13470     return ExprError();
13471 
13472   // We don't need to transform the ivar; it will never change.
13473 
13474   // If nothing changed, just retain the existing expression.
13475   if (!getDerived().AlwaysRebuild() &&
13476       Base.get() == E->getBase())
13477     return E;
13478 
13479   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13480                                              E->getLocation(),
13481                                              E->isArrow(), E->isFreeIvar());
13482 }
13483 
13484 template<typename Derived>
13485 ExprResult
13486 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13487   // 'super' and types never change. Property never changes. Just
13488   // retain the existing expression.
13489   if (!E->isObjectReceiver())
13490     return E;
13491 
13492   // Transform the base expression.
13493   ExprResult Base = getDerived().TransformExpr(E->getBase());
13494   if (Base.isInvalid())
13495     return ExprError();
13496 
13497   // We don't need to transform the property; it will never change.
13498 
13499   // If nothing changed, just retain the existing expression.
13500   if (!getDerived().AlwaysRebuild() &&
13501       Base.get() == E->getBase())
13502     return E;
13503 
13504   if (E->isExplicitProperty())
13505     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13506                                                    E->getExplicitProperty(),
13507                                                    E->getLocation());
13508 
13509   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13510                                                  SemaRef.Context.PseudoObjectTy,
13511                                                  E->getImplicitPropertyGetter(),
13512                                                  E->getImplicitPropertySetter(),
13513                                                  E->getLocation());
13514 }
13515 
13516 template<typename Derived>
13517 ExprResult
13518 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13519   // Transform the base expression.
13520   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13521   if (Base.isInvalid())
13522     return ExprError();
13523 
13524   // Transform the key expression.
13525   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13526   if (Key.isInvalid())
13527     return ExprError();
13528 
13529   // If nothing changed, just retain the existing expression.
13530   if (!getDerived().AlwaysRebuild() &&
13531       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13532     return E;
13533 
13534   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13535                                                   Base.get(), Key.get(),
13536                                                   E->getAtIndexMethodDecl(),
13537                                                   E->setAtIndexMethodDecl());
13538 }
13539 
13540 template<typename Derived>
13541 ExprResult
13542 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13543   // Transform the base expression.
13544   ExprResult Base = getDerived().TransformExpr(E->getBase());
13545   if (Base.isInvalid())
13546     return ExprError();
13547 
13548   // If nothing changed, just retain the existing expression.
13549   if (!getDerived().AlwaysRebuild() &&
13550       Base.get() == E->getBase())
13551     return E;
13552 
13553   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13554                                          E->getOpLoc(),
13555                                          E->isArrow());
13556 }
13557 
13558 template<typename Derived>
13559 ExprResult
13560 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13561   bool ArgumentChanged = false;
13562   SmallVector<Expr*, 8> SubExprs;
13563   SubExprs.reserve(E->getNumSubExprs());
13564   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13565                                   SubExprs, &ArgumentChanged))
13566     return ExprError();
13567 
13568   if (!getDerived().AlwaysRebuild() &&
13569       !ArgumentChanged)
13570     return E;
13571 
13572   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13573                                                SubExprs,
13574                                                E->getRParenLoc());
13575 }
13576 
13577 template<typename Derived>
13578 ExprResult
13579 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13580   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13581   if (SrcExpr.isInvalid())
13582     return ExprError();
13583 
13584   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13585   if (!Type)
13586     return ExprError();
13587 
13588   if (!getDerived().AlwaysRebuild() &&
13589       Type == E->getTypeSourceInfo() &&
13590       SrcExpr.get() == E->getSrcExpr())
13591     return E;
13592 
13593   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13594                                                SrcExpr.get(), Type,
13595                                                E->getRParenLoc());
13596 }
13597 
13598 template<typename Derived>
13599 ExprResult
13600 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13601   BlockDecl *oldBlock = E->getBlockDecl();
13602 
13603   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13604   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13605 
13606   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13607   blockScope->TheDecl->setBlockMissingReturnType(
13608                          oldBlock->blockMissingReturnType());
13609 
13610   SmallVector<ParmVarDecl*, 4> params;
13611   SmallVector<QualType, 4> paramTypes;
13612 
13613   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13614 
13615   // Parameter substitution.
13616   Sema::ExtParameterInfoBuilder extParamInfos;
13617   if (getDerived().TransformFunctionTypeParams(
13618           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13619           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13620           extParamInfos)) {
13621     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13622     return ExprError();
13623   }
13624 
13625   QualType exprResultType =
13626       getDerived().TransformType(exprFunctionType->getReturnType());
13627 
13628   auto epi = exprFunctionType->getExtProtoInfo();
13629   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13630 
13631   QualType functionType =
13632     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13633   blockScope->FunctionType = functionType;
13634 
13635   // Set the parameters on the block decl.
13636   if (!params.empty())
13637     blockScope->TheDecl->setParams(params);
13638 
13639   if (!oldBlock->blockMissingReturnType()) {
13640     blockScope->HasImplicitReturnType = false;
13641     blockScope->ReturnType = exprResultType;
13642   }
13643 
13644   // Transform the body
13645   StmtResult body = getDerived().TransformStmt(E->getBody());
13646   if (body.isInvalid()) {
13647     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13648     return ExprError();
13649   }
13650 
13651 #ifndef NDEBUG
13652   // In builds with assertions, make sure that we captured everything we
13653   // captured before.
13654   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13655     for (const auto &I : oldBlock->captures()) {
13656       VarDecl *oldCapture = I.getVariable();
13657 
13658       // Ignore parameter packs.
13659       if (oldCapture->isParameterPack())
13660         continue;
13661 
13662       VarDecl *newCapture =
13663         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13664                                                  oldCapture));
13665       assert(blockScope->CaptureMap.count(newCapture));
13666     }
13667     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13668   }
13669 #endif
13670 
13671   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13672                                     /*Scope=*/nullptr);
13673 }
13674 
13675 template<typename Derived>
13676 ExprResult
13677 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13678   llvm_unreachable("Cannot transform asType expressions yet");
13679 }
13680 
13681 template<typename Derived>
13682 ExprResult
13683 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13684   bool ArgumentChanged = false;
13685   SmallVector<Expr*, 8> SubExprs;
13686   SubExprs.reserve(E->getNumSubExprs());
13687   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13688                                   SubExprs, &ArgumentChanged))
13689     return ExprError();
13690 
13691   if (!getDerived().AlwaysRebuild() &&
13692       !ArgumentChanged)
13693     return E;
13694 
13695   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13696                                         E->getOp(), E->getRParenLoc());
13697 }
13698 
13699 //===----------------------------------------------------------------------===//
13700 // Type reconstruction
13701 //===----------------------------------------------------------------------===//
13702 
13703 template<typename Derived>
13704 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13705                                                     SourceLocation Star) {
13706   return SemaRef.BuildPointerType(PointeeType, Star,
13707                                   getDerived().getBaseEntity());
13708 }
13709 
13710 template<typename Derived>
13711 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13712                                                          SourceLocation Star) {
13713   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13714                                        getDerived().getBaseEntity());
13715 }
13716 
13717 template<typename Derived>
13718 QualType
13719 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13720                                              bool WrittenAsLValue,
13721                                              SourceLocation Sigil) {
13722   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13723                                     Sigil, getDerived().getBaseEntity());
13724 }
13725 
13726 template<typename Derived>
13727 QualType
13728 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13729                                                  QualType ClassType,
13730                                                  SourceLocation Sigil) {
13731   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13732                                         getDerived().getBaseEntity());
13733 }
13734 
13735 template<typename Derived>
13736 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13737            const ObjCTypeParamDecl *Decl,
13738            SourceLocation ProtocolLAngleLoc,
13739            ArrayRef<ObjCProtocolDecl *> Protocols,
13740            ArrayRef<SourceLocation> ProtocolLocs,
13741            SourceLocation ProtocolRAngleLoc) {
13742   return SemaRef.BuildObjCTypeParamType(Decl,
13743                                         ProtocolLAngleLoc, Protocols,
13744                                         ProtocolLocs, ProtocolRAngleLoc,
13745                                         /*FailOnError=*/true);
13746 }
13747 
13748 template<typename Derived>
13749 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13750            QualType BaseType,
13751            SourceLocation Loc,
13752            SourceLocation TypeArgsLAngleLoc,
13753            ArrayRef<TypeSourceInfo *> TypeArgs,
13754            SourceLocation TypeArgsRAngleLoc,
13755            SourceLocation ProtocolLAngleLoc,
13756            ArrayRef<ObjCProtocolDecl *> Protocols,
13757            ArrayRef<SourceLocation> ProtocolLocs,
13758            SourceLocation ProtocolRAngleLoc) {
13759   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13760                                      TypeArgs, TypeArgsRAngleLoc,
13761                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13762                                      ProtocolRAngleLoc,
13763                                      /*FailOnError=*/true);
13764 }
13765 
13766 template<typename Derived>
13767 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13768            QualType PointeeType,
13769            SourceLocation Star) {
13770   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13771 }
13772 
13773 template<typename Derived>
13774 QualType
13775 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13776                                          ArrayType::ArraySizeModifier SizeMod,
13777                                          const llvm::APInt *Size,
13778                                          Expr *SizeExpr,
13779                                          unsigned IndexTypeQuals,
13780                                          SourceRange BracketsRange) {
13781   if (SizeExpr || !Size)
13782     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13783                                   IndexTypeQuals, BracketsRange,
13784                                   getDerived().getBaseEntity());
13785 
13786   QualType Types[] = {
13787     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13788     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13789     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13790   };
13791   const unsigned NumTypes = llvm::array_lengthof(Types);
13792   QualType SizeType;
13793   for (unsigned I = 0; I != NumTypes; ++I)
13794     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13795       SizeType = Types[I];
13796       break;
13797     }
13798 
13799   // Note that we can return a VariableArrayType here in the case where
13800   // the element type was a dependent VariableArrayType.
13801   IntegerLiteral *ArraySize
13802       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13803                                /*FIXME*/BracketsRange.getBegin());
13804   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13805                                 IndexTypeQuals, BracketsRange,
13806                                 getDerived().getBaseEntity());
13807 }
13808 
13809 template<typename Derived>
13810 QualType
13811 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13812                                                  ArrayType::ArraySizeModifier SizeMod,
13813                                                  const llvm::APInt &Size,
13814                                                  Expr *SizeExpr,
13815                                                  unsigned IndexTypeQuals,
13816                                                  SourceRange BracketsRange) {
13817   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13818                                         IndexTypeQuals, BracketsRange);
13819 }
13820 
13821 template<typename Derived>
13822 QualType
13823 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13824                                           ArrayType::ArraySizeModifier SizeMod,
13825                                                  unsigned IndexTypeQuals,
13826                                                    SourceRange BracketsRange) {
13827   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13828                                        IndexTypeQuals, BracketsRange);
13829 }
13830 
13831 template<typename Derived>
13832 QualType
13833 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13834                                           ArrayType::ArraySizeModifier SizeMod,
13835                                                  Expr *SizeExpr,
13836                                                  unsigned IndexTypeQuals,
13837                                                  SourceRange BracketsRange) {
13838   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13839                                        SizeExpr,
13840                                        IndexTypeQuals, BracketsRange);
13841 }
13842 
13843 template<typename Derived>
13844 QualType
13845 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13846                                           ArrayType::ArraySizeModifier SizeMod,
13847                                                        Expr *SizeExpr,
13848                                                        unsigned IndexTypeQuals,
13849                                                    SourceRange BracketsRange) {
13850   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13851                                        SizeExpr,
13852                                        IndexTypeQuals, BracketsRange);
13853 }
13854 
13855 template <typename Derived>
13856 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
13857     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
13858   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
13859                                           AttributeLoc);
13860 }
13861 
13862 template <typename Derived>
13863 QualType
13864 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
13865                                           unsigned NumElements,
13866                                           VectorType::VectorKind VecKind) {
13867   // FIXME: semantic checking!
13868   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
13869 }
13870 
13871 template <typename Derived>
13872 QualType TreeTransform<Derived>::RebuildDependentVectorType(
13873     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
13874     VectorType::VectorKind VecKind) {
13875   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
13876 }
13877 
13878 template<typename Derived>
13879 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
13880                                                       unsigned NumElements,
13881                                                  SourceLocation AttributeLoc) {
13882   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
13883                           NumElements, true);
13884   IntegerLiteral *VectorSize
13885     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
13886                              AttributeLoc);
13887   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
13888 }
13889 
13890 template<typename Derived>
13891 QualType
13892 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
13893                                                            Expr *SizeExpr,
13894                                                   SourceLocation AttributeLoc) {
13895   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
13896 }
13897 
13898 template <typename Derived>
13899 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
13900     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
13901   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
13902                                                NumColumns);
13903 }
13904 
13905 template <typename Derived>
13906 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
13907     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
13908     SourceLocation AttributeLoc) {
13909   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
13910                                  AttributeLoc);
13911 }
13912 
13913 template<typename Derived>
13914 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
13915     QualType T,
13916     MutableArrayRef<QualType> ParamTypes,
13917     const FunctionProtoType::ExtProtoInfo &EPI) {
13918   return SemaRef.BuildFunctionType(T, ParamTypes,
13919                                    getDerived().getBaseLocation(),
13920                                    getDerived().getBaseEntity(),
13921                                    EPI);
13922 }
13923 
13924 template<typename Derived>
13925 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
13926   return SemaRef.Context.getFunctionNoProtoType(T);
13927 }
13928 
13929 template<typename Derived>
13930 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
13931                                                             Decl *D) {
13932   assert(D && "no decl found");
13933   if (D->isInvalidDecl()) return QualType();
13934 
13935   // FIXME: Doesn't account for ObjCInterfaceDecl!
13936   TypeDecl *Ty;
13937   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
13938     // A valid resolved using typename pack expansion decl can have multiple
13939     // UsingDecls, but they must each have exactly one type, and it must be
13940     // the same type in every case. But we must have at least one expansion!
13941     if (UPD->expansions().empty()) {
13942       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
13943           << UPD->isCXXClassMember() << UPD;
13944       return QualType();
13945     }
13946 
13947     // We might still have some unresolved types. Try to pick a resolved type
13948     // if we can. The final instantiation will check that the remaining
13949     // unresolved types instantiate to the type we pick.
13950     QualType FallbackT;
13951     QualType T;
13952     for (auto *E : UPD->expansions()) {
13953       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
13954       if (ThisT.isNull())
13955         continue;
13956       else if (ThisT->getAs<UnresolvedUsingType>())
13957         FallbackT = ThisT;
13958       else if (T.isNull())
13959         T = ThisT;
13960       else
13961         assert(getSema().Context.hasSameType(ThisT, T) &&
13962                "mismatched resolved types in using pack expansion");
13963     }
13964     return T.isNull() ? FallbackT : T;
13965   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
13966     assert(Using->hasTypename() &&
13967            "UnresolvedUsingTypenameDecl transformed to non-typename using");
13968 
13969     // A valid resolved using typename decl points to exactly one type decl.
13970     assert(++Using->shadow_begin() == Using->shadow_end());
13971     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
13972   } else {
13973     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
13974            "UnresolvedUsingTypenameDecl transformed to non-using decl");
13975     Ty = cast<UnresolvedUsingTypenameDecl>(D);
13976   }
13977 
13978   return SemaRef.Context.getTypeDeclType(Ty);
13979 }
13980 
13981 template<typename Derived>
13982 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
13983                                                        SourceLocation Loc) {
13984   return SemaRef.BuildTypeofExprType(E, Loc);
13985 }
13986 
13987 template<typename Derived>
13988 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
13989   return SemaRef.Context.getTypeOfType(Underlying);
13990 }
13991 
13992 template<typename Derived>
13993 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
13994                                                      SourceLocation Loc) {
13995   return SemaRef.BuildDecltypeType(E, Loc);
13996 }
13997 
13998 template<typename Derived>
13999 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14000                                             UnaryTransformType::UTTKind UKind,
14001                                             SourceLocation Loc) {
14002   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14003 }
14004 
14005 template<typename Derived>
14006 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14007                                                       TemplateName Template,
14008                                              SourceLocation TemplateNameLoc,
14009                                      TemplateArgumentListInfo &TemplateArgs) {
14010   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14011 }
14012 
14013 template<typename Derived>
14014 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14015                                                    SourceLocation KWLoc) {
14016   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14017 }
14018 
14019 template<typename Derived>
14020 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14021                                                  SourceLocation KWLoc,
14022                                                  bool isReadPipe) {
14023   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14024                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14025 }
14026 
14027 template <typename Derived>
14028 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14029                                                    unsigned NumBits,
14030                                                    SourceLocation Loc) {
14031   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14032                         NumBits, true);
14033   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14034                                                 SemaRef.Context.IntTy, Loc);
14035   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14036 }
14037 
14038 template <typename Derived>
14039 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14040     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14041   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14042 }
14043 
14044 template<typename Derived>
14045 TemplateName
14046 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14047                                             bool TemplateKW,
14048                                             TemplateDecl *Template) {
14049   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14050                                                   Template);
14051 }
14052 
14053 template<typename Derived>
14054 TemplateName
14055 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14056                                             SourceLocation TemplateKWLoc,
14057                                             const IdentifierInfo &Name,
14058                                             SourceLocation NameLoc,
14059                                             QualType ObjectType,
14060                                             NamedDecl *FirstQualifierInScope,
14061                                             bool AllowInjectedClassName) {
14062   UnqualifiedId TemplateName;
14063   TemplateName.setIdentifier(&Name, NameLoc);
14064   Sema::TemplateTy Template;
14065   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14066                               TemplateName, ParsedType::make(ObjectType),
14067                               /*EnteringContext=*/false, Template,
14068                               AllowInjectedClassName);
14069   return Template.get();
14070 }
14071 
14072 template<typename Derived>
14073 TemplateName
14074 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14075                                             SourceLocation TemplateKWLoc,
14076                                             OverloadedOperatorKind Operator,
14077                                             SourceLocation NameLoc,
14078                                             QualType ObjectType,
14079                                             bool AllowInjectedClassName) {
14080   UnqualifiedId Name;
14081   // FIXME: Bogus location information.
14082   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14083   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14084   Sema::TemplateTy Template;
14085   getSema().ActOnTemplateName(
14086       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14087       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14088   return Template.get();
14089 }
14090 
14091 template<typename Derived>
14092 ExprResult
14093 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14094                                                    SourceLocation OpLoc,
14095                                                    Expr *OrigCallee,
14096                                                    Expr *First,
14097                                                    Expr *Second) {
14098   Expr *Callee = OrigCallee->IgnoreParenCasts();
14099   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14100 
14101   if (First->getObjectKind() == OK_ObjCProperty) {
14102     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14103     if (BinaryOperator::isAssignmentOp(Opc))
14104       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14105                                                  First, Second);
14106     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14107     if (Result.isInvalid())
14108       return ExprError();
14109     First = Result.get();
14110   }
14111 
14112   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14113     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14114     if (Result.isInvalid())
14115       return ExprError();
14116     Second = Result.get();
14117   }
14118 
14119   // Determine whether this should be a builtin operation.
14120   if (Op == OO_Subscript) {
14121     if (!First->getType()->isOverloadableType() &&
14122         !Second->getType()->isOverloadableType())
14123       return getSema().CreateBuiltinArraySubscriptExpr(
14124           First, Callee->getBeginLoc(), Second, OpLoc);
14125   } else if (Op == OO_Arrow) {
14126     // -> is never a builtin operation.
14127     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14128   } else if (Second == nullptr || isPostIncDec) {
14129     if (!First->getType()->isOverloadableType() ||
14130         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14131       // The argument is not of overloadable type, or this is an expression
14132       // of the form &Class::member, so try to create a built-in unary
14133       // operation.
14134       UnaryOperatorKind Opc
14135         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14136 
14137       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14138     }
14139   } else {
14140     if (!First->getType()->isOverloadableType() &&
14141         !Second->getType()->isOverloadableType()) {
14142       // Neither of the arguments is an overloadable type, so try to
14143       // create a built-in binary operation.
14144       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14145       ExprResult Result
14146         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14147       if (Result.isInvalid())
14148         return ExprError();
14149 
14150       return Result;
14151     }
14152   }
14153 
14154   // Compute the transformed set of functions (and function templates) to be
14155   // used during overload resolution.
14156   UnresolvedSet<16> Functions;
14157   bool RequiresADL;
14158 
14159   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14160     Functions.append(ULE->decls_begin(), ULE->decls_end());
14161     // If the overload could not be resolved in the template definition
14162     // (because we had a dependent argument), ADL is performed as part of
14163     // template instantiation.
14164     RequiresADL = ULE->requiresADL();
14165   } else {
14166     // If we've resolved this to a particular non-member function, just call
14167     // that function. If we resolved it to a member function,
14168     // CreateOverloaded* will find that function for us.
14169     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14170     if (!isa<CXXMethodDecl>(ND))
14171       Functions.addDecl(ND);
14172     RequiresADL = false;
14173   }
14174 
14175   // Add any functions found via argument-dependent lookup.
14176   Expr *Args[2] = { First, Second };
14177   unsigned NumArgs = 1 + (Second != nullptr);
14178 
14179   // Create the overloaded operator invocation for unary operators.
14180   if (NumArgs == 1 || isPostIncDec) {
14181     UnaryOperatorKind Opc
14182       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14183     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14184                                            RequiresADL);
14185   }
14186 
14187   if (Op == OO_Subscript) {
14188     SourceLocation LBrace;
14189     SourceLocation RBrace;
14190 
14191     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14192         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14193         LBrace = SourceLocation::getFromRawEncoding(
14194                     NameLoc.CXXOperatorName.BeginOpNameLoc);
14195         RBrace = SourceLocation::getFromRawEncoding(
14196                     NameLoc.CXXOperatorName.EndOpNameLoc);
14197     } else {
14198       LBrace = Callee->getBeginLoc();
14199       RBrace = OpLoc;
14200     }
14201 
14202     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14203                                                       First, Second);
14204   }
14205 
14206   // Create the overloaded operator invocation for binary operators.
14207   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14208   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14209       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14210   if (Result.isInvalid())
14211     return ExprError();
14212 
14213   return Result;
14214 }
14215 
14216 template<typename Derived>
14217 ExprResult
14218 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14219                                                      SourceLocation OperatorLoc,
14220                                                        bool isArrow,
14221                                                        CXXScopeSpec &SS,
14222                                                      TypeSourceInfo *ScopeType,
14223                                                        SourceLocation CCLoc,
14224                                                        SourceLocation TildeLoc,
14225                                         PseudoDestructorTypeStorage Destroyed) {
14226   QualType BaseType = Base->getType();
14227   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14228       (!isArrow && !BaseType->getAs<RecordType>()) ||
14229       (isArrow && BaseType->getAs<PointerType>() &&
14230        !BaseType->castAs<PointerType>()->getPointeeType()
14231                                               ->template getAs<RecordType>())){
14232     // This pseudo-destructor expression is still a pseudo-destructor.
14233     return SemaRef.BuildPseudoDestructorExpr(
14234         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14235         CCLoc, TildeLoc, Destroyed);
14236   }
14237 
14238   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14239   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14240                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14241   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14242   NameInfo.setNamedTypeInfo(DestroyedType);
14243 
14244   // The scope type is now known to be a valid nested name specifier
14245   // component. Tack it on to the end of the nested name specifier.
14246   if (ScopeType) {
14247     if (!ScopeType->getType()->getAs<TagType>()) {
14248       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14249                      diag::err_expected_class_or_namespace)
14250           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14251       return ExprError();
14252     }
14253     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14254               CCLoc);
14255   }
14256 
14257   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14258   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14259                                             OperatorLoc, isArrow,
14260                                             SS, TemplateKWLoc,
14261                                             /*FIXME: FirstQualifier*/ nullptr,
14262                                             NameInfo,
14263                                             /*TemplateArgs*/ nullptr,
14264                                             /*S*/nullptr);
14265 }
14266 
14267 template<typename Derived>
14268 StmtResult
14269 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14270   SourceLocation Loc = S->getBeginLoc();
14271   CapturedDecl *CD = S->getCapturedDecl();
14272   unsigned NumParams = CD->getNumParams();
14273   unsigned ContextParamPos = CD->getContextParamPosition();
14274   SmallVector<Sema::CapturedParamNameType, 4> Params;
14275   for (unsigned I = 0; I < NumParams; ++I) {
14276     if (I != ContextParamPos) {
14277       Params.push_back(
14278              std::make_pair(
14279                   CD->getParam(I)->getName(),
14280                   getDerived().TransformType(CD->getParam(I)->getType())));
14281     } else {
14282       Params.push_back(std::make_pair(StringRef(), QualType()));
14283     }
14284   }
14285   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14286                                      S->getCapturedRegionKind(), Params);
14287   StmtResult Body;
14288   {
14289     Sema::CompoundScopeRAII CompoundScope(getSema());
14290     Body = getDerived().TransformStmt(S->getCapturedStmt());
14291   }
14292 
14293   if (Body.isInvalid()) {
14294     getSema().ActOnCapturedRegionError();
14295     return StmtError();
14296   }
14297 
14298   return getSema().ActOnCapturedRegionEnd(Body.get());
14299 }
14300 
14301 } // end namespace clang
14302 
14303 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14304