1 //===------- TreeTransform.h - Semantic Tree Transformation -----*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //===----------------------------------------------------------------------===//
7 //
8 //  This file implements a semantic tree transformation that takes a given
9 //  AST and rebuilds it, possibly transforming some nodes in the process.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14 #define LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
15 
16 #include "CoroutineStmtBuilder.h"
17 #include "TypeLocBuilder.h"
18 #include "clang/AST/Decl.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclTemplate.h"
21 #include "clang/AST/Expr.h"
22 #include "clang/AST/ExprConcepts.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/ExprObjC.h"
25 #include "clang/AST/ExprOpenMP.h"
26 #include "clang/AST/OpenMPClause.h"
27 #include "clang/AST/Stmt.h"
28 #include "clang/AST/StmtCXX.h"
29 #include "clang/AST/StmtObjC.h"
30 #include "clang/AST/StmtOpenMP.h"
31 #include "clang/Basic/DiagnosticParse.h"
32 #include "clang/Basic/OpenMPKinds.h"
33 #include "clang/Sema/Designator.h"
34 #include "clang/Sema/Lookup.h"
35 #include "clang/Sema/Ownership.h"
36 #include "clang/Sema/ParsedTemplate.h"
37 #include "clang/Sema/ScopeInfo.h"
38 #include "clang/Sema/SemaDiagnostic.h"
39 #include "clang/Sema/SemaInternal.h"
40 #include "llvm/ADT/ArrayRef.h"
41 #include "llvm/Support/ErrorHandling.h"
42 #include <algorithm>
43 
44 using namespace llvm::omp;
45 
46 namespace clang {
47 using namespace sema;
48 
49 /// A semantic tree transformation that allows one to transform one
50 /// abstract syntax tree into another.
51 ///
52 /// A new tree transformation is defined by creating a new subclass \c X of
53 /// \c TreeTransform<X> and then overriding certain operations to provide
54 /// behavior specific to that transformation. For example, template
55 /// instantiation is implemented as a tree transformation where the
56 /// transformation of TemplateTypeParmType nodes involves substituting the
57 /// template arguments for their corresponding template parameters; a similar
58 /// transformation is performed for non-type template parameters and
59 /// template template parameters.
60 ///
61 /// This tree-transformation template uses static polymorphism to allow
62 /// subclasses to customize any of its operations. Thus, a subclass can
63 /// override any of the transformation or rebuild operators by providing an
64 /// operation with the same signature as the default implementation. The
65 /// overriding function should not be virtual.
66 ///
67 /// Semantic tree transformations are split into two stages, either of which
68 /// can be replaced by a subclass. The "transform" step transforms an AST node
69 /// or the parts of an AST node using the various transformation functions,
70 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
71 /// node of the appropriate kind from the pieces. The default transformation
72 /// routines recursively transform the operands to composite AST nodes (e.g.,
73 /// the pointee type of a PointerType node) and, if any of those operand nodes
74 /// were changed by the transformation, invokes the rebuild operation to create
75 /// a new AST node.
76 ///
77 /// Subclasses can customize the transformation at various levels. The
78 /// most coarse-grained transformations involve replacing TransformType(),
79 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
80 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
81 /// new implementations.
82 ///
83 /// For more fine-grained transformations, subclasses can replace any of the
84 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
85 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
86 /// replacing TransformTemplateTypeParmType() allows template instantiation
87 /// to substitute template arguments for their corresponding template
88 /// parameters. Additionally, subclasses can override the \c RebuildXXX
89 /// functions to control how AST nodes are rebuilt when their operands change.
90 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
91 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
92 /// be able to use more efficient rebuild steps.
93 ///
94 /// There are a handful of other functions that can be overridden, allowing one
95 /// to avoid traversing nodes that don't need any transformation
96 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
97 /// operands have not changed (\c AlwaysRebuild()), and customize the
98 /// default locations and entity names used for type-checking
99 /// (\c getBaseLocation(), \c getBaseEntity()).
100 template<typename Derived>
101 class TreeTransform {
102   /// Private RAII object that helps us forget and then re-remember
103   /// the template argument corresponding to a partially-substituted parameter
104   /// pack.
105   class ForgetPartiallySubstitutedPackRAII {
106     Derived &Self;
107     TemplateArgument Old;
108 
109   public:
110     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
111       Old = Self.ForgetPartiallySubstitutedPack();
112     }
113 
114     ~ForgetPartiallySubstitutedPackRAII() {
115       Self.RememberPartiallySubstitutedPack(Old);
116     }
117   };
118 
119 protected:
120   Sema &SemaRef;
121 
122   /// The set of local declarations that have been transformed, for
123   /// cases where we are forced to build new declarations within the transformer
124   /// rather than in the subclass (e.g., lambda closure types).
125   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
126 
127 public:
128   /// Initializes a new tree transformer.
129   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
130 
131   /// Retrieves a reference to the derived class.
132   Derived &getDerived() { return static_cast<Derived&>(*this); }
133 
134   /// Retrieves a reference to the derived class.
135   const Derived &getDerived() const {
136     return static_cast<const Derived&>(*this);
137   }
138 
139   static inline ExprResult Owned(Expr *E) { return E; }
140   static inline StmtResult Owned(Stmt *S) { return S; }
141 
142   /// Retrieves a reference to the semantic analysis object used for
143   /// this tree transform.
144   Sema &getSema() const { return SemaRef; }
145 
146   /// Whether the transformation should always rebuild AST nodes, even
147   /// if none of the children have changed.
148   ///
149   /// Subclasses may override this function to specify when the transformation
150   /// should rebuild all AST nodes.
151   ///
152   /// We must always rebuild all AST nodes when performing variadic template
153   /// pack expansion, in order to avoid violating the AST invariant that each
154   /// statement node appears at most once in its containing declaration.
155   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
156 
157   /// Whether the transformation is forming an expression or statement that
158   /// replaces the original. In this case, we'll reuse mangling numbers from
159   /// existing lambdas.
160   bool ReplacingOriginal() { return false; }
161 
162   /// Wether CXXConstructExpr can be skipped when they are implicit.
163   /// They will be reconstructed when used if needed.
164   /// This is usefull when the user that cause rebuilding of the
165   /// CXXConstructExpr is outside of the expression at which the TreeTransform
166   /// started.
167   bool AllowSkippingCXXConstructExpr() { return true; }
168 
169   /// Returns the location of the entity being transformed, if that
170   /// information was not available elsewhere in the AST.
171   ///
172   /// By default, returns no source-location information. Subclasses can
173   /// provide an alternative implementation that provides better location
174   /// information.
175   SourceLocation getBaseLocation() { return SourceLocation(); }
176 
177   /// Returns the name of the entity being transformed, if that
178   /// information was not available elsewhere in the AST.
179   ///
180   /// By default, returns an empty name. Subclasses can provide an alternative
181   /// implementation with a more precise name.
182   DeclarationName getBaseEntity() { return DeclarationName(); }
183 
184   /// Sets the "base" location and entity when that
185   /// information is known based on another transformation.
186   ///
187   /// By default, the source location and entity are ignored. Subclasses can
188   /// override this function to provide a customized implementation.
189   void setBase(SourceLocation Loc, DeclarationName Entity) { }
190 
191   /// RAII object that temporarily sets the base location and entity
192   /// used for reporting diagnostics in types.
193   class TemporaryBase {
194     TreeTransform &Self;
195     SourceLocation OldLocation;
196     DeclarationName OldEntity;
197 
198   public:
199     TemporaryBase(TreeTransform &Self, SourceLocation Location,
200                   DeclarationName Entity) : Self(Self) {
201       OldLocation = Self.getDerived().getBaseLocation();
202       OldEntity = Self.getDerived().getBaseEntity();
203 
204       if (Location.isValid())
205         Self.getDerived().setBase(Location, Entity);
206     }
207 
208     ~TemporaryBase() {
209       Self.getDerived().setBase(OldLocation, OldEntity);
210     }
211   };
212 
213   /// Determine whether the given type \p T has already been
214   /// transformed.
215   ///
216   /// Subclasses can provide an alternative implementation of this routine
217   /// to short-circuit evaluation when it is known that a given type will
218   /// not change. For example, template instantiation need not traverse
219   /// non-dependent types.
220   bool AlreadyTransformed(QualType T) {
221     return T.isNull();
222   }
223 
224   /// Transform a template parameter depth level.
225   ///
226   /// During a transformation that transforms template parameters, this maps
227   /// an old template parameter depth to a new depth.
228   unsigned TransformTemplateDepth(unsigned Depth) {
229     return Depth;
230   }
231 
232   /// Determine whether the given call argument should be dropped, e.g.,
233   /// because it is a default argument.
234   ///
235   /// Subclasses can provide an alternative implementation of this routine to
236   /// determine which kinds of call arguments get dropped. By default,
237   /// CXXDefaultArgument nodes are dropped (prior to transformation).
238   bool DropCallArgument(Expr *E) {
239     return E->isDefaultArgument();
240   }
241 
242   /// Determine whether we should expand a pack expansion with the
243   /// given set of parameter packs into separate arguments by repeatedly
244   /// transforming the pattern.
245   ///
246   /// By default, the transformer never tries to expand pack expansions.
247   /// Subclasses can override this routine to provide different behavior.
248   ///
249   /// \param EllipsisLoc The location of the ellipsis that identifies the
250   /// pack expansion.
251   ///
252   /// \param PatternRange The source range that covers the entire pattern of
253   /// the pack expansion.
254   ///
255   /// \param Unexpanded The set of unexpanded parameter packs within the
256   /// pattern.
257   ///
258   /// \param ShouldExpand Will be set to \c true if the transformer should
259   /// expand the corresponding pack expansions into separate arguments. When
260   /// set, \c NumExpansions must also be set.
261   ///
262   /// \param RetainExpansion Whether the caller should add an unexpanded
263   /// pack expansion after all of the expanded arguments. This is used
264   /// when extending explicitly-specified template argument packs per
265   /// C++0x [temp.arg.explicit]p9.
266   ///
267   /// \param NumExpansions The number of separate arguments that will be in
268   /// the expanded form of the corresponding pack expansion. This is both an
269   /// input and an output parameter, which can be set by the caller if the
270   /// number of expansions is known a priori (e.g., due to a prior substitution)
271   /// and will be set by the callee when the number of expansions is known.
272   /// The callee must set this value when \c ShouldExpand is \c true; it may
273   /// set this value in other cases.
274   ///
275   /// \returns true if an error occurred (e.g., because the parameter packs
276   /// are to be instantiated with arguments of different lengths), false
277   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
278   /// must be set.
279   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
280                                SourceRange PatternRange,
281                                ArrayRef<UnexpandedParameterPack> Unexpanded,
282                                bool &ShouldExpand,
283                                bool &RetainExpansion,
284                                Optional<unsigned> &NumExpansions) {
285     ShouldExpand = false;
286     return false;
287   }
288 
289   /// "Forget" about the partially-substituted pack template argument,
290   /// when performing an instantiation that must preserve the parameter pack
291   /// use.
292   ///
293   /// This routine is meant to be overridden by the template instantiator.
294   TemplateArgument ForgetPartiallySubstitutedPack() {
295     return TemplateArgument();
296   }
297 
298   /// "Remember" the partially-substituted pack template argument
299   /// after performing an instantiation that must preserve the parameter pack
300   /// use.
301   ///
302   /// This routine is meant to be overridden by the template instantiator.
303   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
304 
305   /// Note to the derived class when a function parameter pack is
306   /// being expanded.
307   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
308 
309   /// Transforms the given type into another type.
310   ///
311   /// By default, this routine transforms a type by creating a
312   /// TypeSourceInfo for it and delegating to the appropriate
313   /// function.  This is expensive, but we don't mind, because
314   /// this method is deprecated anyway;  all users should be
315   /// switched to storing TypeSourceInfos.
316   ///
317   /// \returns the transformed type.
318   QualType TransformType(QualType T);
319 
320   /// Transforms the given type-with-location into a new
321   /// type-with-location.
322   ///
323   /// By default, this routine transforms a type by delegating to the
324   /// appropriate TransformXXXType to build a new type.  Subclasses
325   /// may override this function (to take over all type
326   /// transformations) or some set of the TransformXXXType functions
327   /// to alter the transformation.
328   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
329 
330   /// Transform the given type-with-location into a new
331   /// type, collecting location information in the given builder
332   /// as necessary.
333   ///
334   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
335 
336   /// Transform a type that is permitted to produce a
337   /// DeducedTemplateSpecializationType.
338   ///
339   /// This is used in the (relatively rare) contexts where it is acceptable
340   /// for transformation to produce a class template type with deduced
341   /// template arguments.
342   /// @{
343   QualType TransformTypeWithDeducedTST(QualType T);
344   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
345   /// @}
346 
347   /// The reason why the value of a statement is not discarded, if any.
348   enum StmtDiscardKind {
349     SDK_Discarded,
350     SDK_NotDiscarded,
351     SDK_StmtExprResult,
352   };
353 
354   /// Transform the given statement.
355   ///
356   /// By default, this routine transforms a statement by delegating to the
357   /// appropriate TransformXXXStmt function to transform a specific kind of
358   /// statement or the TransformExpr() function to transform an expression.
359   /// Subclasses may override this function to transform statements using some
360   /// other mechanism.
361   ///
362   /// \returns the transformed statement.
363   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
364 
365   /// Transform the given statement.
366   ///
367   /// By default, this routine transforms a statement by delegating to the
368   /// appropriate TransformOMPXXXClause function to transform a specific kind
369   /// of clause. Subclasses may override this function to transform statements
370   /// using some other mechanism.
371   ///
372   /// \returns the transformed OpenMP clause.
373   OMPClause *TransformOMPClause(OMPClause *S);
374 
375   /// Transform the given attribute.
376   ///
377   /// By default, this routine transforms a statement by delegating to the
378   /// appropriate TransformXXXAttr function to transform a specific kind
379   /// of attribute. Subclasses may override this function to transform
380   /// attributed statements using some other mechanism.
381   ///
382   /// \returns the transformed attribute
383   const Attr *TransformAttr(const Attr *S);
384 
385 /// Transform the specified attribute.
386 ///
387 /// Subclasses should override the transformation of attributes with a pragma
388 /// spelling to transform expressions stored within the attribute.
389 ///
390 /// \returns the transformed attribute.
391 #define ATTR(X)
392 #define PRAGMA_SPELLING_ATTR(X)                                                \
393   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
394 #include "clang/Basic/AttrList.inc"
395 
396   /// Transform the given expression.
397   ///
398   /// By default, this routine transforms an expression by delegating to the
399   /// appropriate TransformXXXExpr function to build a new expression.
400   /// Subclasses may override this function to transform expressions using some
401   /// other mechanism.
402   ///
403   /// \returns the transformed expression.
404   ExprResult TransformExpr(Expr *E);
405 
406   /// Transform the given initializer.
407   ///
408   /// By default, this routine transforms an initializer by stripping off the
409   /// semantic nodes added by initialization, then passing the result to
410   /// TransformExpr or TransformExprs.
411   ///
412   /// \returns the transformed initializer.
413   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
414 
415   /// Transform the given list of expressions.
416   ///
417   /// This routine transforms a list of expressions by invoking
418   /// \c TransformExpr() for each subexpression. However, it also provides
419   /// support for variadic templates by expanding any pack expansions (if the
420   /// derived class permits such expansion) along the way. When pack expansions
421   /// are present, the number of outputs may not equal the number of inputs.
422   ///
423   /// \param Inputs The set of expressions to be transformed.
424   ///
425   /// \param NumInputs The number of expressions in \c Inputs.
426   ///
427   /// \param IsCall If \c true, then this transform is being performed on
428   /// function-call arguments, and any arguments that should be dropped, will
429   /// be.
430   ///
431   /// \param Outputs The transformed input expressions will be added to this
432   /// vector.
433   ///
434   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
435   /// due to transformation.
436   ///
437   /// \returns true if an error occurred, false otherwise.
438   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
439                       SmallVectorImpl<Expr *> &Outputs,
440                       bool *ArgChanged = nullptr);
441 
442   /// Transform the given declaration, which is referenced from a type
443   /// or expression.
444   ///
445   /// By default, acts as the identity function on declarations, unless the
446   /// transformer has had to transform the declaration itself. Subclasses
447   /// may override this function to provide alternate behavior.
448   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
449     llvm::DenseMap<Decl *, Decl *>::iterator Known
450       = TransformedLocalDecls.find(D);
451     if (Known != TransformedLocalDecls.end())
452       return Known->second;
453 
454     return D;
455   }
456 
457   /// Transform the specified condition.
458   ///
459   /// By default, this transforms the variable and expression and rebuilds
460   /// the condition.
461   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
462                                            Expr *Expr,
463                                            Sema::ConditionKind Kind);
464 
465   /// Transform the attributes associated with the given declaration and
466   /// place them on the new declaration.
467   ///
468   /// By default, this operation does nothing. Subclasses may override this
469   /// behavior to transform attributes.
470   void transformAttrs(Decl *Old, Decl *New) { }
471 
472   /// Note that a local declaration has been transformed by this
473   /// transformer.
474   ///
475   /// Local declarations are typically transformed via a call to
476   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
477   /// the transformer itself has to transform the declarations. This routine
478   /// can be overridden by a subclass that keeps track of such mappings.
479   void transformedLocalDecl(Decl *Old, ArrayRef<Decl *> New) {
480     assert(New.size() == 1 &&
481            "must override transformedLocalDecl if performing pack expansion");
482     TransformedLocalDecls[Old] = New.front();
483   }
484 
485   /// Transform the definition of the given declaration.
486   ///
487   /// By default, invokes TransformDecl() to transform the declaration.
488   /// Subclasses may override this function to provide alternate behavior.
489   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
490     return getDerived().TransformDecl(Loc, D);
491   }
492 
493   /// Transform the given declaration, which was the first part of a
494   /// nested-name-specifier in a member access expression.
495   ///
496   /// This specific declaration transformation only applies to the first
497   /// identifier in a nested-name-specifier of a member access expression, e.g.,
498   /// the \c T in \c x->T::member
499   ///
500   /// By default, invokes TransformDecl() to transform the declaration.
501   /// Subclasses may override this function to provide alternate behavior.
502   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
503     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
504   }
505 
506   /// Transform the set of declarations in an OverloadExpr.
507   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
508                                   LookupResult &R);
509 
510   /// Transform the given nested-name-specifier with source-location
511   /// information.
512   ///
513   /// By default, transforms all of the types and declarations within the
514   /// nested-name-specifier. Subclasses may override this function to provide
515   /// alternate behavior.
516   NestedNameSpecifierLoc
517   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
518                                   QualType ObjectType = QualType(),
519                                   NamedDecl *FirstQualifierInScope = nullptr);
520 
521   /// Transform the given declaration name.
522   ///
523   /// By default, transforms the types of conversion function, constructor,
524   /// and destructor names and then (if needed) rebuilds the declaration name.
525   /// Identifiers and selectors are returned unmodified. Sublcasses may
526   /// override this function to provide alternate behavior.
527   DeclarationNameInfo
528   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
529 
530   bool TransformRequiresExprRequirements(ArrayRef<concepts::Requirement *> Reqs,
531       llvm::SmallVectorImpl<concepts::Requirement *> &Transformed);
532   concepts::TypeRequirement *
533   TransformTypeRequirement(concepts::TypeRequirement *Req);
534   concepts::ExprRequirement *
535   TransformExprRequirement(concepts::ExprRequirement *Req);
536   concepts::NestedRequirement *
537   TransformNestedRequirement(concepts::NestedRequirement *Req);
538 
539   /// Transform the given template name.
540   ///
541   /// \param SS The nested-name-specifier that qualifies the template
542   /// name. This nested-name-specifier must already have been transformed.
543   ///
544   /// \param Name The template name to transform.
545   ///
546   /// \param NameLoc The source location of the template name.
547   ///
548   /// \param ObjectType If we're translating a template name within a member
549   /// access expression, this is the type of the object whose member template
550   /// is being referenced.
551   ///
552   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
553   /// also refers to a name within the current (lexical) scope, this is the
554   /// declaration it refers to.
555   ///
556   /// By default, transforms the template name by transforming the declarations
557   /// and nested-name-specifiers that occur within the template name.
558   /// Subclasses may override this function to provide alternate behavior.
559   TemplateName
560   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
561                         SourceLocation NameLoc,
562                         QualType ObjectType = QualType(),
563                         NamedDecl *FirstQualifierInScope = nullptr,
564                         bool AllowInjectedClassName = false);
565 
566   /// Transform the given template argument.
567   ///
568   /// By default, this operation transforms the type, expression, or
569   /// declaration stored within the template argument and constructs a
570   /// new template argument from the transformed result. Subclasses may
571   /// override this function to provide alternate behavior.
572   ///
573   /// Returns true if there was an error.
574   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
575                                  TemplateArgumentLoc &Output,
576                                  bool Uneval = false);
577 
578   /// Transform the given set of template arguments.
579   ///
580   /// By default, this operation transforms all of the template arguments
581   /// in the input set using \c TransformTemplateArgument(), and appends
582   /// the transformed arguments to the output list.
583   ///
584   /// Note that this overload of \c TransformTemplateArguments() is merely
585   /// a convenience function. Subclasses that wish to override this behavior
586   /// should override the iterator-based member template version.
587   ///
588   /// \param Inputs The set of template arguments to be transformed.
589   ///
590   /// \param NumInputs The number of template arguments in \p Inputs.
591   ///
592   /// \param Outputs The set of transformed template arguments output by this
593   /// routine.
594   ///
595   /// Returns true if an error occurred.
596   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
597                                   unsigned NumInputs,
598                                   TemplateArgumentListInfo &Outputs,
599                                   bool Uneval = false) {
600     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
601                                       Uneval);
602   }
603 
604   /// Transform the given set of template arguments.
605   ///
606   /// By default, this operation transforms all of the template arguments
607   /// in the input set using \c TransformTemplateArgument(), and appends
608   /// the transformed arguments to the output list.
609   ///
610   /// \param First An iterator to the first template argument.
611   ///
612   /// \param Last An iterator one step past the last template argument.
613   ///
614   /// \param Outputs The set of transformed template arguments output by this
615   /// routine.
616   ///
617   /// Returns true if an error occurred.
618   template<typename InputIterator>
619   bool TransformTemplateArguments(InputIterator First,
620                                   InputIterator Last,
621                                   TemplateArgumentListInfo &Outputs,
622                                   bool Uneval = false);
623 
624   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
625   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
626                                  TemplateArgumentLoc &ArgLoc);
627 
628   /// Fakes up a TypeSourceInfo for a type.
629   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
630     return SemaRef.Context.getTrivialTypeSourceInfo(T,
631                        getDerived().getBaseLocation());
632   }
633 
634 #define ABSTRACT_TYPELOC(CLASS, PARENT)
635 #define TYPELOC(CLASS, PARENT)                                   \
636   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
637 #include "clang/AST/TypeLocNodes.def"
638 
639   template<typename Fn>
640   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
641                                       FunctionProtoTypeLoc TL,
642                                       CXXRecordDecl *ThisContext,
643                                       Qualifiers ThisTypeQuals,
644                                       Fn TransformExceptionSpec);
645 
646   bool TransformExceptionSpec(SourceLocation Loc,
647                               FunctionProtoType::ExceptionSpecInfo &ESI,
648                               SmallVectorImpl<QualType> &Exceptions,
649                               bool &Changed);
650 
651   StmtResult TransformSEHHandler(Stmt *Handler);
652 
653   QualType
654   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
655                                       TemplateSpecializationTypeLoc TL,
656                                       TemplateName Template);
657 
658   QualType
659   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
660                                       DependentTemplateSpecializationTypeLoc TL,
661                                                TemplateName Template,
662                                                CXXScopeSpec &SS);
663 
664   QualType TransformDependentTemplateSpecializationType(
665       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
666       NestedNameSpecifierLoc QualifierLoc);
667 
668   /// Transforms the parameters of a function type into the
669   /// given vectors.
670   ///
671   /// The result vectors should be kept in sync; null entries in the
672   /// variables vector are acceptable.
673   ///
674   /// Return true on error.
675   bool TransformFunctionTypeParams(
676       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
677       const QualType *ParamTypes,
678       const FunctionProtoType::ExtParameterInfo *ParamInfos,
679       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
680       Sema::ExtParameterInfoBuilder &PInfos);
681 
682   /// Transforms a single function-type parameter.  Return null
683   /// on error.
684   ///
685   /// \param indexAdjustment - A number to add to the parameter's
686   ///   scope index;  can be negative
687   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
688                                           int indexAdjustment,
689                                           Optional<unsigned> NumExpansions,
690                                           bool ExpectParameterPack);
691 
692   /// Transform the body of a lambda-expression.
693   StmtResult TransformLambdaBody(LambdaExpr *E, Stmt *Body);
694   /// Alternative implementation of TransformLambdaBody that skips transforming
695   /// the body.
696   StmtResult SkipLambdaBody(LambdaExpr *E, Stmt *Body);
697 
698   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
699 
700   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
701   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
702 
703   TemplateParameterList *TransformTemplateParameterList(
704         TemplateParameterList *TPL) {
705     return TPL;
706   }
707 
708   ExprResult TransformAddressOfOperand(Expr *E);
709 
710   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
711                                                 bool IsAddressOfOperand,
712                                                 TypeSourceInfo **RecoveryTSI);
713 
714   ExprResult TransformParenDependentScopeDeclRefExpr(
715       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
716       TypeSourceInfo **RecoveryTSI);
717 
718   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
719 
720 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
721 // amount of stack usage with clang.
722 #define STMT(Node, Parent)                        \
723   LLVM_ATTRIBUTE_NOINLINE \
724   StmtResult Transform##Node(Node *S);
725 #define VALUESTMT(Node, Parent)                   \
726   LLVM_ATTRIBUTE_NOINLINE \
727   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
728 #define EXPR(Node, Parent)                        \
729   LLVM_ATTRIBUTE_NOINLINE \
730   ExprResult Transform##Node(Node *E);
731 #define ABSTRACT_STMT(Stmt)
732 #include "clang/AST/StmtNodes.inc"
733 
734 #define GEN_CLANG_CLAUSE_CLASS
735 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
736   LLVM_ATTRIBUTE_NOINLINE                                                      \
737   OMPClause *Transform##Class(Class *S);
738 #include "llvm/Frontend/OpenMP/OMP.inc"
739 
740   /// Build a new qualified type given its unqualified type and type location.
741   ///
742   /// By default, this routine adds type qualifiers only to types that can
743   /// have qualifiers, and silently suppresses those qualifiers that are not
744   /// permitted. Subclasses may override this routine to provide different
745   /// behavior.
746   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
747 
748   /// Build a new pointer type given its pointee type.
749   ///
750   /// By default, performs semantic analysis when building the pointer type.
751   /// Subclasses may override this routine to provide different behavior.
752   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
753 
754   /// Build a new block pointer type given its pointee type.
755   ///
756   /// By default, performs semantic analysis when building the block pointer
757   /// type. Subclasses may override this routine to provide different behavior.
758   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
759 
760   /// Build a new reference type given the type it references.
761   ///
762   /// By default, performs semantic analysis when building the
763   /// reference type. Subclasses may override this routine to provide
764   /// different behavior.
765   ///
766   /// \param LValue whether the type was written with an lvalue sigil
767   /// or an rvalue sigil.
768   QualType RebuildReferenceType(QualType ReferentType,
769                                 bool LValue,
770                                 SourceLocation Sigil);
771 
772   /// Build a new member pointer type given the pointee type and the
773   /// class type it refers into.
774   ///
775   /// By default, performs semantic analysis when building the member pointer
776   /// type. Subclasses may override this routine to provide different behavior.
777   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
778                                     SourceLocation Sigil);
779 
780   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
781                                     SourceLocation ProtocolLAngleLoc,
782                                     ArrayRef<ObjCProtocolDecl *> Protocols,
783                                     ArrayRef<SourceLocation> ProtocolLocs,
784                                     SourceLocation ProtocolRAngleLoc);
785 
786   /// Build an Objective-C object type.
787   ///
788   /// By default, performs semantic analysis when building the object type.
789   /// Subclasses may override this routine to provide different behavior.
790   QualType RebuildObjCObjectType(QualType BaseType,
791                                  SourceLocation Loc,
792                                  SourceLocation TypeArgsLAngleLoc,
793                                  ArrayRef<TypeSourceInfo *> TypeArgs,
794                                  SourceLocation TypeArgsRAngleLoc,
795                                  SourceLocation ProtocolLAngleLoc,
796                                  ArrayRef<ObjCProtocolDecl *> Protocols,
797                                  ArrayRef<SourceLocation> ProtocolLocs,
798                                  SourceLocation ProtocolRAngleLoc);
799 
800   /// Build a new Objective-C object pointer type given the pointee type.
801   ///
802   /// By default, directly builds the pointer type, with no additional semantic
803   /// analysis.
804   QualType RebuildObjCObjectPointerType(QualType PointeeType,
805                                         SourceLocation Star);
806 
807   /// Build a new array type given the element type, size
808   /// modifier, size of the array (if known), size expression, and index type
809   /// qualifiers.
810   ///
811   /// By default, performs semantic analysis when building the array type.
812   /// Subclasses may override this routine to provide different behavior.
813   /// Also by default, all of the other Rebuild*Array
814   QualType RebuildArrayType(QualType ElementType,
815                             ArrayType::ArraySizeModifier SizeMod,
816                             const llvm::APInt *Size,
817                             Expr *SizeExpr,
818                             unsigned IndexTypeQuals,
819                             SourceRange BracketsRange);
820 
821   /// Build a new constant array type given the element type, size
822   /// modifier, (known) size of the array, and index type qualifiers.
823   ///
824   /// By default, performs semantic analysis when building the array type.
825   /// Subclasses may override this routine to provide different behavior.
826   QualType RebuildConstantArrayType(QualType ElementType,
827                                     ArrayType::ArraySizeModifier SizeMod,
828                                     const llvm::APInt &Size,
829                                     Expr *SizeExpr,
830                                     unsigned IndexTypeQuals,
831                                     SourceRange BracketsRange);
832 
833   /// Build a new incomplete array type given the element type, size
834   /// modifier, and index type qualifiers.
835   ///
836   /// By default, performs semantic analysis when building the array type.
837   /// Subclasses may override this routine to provide different behavior.
838   QualType RebuildIncompleteArrayType(QualType ElementType,
839                                       ArrayType::ArraySizeModifier SizeMod,
840                                       unsigned IndexTypeQuals,
841                                       SourceRange BracketsRange);
842 
843   /// Build a new variable-length array type given the element type,
844   /// size modifier, size expression, and index type qualifiers.
845   ///
846   /// By default, performs semantic analysis when building the array type.
847   /// Subclasses may override this routine to provide different behavior.
848   QualType RebuildVariableArrayType(QualType ElementType,
849                                     ArrayType::ArraySizeModifier SizeMod,
850                                     Expr *SizeExpr,
851                                     unsigned IndexTypeQuals,
852                                     SourceRange BracketsRange);
853 
854   /// Build a new dependent-sized array type given the element type,
855   /// size modifier, size expression, and index type qualifiers.
856   ///
857   /// By default, performs semantic analysis when building the array type.
858   /// Subclasses may override this routine to provide different behavior.
859   QualType RebuildDependentSizedArrayType(QualType ElementType,
860                                           ArrayType::ArraySizeModifier SizeMod,
861                                           Expr *SizeExpr,
862                                           unsigned IndexTypeQuals,
863                                           SourceRange BracketsRange);
864 
865   /// Build a new vector type given the element type and
866   /// number of elements.
867   ///
868   /// By default, performs semantic analysis when building the vector type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
871                              VectorType::VectorKind VecKind);
872 
873   /// Build a new potentially dependently-sized extended vector type
874   /// given the element type and number of elements.
875   ///
876   /// By default, performs semantic analysis when building the vector type.
877   /// Subclasses may override this routine to provide different behavior.
878   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
879                                            SourceLocation AttributeLoc,
880                                            VectorType::VectorKind);
881 
882   /// Build a new extended vector type given the element type and
883   /// number of elements.
884   ///
885   /// By default, performs semantic analysis when building the vector type.
886   /// Subclasses may override this routine to provide different behavior.
887   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
888                                 SourceLocation AttributeLoc);
889 
890   /// Build a new potentially dependently-sized extended vector type
891   /// given the element type and number of elements.
892   ///
893   /// By default, performs semantic analysis when building the vector type.
894   /// Subclasses may override this routine to provide different behavior.
895   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
896                                               Expr *SizeExpr,
897                                               SourceLocation AttributeLoc);
898 
899   /// Build a new matrix type given the element type and dimensions.
900   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
901                                      unsigned NumColumns);
902 
903   /// Build a new matrix type given the type and dependently-defined
904   /// dimensions.
905   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
906                                            Expr *ColumnExpr,
907                                            SourceLocation AttributeLoc);
908 
909   /// Build a new DependentAddressSpaceType or return the pointee
910   /// type variable with the correct address space (retrieved from
911   /// AddrSpaceExpr) applied to it. The former will be returned in cases
912   /// where the address space remains dependent.
913   ///
914   /// By default, performs semantic analysis when building the type with address
915   /// space applied. Subclasses may override this routine to provide different
916   /// behavior.
917   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
918                                             Expr *AddrSpaceExpr,
919                                             SourceLocation AttributeLoc);
920 
921   /// Build a new function type.
922   ///
923   /// By default, performs semantic analysis when building the function type.
924   /// Subclasses may override this routine to provide different behavior.
925   QualType RebuildFunctionProtoType(QualType T,
926                                     MutableArrayRef<QualType> ParamTypes,
927                                     const FunctionProtoType::ExtProtoInfo &EPI);
928 
929   /// Build a new unprototyped function type.
930   QualType RebuildFunctionNoProtoType(QualType ResultType);
931 
932   /// Rebuild an unresolved typename type, given the decl that
933   /// the UnresolvedUsingTypenameDecl was transformed to.
934   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
935 
936   /// Build a new typedef type.
937   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
938     return SemaRef.Context.getTypeDeclType(Typedef);
939   }
940 
941   /// Build a new MacroDefined type.
942   QualType RebuildMacroQualifiedType(QualType T,
943                                      const IdentifierInfo *MacroII) {
944     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
945   }
946 
947   /// Build a new class/struct/union type.
948   QualType RebuildRecordType(RecordDecl *Record) {
949     return SemaRef.Context.getTypeDeclType(Record);
950   }
951 
952   /// Build a new Enum type.
953   QualType RebuildEnumType(EnumDecl *Enum) {
954     return SemaRef.Context.getTypeDeclType(Enum);
955   }
956 
957   /// Build a new typeof(expr) type.
958   ///
959   /// By default, performs semantic analysis when building the typeof type.
960   /// Subclasses may override this routine to provide different behavior.
961   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
962 
963   /// Build a new typeof(type) type.
964   ///
965   /// By default, builds a new TypeOfType with the given underlying type.
966   QualType RebuildTypeOfType(QualType Underlying);
967 
968   /// Build a new unary transform type.
969   QualType RebuildUnaryTransformType(QualType BaseType,
970                                      UnaryTransformType::UTTKind UKind,
971                                      SourceLocation Loc);
972 
973   /// Build a new C++11 decltype type.
974   ///
975   /// By default, performs semantic analysis when building the decltype type.
976   /// Subclasses may override this routine to provide different behavior.
977   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
978 
979   /// Build a new C++11 auto type.
980   ///
981   /// By default, builds a new AutoType with the given deduced type.
982   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
983                            ConceptDecl *TypeConstraintConcept,
984                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
985     // Note, IsDependent is always false here: we implicitly convert an 'auto'
986     // which has been deduced to a dependent type into an undeduced 'auto', so
987     // that we'll retry deduction after the transformation.
988     return SemaRef.Context.getAutoType(Deduced, Keyword,
989                                        /*IsDependent*/ false, /*IsPack=*/false,
990                                        TypeConstraintConcept,
991                                        TypeConstraintArgs);
992   }
993 
994   /// By default, builds a new DeducedTemplateSpecializationType with the given
995   /// deduced type.
996   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
997       QualType Deduced) {
998     return SemaRef.Context.getDeducedTemplateSpecializationType(
999         Template, Deduced, /*IsDependent*/ false);
1000   }
1001 
1002   /// Build a new template specialization type.
1003   ///
1004   /// By default, performs semantic analysis when building the template
1005   /// specialization type. Subclasses may override this routine to provide
1006   /// different behavior.
1007   QualType RebuildTemplateSpecializationType(TemplateName Template,
1008                                              SourceLocation TemplateLoc,
1009                                              TemplateArgumentListInfo &Args);
1010 
1011   /// Build a new parenthesized type.
1012   ///
1013   /// By default, builds a new ParenType type from the inner type.
1014   /// Subclasses may override this routine to provide different behavior.
1015   QualType RebuildParenType(QualType InnerType) {
1016     return SemaRef.BuildParenType(InnerType);
1017   }
1018 
1019   /// Build a new qualified name type.
1020   ///
1021   /// By default, builds a new ElaboratedType type from the keyword,
1022   /// the nested-name-specifier and the named type.
1023   /// Subclasses may override this routine to provide different behavior.
1024   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1025                                  ElaboratedTypeKeyword Keyword,
1026                                  NestedNameSpecifierLoc QualifierLoc,
1027                                  QualType Named) {
1028     return SemaRef.Context.getElaboratedType(Keyword,
1029                                          QualifierLoc.getNestedNameSpecifier(),
1030                                              Named);
1031   }
1032 
1033   /// Build a new typename type that refers to a template-id.
1034   ///
1035   /// By default, builds a new DependentNameType type from the
1036   /// nested-name-specifier and the given type. Subclasses may override
1037   /// this routine to provide different behavior.
1038   QualType RebuildDependentTemplateSpecializationType(
1039                                           ElaboratedTypeKeyword Keyword,
1040                                           NestedNameSpecifierLoc QualifierLoc,
1041                                           SourceLocation TemplateKWLoc,
1042                                           const IdentifierInfo *Name,
1043                                           SourceLocation NameLoc,
1044                                           TemplateArgumentListInfo &Args,
1045                                           bool AllowInjectedClassName) {
1046     // Rebuild the template name.
1047     // TODO: avoid TemplateName abstraction
1048     CXXScopeSpec SS;
1049     SS.Adopt(QualifierLoc);
1050     TemplateName InstName = getDerived().RebuildTemplateName(
1051         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1052         AllowInjectedClassName);
1053 
1054     if (InstName.isNull())
1055       return QualType();
1056 
1057     // If it's still dependent, make a dependent specialization.
1058     if (InstName.getAsDependentTemplateName())
1059       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1060                                           QualifierLoc.getNestedNameSpecifier(),
1061                                                                     Name,
1062                                                                     Args);
1063 
1064     // Otherwise, make an elaborated type wrapping a non-dependent
1065     // specialization.
1066     QualType T =
1067     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1068     if (T.isNull()) return QualType();
1069 
1070     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1071       return T;
1072 
1073     return SemaRef.Context.getElaboratedType(Keyword,
1074                                        QualifierLoc.getNestedNameSpecifier(),
1075                                              T);
1076   }
1077 
1078   /// Build a new typename type that refers to an identifier.
1079   ///
1080   /// By default, performs semantic analysis when building the typename type
1081   /// (or elaborated type). Subclasses may override this routine to provide
1082   /// different behavior.
1083   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1084                                     SourceLocation KeywordLoc,
1085                                     NestedNameSpecifierLoc QualifierLoc,
1086                                     const IdentifierInfo *Id,
1087                                     SourceLocation IdLoc,
1088                                     bool DeducedTSTContext) {
1089     CXXScopeSpec SS;
1090     SS.Adopt(QualifierLoc);
1091 
1092     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1093       // If the name is still dependent, just build a new dependent name type.
1094       if (!SemaRef.computeDeclContext(SS))
1095         return SemaRef.Context.getDependentNameType(Keyword,
1096                                           QualifierLoc.getNestedNameSpecifier(),
1097                                                     Id);
1098     }
1099 
1100     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1101       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1102                                        *Id, IdLoc, DeducedTSTContext);
1103     }
1104 
1105     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1106 
1107     // We had a dependent elaborated-type-specifier that has been transformed
1108     // into a non-dependent elaborated-type-specifier. Find the tag we're
1109     // referring to.
1110     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1111     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1112     if (!DC)
1113       return QualType();
1114 
1115     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1116       return QualType();
1117 
1118     TagDecl *Tag = nullptr;
1119     SemaRef.LookupQualifiedName(Result, DC);
1120     switch (Result.getResultKind()) {
1121       case LookupResult::NotFound:
1122       case LookupResult::NotFoundInCurrentInstantiation:
1123         break;
1124 
1125       case LookupResult::Found:
1126         Tag = Result.getAsSingle<TagDecl>();
1127         break;
1128 
1129       case LookupResult::FoundOverloaded:
1130       case LookupResult::FoundUnresolvedValue:
1131         llvm_unreachable("Tag lookup cannot find non-tags");
1132 
1133       case LookupResult::Ambiguous:
1134         // Let the LookupResult structure handle ambiguities.
1135         return QualType();
1136     }
1137 
1138     if (!Tag) {
1139       // Check where the name exists but isn't a tag type and use that to emit
1140       // better diagnostics.
1141       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1142       SemaRef.LookupQualifiedName(Result, DC);
1143       switch (Result.getResultKind()) {
1144         case LookupResult::Found:
1145         case LookupResult::FoundOverloaded:
1146         case LookupResult::FoundUnresolvedValue: {
1147           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1148           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1149           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1150                                                                << NTK << Kind;
1151           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1152           break;
1153         }
1154         default:
1155           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1156               << Kind << Id << DC << QualifierLoc.getSourceRange();
1157           break;
1158       }
1159       return QualType();
1160     }
1161 
1162     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1163                                               IdLoc, Id)) {
1164       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1165       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1166       return QualType();
1167     }
1168 
1169     // Build the elaborated-type-specifier type.
1170     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1171     return SemaRef.Context.getElaboratedType(Keyword,
1172                                          QualifierLoc.getNestedNameSpecifier(),
1173                                              T);
1174   }
1175 
1176   /// Build a new pack expansion type.
1177   ///
1178   /// By default, builds a new PackExpansionType type from the given pattern.
1179   /// Subclasses may override this routine to provide different behavior.
1180   QualType RebuildPackExpansionType(QualType Pattern,
1181                                     SourceRange PatternRange,
1182                                     SourceLocation EllipsisLoc,
1183                                     Optional<unsigned> NumExpansions) {
1184     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1185                                         NumExpansions);
1186   }
1187 
1188   /// Build a new atomic type given its value type.
1189   ///
1190   /// By default, performs semantic analysis when building the atomic type.
1191   /// Subclasses may override this routine to provide different behavior.
1192   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1193 
1194   /// Build a new pipe type given its value type.
1195   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1196                            bool isReadPipe);
1197 
1198    /// Build an extended int given its value type.
1199   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1200                              SourceLocation Loc);
1201 
1202   /// Build a dependent extended int given its value type.
1203   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1204                                       SourceLocation Loc);
1205 
1206   /// Build a new template name given a nested name specifier, a flag
1207   /// indicating whether the "template" keyword was provided, and the template
1208   /// that the template name refers to.
1209   ///
1210   /// By default, builds the new template name directly. Subclasses may override
1211   /// this routine to provide different behavior.
1212   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1213                                    bool TemplateKW,
1214                                    TemplateDecl *Template);
1215 
1216   /// Build a new template name given a nested name specifier and the
1217   /// name that is referred to as a template.
1218   ///
1219   /// By default, performs semantic analysis to determine whether the name can
1220   /// be resolved to a specific template, then builds the appropriate kind of
1221   /// template name. Subclasses may override this routine to provide different
1222   /// behavior.
1223   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1224                                    SourceLocation TemplateKWLoc,
1225                                    const IdentifierInfo &Name,
1226                                    SourceLocation NameLoc, QualType ObjectType,
1227                                    NamedDecl *FirstQualifierInScope,
1228                                    bool AllowInjectedClassName);
1229 
1230   /// Build a new template name given a nested name specifier and the
1231   /// overloaded operator name that is referred to as a template.
1232   ///
1233   /// By default, performs semantic analysis to determine whether the name can
1234   /// be resolved to a specific template, then builds the appropriate kind of
1235   /// template name. Subclasses may override this routine to provide different
1236   /// behavior.
1237   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1238                                    SourceLocation TemplateKWLoc,
1239                                    OverloadedOperatorKind Operator,
1240                                    SourceLocation NameLoc, QualType ObjectType,
1241                                    bool AllowInjectedClassName);
1242 
1243   /// Build a new template name given a template template parameter pack
1244   /// and the
1245   ///
1246   /// By default, performs semantic analysis to determine whether the name can
1247   /// be resolved to a specific template, then builds the appropriate kind of
1248   /// template name. Subclasses may override this routine to provide different
1249   /// behavior.
1250   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1251                                    const TemplateArgument &ArgPack) {
1252     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1253   }
1254 
1255   /// Build a new compound statement.
1256   ///
1257   /// By default, performs semantic analysis to build the new statement.
1258   /// Subclasses may override this routine to provide different behavior.
1259   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1260                                        MultiStmtArg Statements,
1261                                        SourceLocation RBraceLoc,
1262                                        bool IsStmtExpr) {
1263     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1264                                        IsStmtExpr);
1265   }
1266 
1267   /// Build a new case statement.
1268   ///
1269   /// By default, performs semantic analysis to build the new statement.
1270   /// Subclasses may override this routine to provide different behavior.
1271   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1272                                    Expr *LHS,
1273                                    SourceLocation EllipsisLoc,
1274                                    Expr *RHS,
1275                                    SourceLocation ColonLoc) {
1276     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1277                                    ColonLoc);
1278   }
1279 
1280   /// Attach the body to a new case statement.
1281   ///
1282   /// By default, performs semantic analysis to build the new statement.
1283   /// Subclasses may override this routine to provide different behavior.
1284   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1285     getSema().ActOnCaseStmtBody(S, Body);
1286     return S;
1287   }
1288 
1289   /// Build a new default statement.
1290   ///
1291   /// By default, performs semantic analysis to build the new statement.
1292   /// Subclasses may override this routine to provide different behavior.
1293   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1294                                       SourceLocation ColonLoc,
1295                                       Stmt *SubStmt) {
1296     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1297                                       /*CurScope=*/nullptr);
1298   }
1299 
1300   /// Build a new label statement.
1301   ///
1302   /// By default, performs semantic analysis to build the new statement.
1303   /// Subclasses may override this routine to provide different behavior.
1304   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1305                               SourceLocation ColonLoc, Stmt *SubStmt) {
1306     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1307   }
1308 
1309   /// Build a new attributed statement.
1310   ///
1311   /// By default, performs semantic analysis to build the new statement.
1312   /// Subclasses may override this routine to provide different behavior.
1313   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1314                                    ArrayRef<const Attr *> Attrs,
1315                                    Stmt *SubStmt) {
1316     return SemaRef.BuildAttributedStmt(AttrLoc, Attrs, SubStmt);
1317   }
1318 
1319   /// Build a new "if" statement.
1320   ///
1321   /// By default, performs semantic analysis to build the new statement.
1322   /// Subclasses may override this routine to provide different behavior.
1323   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1324                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1325                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1326                            SourceLocation ElseLoc, Stmt *Else) {
1327     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond,
1328                                  RParenLoc, Then, ElseLoc, Else);
1329   }
1330 
1331   /// Start building a new switch statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1336                                     SourceLocation LParenLoc, Stmt *Init,
1337                                     Sema::ConditionResult Cond,
1338                                     SourceLocation RParenLoc) {
1339     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1340                                             RParenLoc);
1341   }
1342 
1343   /// Attach the body to the switch statement.
1344   ///
1345   /// By default, performs semantic analysis to build the new statement.
1346   /// Subclasses may override this routine to provide different behavior.
1347   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1348                                    Stmt *Switch, Stmt *Body) {
1349     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1350   }
1351 
1352   /// Build a new while statement.
1353   ///
1354   /// By default, performs semantic analysis to build the new statement.
1355   /// Subclasses may override this routine to provide different behavior.
1356   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1357                               Sema::ConditionResult Cond,
1358                               SourceLocation RParenLoc, Stmt *Body) {
1359     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1360   }
1361 
1362   /// Build a new do-while statement.
1363   ///
1364   /// By default, performs semantic analysis to build the new statement.
1365   /// Subclasses may override this routine to provide different behavior.
1366   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1367                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1368                            Expr *Cond, SourceLocation RParenLoc) {
1369     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1370                                  Cond, RParenLoc);
1371   }
1372 
1373   /// Build a new for statement.
1374   ///
1375   /// By default, performs semantic analysis to build the new statement.
1376   /// Subclasses may override this routine to provide different behavior.
1377   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1378                             Stmt *Init, Sema::ConditionResult Cond,
1379                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1380                             Stmt *Body) {
1381     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1382                                   Inc, RParenLoc, Body);
1383   }
1384 
1385   /// Build a new goto statement.
1386   ///
1387   /// By default, performs semantic analysis to build the new statement.
1388   /// Subclasses may override this routine to provide different behavior.
1389   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1390                              LabelDecl *Label) {
1391     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1392   }
1393 
1394   /// Build a new indirect goto statement.
1395   ///
1396   /// By default, performs semantic analysis to build the new statement.
1397   /// Subclasses may override this routine to provide different behavior.
1398   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1399                                      SourceLocation StarLoc,
1400                                      Expr *Target) {
1401     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1402   }
1403 
1404   /// Build a new return statement.
1405   ///
1406   /// By default, performs semantic analysis to build the new statement.
1407   /// Subclasses may override this routine to provide different behavior.
1408   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1409     return getSema().BuildReturnStmt(ReturnLoc, Result);
1410   }
1411 
1412   /// Build a new declaration statement.
1413   ///
1414   /// By default, performs semantic analysis to build the new statement.
1415   /// Subclasses may override this routine to provide different behavior.
1416   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1417                              SourceLocation StartLoc, SourceLocation EndLoc) {
1418     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1419     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1420   }
1421 
1422   /// Build a new inline asm statement.
1423   ///
1424   /// By default, performs semantic analysis to build the new statement.
1425   /// Subclasses may override this routine to provide different behavior.
1426   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1427                                bool IsVolatile, unsigned NumOutputs,
1428                                unsigned NumInputs, IdentifierInfo **Names,
1429                                MultiExprArg Constraints, MultiExprArg Exprs,
1430                                Expr *AsmString, MultiExprArg Clobbers,
1431                                unsigned NumLabels,
1432                                SourceLocation RParenLoc) {
1433     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1434                                      NumInputs, Names, Constraints, Exprs,
1435                                      AsmString, Clobbers, NumLabels, RParenLoc);
1436   }
1437 
1438   /// Build a new MS style inline asm statement.
1439   ///
1440   /// By default, performs semantic analysis to build the new statement.
1441   /// Subclasses may override this routine to provide different behavior.
1442   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1443                               ArrayRef<Token> AsmToks,
1444                               StringRef AsmString,
1445                               unsigned NumOutputs, unsigned NumInputs,
1446                               ArrayRef<StringRef> Constraints,
1447                               ArrayRef<StringRef> Clobbers,
1448                               ArrayRef<Expr*> Exprs,
1449                               SourceLocation EndLoc) {
1450     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1451                                     NumOutputs, NumInputs,
1452                                     Constraints, Clobbers, Exprs, EndLoc);
1453   }
1454 
1455   /// Build a new co_return statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
1459   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1460                                  bool IsImplicit) {
1461     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1462   }
1463 
1464   /// Build a new co_await expression.
1465   ///
1466   /// By default, performs semantic analysis to build the new expression.
1467   /// Subclasses may override this routine to provide different behavior.
1468   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1469                                 bool IsImplicit) {
1470     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1471   }
1472 
1473   /// Build a new co_await expression.
1474   ///
1475   /// By default, performs semantic analysis to build the new expression.
1476   /// Subclasses may override this routine to provide different behavior.
1477   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1478                                          Expr *Result,
1479                                          UnresolvedLookupExpr *Lookup) {
1480     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1481   }
1482 
1483   /// Build a new co_yield expression.
1484   ///
1485   /// By default, performs semantic analysis to build the new expression.
1486   /// Subclasses may override this routine to provide different behavior.
1487   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1488     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1489   }
1490 
1491   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1492     return getSema().BuildCoroutineBodyStmt(Args);
1493   }
1494 
1495   /// Build a new Objective-C \@try statement.
1496   ///
1497   /// By default, performs semantic analysis to build the new statement.
1498   /// Subclasses may override this routine to provide different behavior.
1499   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1500                                         Stmt *TryBody,
1501                                         MultiStmtArg CatchStmts,
1502                                         Stmt *Finally) {
1503     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1504                                         Finally);
1505   }
1506 
1507   /// Rebuild an Objective-C exception declaration.
1508   ///
1509   /// By default, performs semantic analysis to build the new declaration.
1510   /// Subclasses may override this routine to provide different behavior.
1511   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1512                                     TypeSourceInfo *TInfo, QualType T) {
1513     return getSema().BuildObjCExceptionDecl(TInfo, T,
1514                                             ExceptionDecl->getInnerLocStart(),
1515                                             ExceptionDecl->getLocation(),
1516                                             ExceptionDecl->getIdentifier());
1517   }
1518 
1519   /// Build a new Objective-C \@catch statement.
1520   ///
1521   /// By default, performs semantic analysis to build the new statement.
1522   /// Subclasses may override this routine to provide different behavior.
1523   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1524                                           SourceLocation RParenLoc,
1525                                           VarDecl *Var,
1526                                           Stmt *Body) {
1527     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1528                                           Var, Body);
1529   }
1530 
1531   /// Build a new Objective-C \@finally statement.
1532   ///
1533   /// By default, performs semantic analysis to build the new statement.
1534   /// Subclasses may override this routine to provide different behavior.
1535   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1536                                             Stmt *Body) {
1537     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1538   }
1539 
1540   /// Build a new Objective-C \@throw statement.
1541   ///
1542   /// By default, performs semantic analysis to build the new statement.
1543   /// Subclasses may override this routine to provide different behavior.
1544   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1545                                           Expr *Operand) {
1546     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1547   }
1548 
1549   /// Build a new OpenMP Canonical loop.
1550   ///
1551   /// Ensures that the outermost loop in @p LoopStmt is wrapped by a
1552   /// OMPCanonicalLoop.
1553   StmtResult RebuildOMPCanonicalLoop(Stmt *LoopStmt) {
1554     return getSema().ActOnOpenMPCanonicalLoop(LoopStmt);
1555   }
1556 
1557   /// Build a new OpenMP executable directive.
1558   ///
1559   /// By default, performs semantic analysis to build the new statement.
1560   /// Subclasses may override this routine to provide different behavior.
1561   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1562                                            DeclarationNameInfo DirName,
1563                                            OpenMPDirectiveKind CancelRegion,
1564                                            ArrayRef<OMPClause *> Clauses,
1565                                            Stmt *AStmt, SourceLocation StartLoc,
1566                                            SourceLocation EndLoc) {
1567     return getSema().ActOnOpenMPExecutableDirective(
1568         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1569   }
1570 
1571   /// Build a new OpenMP 'if' clause.
1572   ///
1573   /// By default, performs semantic analysis to build the new OpenMP clause.
1574   /// Subclasses may override this routine to provide different behavior.
1575   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1576                                 Expr *Condition, SourceLocation StartLoc,
1577                                 SourceLocation LParenLoc,
1578                                 SourceLocation NameModifierLoc,
1579                                 SourceLocation ColonLoc,
1580                                 SourceLocation EndLoc) {
1581     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1582                                          LParenLoc, NameModifierLoc, ColonLoc,
1583                                          EndLoc);
1584   }
1585 
1586   /// Build a new OpenMP 'final' clause.
1587   ///
1588   /// By default, performs semantic analysis to build the new OpenMP clause.
1589   /// Subclasses may override this routine to provide different behavior.
1590   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1591                                    SourceLocation LParenLoc,
1592                                    SourceLocation EndLoc) {
1593     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1594                                             EndLoc);
1595   }
1596 
1597   /// Build a new OpenMP 'num_threads' clause.
1598   ///
1599   /// By default, performs semantic analysis to build the new OpenMP clause.
1600   /// Subclasses may override this routine to provide different behavior.
1601   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1602                                         SourceLocation StartLoc,
1603                                         SourceLocation LParenLoc,
1604                                         SourceLocation EndLoc) {
1605     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1606                                                  LParenLoc, EndLoc);
1607   }
1608 
1609   /// Build a new OpenMP 'safelen' clause.
1610   ///
1611   /// By default, performs semantic analysis to build the new OpenMP clause.
1612   /// Subclasses may override this routine to provide different behavior.
1613   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1614                                      SourceLocation LParenLoc,
1615                                      SourceLocation EndLoc) {
1616     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1617   }
1618 
1619   /// Build a new OpenMP 'simdlen' clause.
1620   ///
1621   /// By default, performs semantic analysis to build the new OpenMP clause.
1622   /// Subclasses may override this routine to provide different behavior.
1623   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1624                                      SourceLocation LParenLoc,
1625                                      SourceLocation EndLoc) {
1626     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1627   }
1628 
1629   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1630                                    SourceLocation StartLoc,
1631                                    SourceLocation LParenLoc,
1632                                    SourceLocation EndLoc) {
1633     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1634   }
1635 
1636   /// Build a new OpenMP 'allocator' clause.
1637   ///
1638   /// By default, performs semantic analysis to build the new OpenMP clause.
1639   /// Subclasses may override this routine to provide different behavior.
1640   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1641                                        SourceLocation LParenLoc,
1642                                        SourceLocation EndLoc) {
1643     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1644   }
1645 
1646   /// Build a new OpenMP 'collapse' clause.
1647   ///
1648   /// By default, performs semantic analysis to build the new OpenMP clause.
1649   /// Subclasses may override this routine to provide different behavior.
1650   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1651                                       SourceLocation LParenLoc,
1652                                       SourceLocation EndLoc) {
1653     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1654                                                EndLoc);
1655   }
1656 
1657   /// Build a new OpenMP 'default' clause.
1658   ///
1659   /// By default, performs semantic analysis to build the new OpenMP clause.
1660   /// Subclasses may override this routine to provide different behavior.
1661   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1662                                      SourceLocation StartLoc,
1663                                      SourceLocation LParenLoc,
1664                                      SourceLocation EndLoc) {
1665     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1666                                               StartLoc, LParenLoc, EndLoc);
1667   }
1668 
1669   /// Build a new OpenMP 'proc_bind' clause.
1670   ///
1671   /// By default, performs semantic analysis to build the new OpenMP clause.
1672   /// Subclasses may override this routine to provide different behavior.
1673   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1674                                       SourceLocation KindKwLoc,
1675                                       SourceLocation StartLoc,
1676                                       SourceLocation LParenLoc,
1677                                       SourceLocation EndLoc) {
1678     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1679                                                StartLoc, LParenLoc, EndLoc);
1680   }
1681 
1682   /// Build a new OpenMP 'schedule' clause.
1683   ///
1684   /// By default, performs semantic analysis to build the new OpenMP clause.
1685   /// Subclasses may override this routine to provide different behavior.
1686   OMPClause *RebuildOMPScheduleClause(
1687       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1688       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1689       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1690       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1691     return getSema().ActOnOpenMPScheduleClause(
1692         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1693         CommaLoc, EndLoc);
1694   }
1695 
1696   /// Build a new OpenMP 'ordered' 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 *RebuildOMPOrderedClause(SourceLocation StartLoc,
1701                                      SourceLocation EndLoc,
1702                                      SourceLocation LParenLoc, Expr *Num) {
1703     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1704   }
1705 
1706   /// Build a new OpenMP 'private' clause.
1707   ///
1708   /// By default, performs semantic analysis to build the new OpenMP clause.
1709   /// Subclasses may override this routine to provide different behavior.
1710   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1711                                      SourceLocation StartLoc,
1712                                      SourceLocation LParenLoc,
1713                                      SourceLocation EndLoc) {
1714     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1715                                               EndLoc);
1716   }
1717 
1718   /// Build a new OpenMP 'firstprivate' clause.
1719   ///
1720   /// By default, performs semantic analysis to build the new OpenMP clause.
1721   /// Subclasses may override this routine to provide different behavior.
1722   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1723                                           SourceLocation StartLoc,
1724                                           SourceLocation LParenLoc,
1725                                           SourceLocation EndLoc) {
1726     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1727                                                    EndLoc);
1728   }
1729 
1730   /// Build a new OpenMP 'lastprivate' clause.
1731   ///
1732   /// By default, performs semantic analysis to build the new OpenMP clause.
1733   /// Subclasses may override this routine to provide different behavior.
1734   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1735                                          OpenMPLastprivateModifier LPKind,
1736                                          SourceLocation LPKindLoc,
1737                                          SourceLocation ColonLoc,
1738                                          SourceLocation StartLoc,
1739                                          SourceLocation LParenLoc,
1740                                          SourceLocation EndLoc) {
1741     return getSema().ActOnOpenMPLastprivateClause(
1742         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1743   }
1744 
1745   /// Build a new OpenMP 'shared' clause.
1746   ///
1747   /// By default, performs semantic analysis to build the new OpenMP clause.
1748   /// Subclasses may override this routine to provide different behavior.
1749   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1750                                     SourceLocation StartLoc,
1751                                     SourceLocation LParenLoc,
1752                                     SourceLocation EndLoc) {
1753     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1754                                              EndLoc);
1755   }
1756 
1757   /// Build a new OpenMP 'reduction' clause.
1758   ///
1759   /// By default, performs semantic analysis to build the new statement.
1760   /// Subclasses may override this routine to provide different behavior.
1761   OMPClause *RebuildOMPReductionClause(
1762       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1763       SourceLocation StartLoc, SourceLocation LParenLoc,
1764       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1765       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1766       const DeclarationNameInfo &ReductionId,
1767       ArrayRef<Expr *> UnresolvedReductions) {
1768     return getSema().ActOnOpenMPReductionClause(
1769         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1770         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1771   }
1772 
1773   /// Build a new OpenMP 'task_reduction' clause.
1774   ///
1775   /// By default, performs semantic analysis to build the new statement.
1776   /// Subclasses may override this routine to provide different behavior.
1777   OMPClause *RebuildOMPTaskReductionClause(
1778       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1779       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1780       CXXScopeSpec &ReductionIdScopeSpec,
1781       const DeclarationNameInfo &ReductionId,
1782       ArrayRef<Expr *> UnresolvedReductions) {
1783     return getSema().ActOnOpenMPTaskReductionClause(
1784         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1785         ReductionId, UnresolvedReductions);
1786   }
1787 
1788   /// Build a new OpenMP 'in_reduction' clause.
1789   ///
1790   /// By default, performs semantic analysis to build the new statement.
1791   /// Subclasses may override this routine to provide different behavior.
1792   OMPClause *
1793   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1794                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1795                               SourceLocation EndLoc,
1796                               CXXScopeSpec &ReductionIdScopeSpec,
1797                               const DeclarationNameInfo &ReductionId,
1798                               ArrayRef<Expr *> UnresolvedReductions) {
1799     return getSema().ActOnOpenMPInReductionClause(
1800         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1801         ReductionId, UnresolvedReductions);
1802   }
1803 
1804   /// Build a new OpenMP 'linear' clause.
1805   ///
1806   /// By default, performs semantic analysis to build the new OpenMP clause.
1807   /// Subclasses may override this routine to provide different behavior.
1808   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1809                                     SourceLocation StartLoc,
1810                                     SourceLocation LParenLoc,
1811                                     OpenMPLinearClauseKind Modifier,
1812                                     SourceLocation ModifierLoc,
1813                                     SourceLocation ColonLoc,
1814                                     SourceLocation EndLoc) {
1815     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1816                                              Modifier, ModifierLoc, ColonLoc,
1817                                              EndLoc);
1818   }
1819 
1820   /// Build a new OpenMP 'aligned' clause.
1821   ///
1822   /// By default, performs semantic analysis to build the new OpenMP clause.
1823   /// Subclasses may override this routine to provide different behavior.
1824   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1825                                      SourceLocation StartLoc,
1826                                      SourceLocation LParenLoc,
1827                                      SourceLocation ColonLoc,
1828                                      SourceLocation EndLoc) {
1829     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1830                                               LParenLoc, ColonLoc, EndLoc);
1831   }
1832 
1833   /// Build a new OpenMP 'copyin' clause.
1834   ///
1835   /// By default, performs semantic analysis to build the new OpenMP clause.
1836   /// Subclasses may override this routine to provide different behavior.
1837   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1838                                     SourceLocation StartLoc,
1839                                     SourceLocation LParenLoc,
1840                                     SourceLocation EndLoc) {
1841     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1842                                              EndLoc);
1843   }
1844 
1845   /// Build a new OpenMP 'copyprivate' clause.
1846   ///
1847   /// By default, performs semantic analysis to build the new OpenMP clause.
1848   /// Subclasses may override this routine to provide different behavior.
1849   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1850                                          SourceLocation StartLoc,
1851                                          SourceLocation LParenLoc,
1852                                          SourceLocation EndLoc) {
1853     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1854                                                   EndLoc);
1855   }
1856 
1857   /// Build a new OpenMP 'flush' pseudo clause.
1858   ///
1859   /// By default, performs semantic analysis to build the new OpenMP clause.
1860   /// Subclasses may override this routine to provide different behavior.
1861   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1862                                    SourceLocation StartLoc,
1863                                    SourceLocation LParenLoc,
1864                                    SourceLocation EndLoc) {
1865     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1866                                             EndLoc);
1867   }
1868 
1869   /// Build a new OpenMP 'depobj' pseudo clause.
1870   ///
1871   /// By default, performs semantic analysis to build the new OpenMP clause.
1872   /// Subclasses may override this routine to provide different behavior.
1873   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1874                                     SourceLocation LParenLoc,
1875                                     SourceLocation EndLoc) {
1876     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1877                                              EndLoc);
1878   }
1879 
1880   /// Build a new OpenMP 'depend' pseudo clause.
1881   ///
1882   /// By default, performs semantic analysis to build the new OpenMP clause.
1883   /// Subclasses may override this routine to provide different behavior.
1884   OMPClause *
1885   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1886                          SourceLocation DepLoc, SourceLocation ColonLoc,
1887                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1888                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1889     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1890                                              ColonLoc, VarList, StartLoc,
1891                                              LParenLoc, EndLoc);
1892   }
1893 
1894   /// Build a new OpenMP 'device' clause.
1895   ///
1896   /// By default, performs semantic analysis to build the new statement.
1897   /// Subclasses may override this routine to provide different behavior.
1898   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1899                                     Expr *Device, SourceLocation StartLoc,
1900                                     SourceLocation LParenLoc,
1901                                     SourceLocation ModifierLoc,
1902                                     SourceLocation EndLoc) {
1903     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1904                                              LParenLoc, ModifierLoc, EndLoc);
1905   }
1906 
1907   /// Build a new OpenMP 'map' clause.
1908   ///
1909   /// By default, performs semantic analysis to build the new OpenMP clause.
1910   /// Subclasses may override this routine to provide different behavior.
1911   OMPClause *RebuildOMPMapClause(
1912       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1913       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1914       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1915       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1916       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1917       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1918     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1919                                           MapperIdScopeSpec, MapperId, MapType,
1920                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1921                                           VarList, Locs, UnresolvedMappers);
1922   }
1923 
1924   /// Build a new OpenMP 'allocate' clause.
1925   ///
1926   /// By default, performs semantic analysis to build the new OpenMP clause.
1927   /// Subclasses may override this routine to provide different behavior.
1928   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1929                                       SourceLocation StartLoc,
1930                                       SourceLocation LParenLoc,
1931                                       SourceLocation ColonLoc,
1932                                       SourceLocation EndLoc) {
1933     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1934                                                LParenLoc, ColonLoc, EndLoc);
1935   }
1936 
1937   /// Build a new OpenMP 'num_teams' clause.
1938   ///
1939   /// By default, performs semantic analysis to build the new statement.
1940   /// Subclasses may override this routine to provide different behavior.
1941   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1942                                       SourceLocation LParenLoc,
1943                                       SourceLocation EndLoc) {
1944     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1945                                                EndLoc);
1946   }
1947 
1948   /// Build a new OpenMP 'thread_limit' clause.
1949   ///
1950   /// By default, performs semantic analysis to build the new statement.
1951   /// Subclasses may override this routine to provide different behavior.
1952   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1953                                          SourceLocation StartLoc,
1954                                          SourceLocation LParenLoc,
1955                                          SourceLocation EndLoc) {
1956     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1957                                                   LParenLoc, EndLoc);
1958   }
1959 
1960   /// Build a new OpenMP 'priority' 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 *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1965                                       SourceLocation LParenLoc,
1966                                       SourceLocation EndLoc) {
1967     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1968                                                EndLoc);
1969   }
1970 
1971   /// Build a new OpenMP 'grainsize' 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 *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1976                                        SourceLocation LParenLoc,
1977                                        SourceLocation EndLoc) {
1978     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1979                                                 EndLoc);
1980   }
1981 
1982   /// Build a new OpenMP 'num_tasks' clause.
1983   ///
1984   /// By default, performs semantic analysis to build the new statement.
1985   /// Subclasses may override this routine to provide different behavior.
1986   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1987                                       SourceLocation LParenLoc,
1988                                       SourceLocation EndLoc) {
1989     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1990                                                EndLoc);
1991   }
1992 
1993   /// Build a new OpenMP 'hint' clause.
1994   ///
1995   /// By default, performs semantic analysis to build the new statement.
1996   /// Subclasses may override this routine to provide different behavior.
1997   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1998                                   SourceLocation LParenLoc,
1999                                   SourceLocation EndLoc) {
2000     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
2001   }
2002 
2003   /// Build a new OpenMP 'detach' clause.
2004   ///
2005   /// By default, performs semantic analysis to build the new statement.
2006   /// Subclasses may override this routine to provide different behavior.
2007   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2008                                     SourceLocation LParenLoc,
2009                                     SourceLocation EndLoc) {
2010     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2011   }
2012 
2013   /// Build a new OpenMP 'dist_schedule' clause.
2014   ///
2015   /// By default, performs semantic analysis to build the new OpenMP clause.
2016   /// Subclasses may override this routine to provide different behavior.
2017   OMPClause *
2018   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2019                                Expr *ChunkSize, SourceLocation StartLoc,
2020                                SourceLocation LParenLoc, SourceLocation KindLoc,
2021                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2022     return getSema().ActOnOpenMPDistScheduleClause(
2023         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2024   }
2025 
2026   /// Build a new OpenMP 'to' clause.
2027   ///
2028   /// By default, performs semantic analysis to build the new statement.
2029   /// Subclasses may override this routine to provide different behavior.
2030   OMPClause *
2031   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2032                      ArrayRef<SourceLocation> MotionModifiersLoc,
2033                      CXXScopeSpec &MapperIdScopeSpec,
2034                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2035                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2036                      ArrayRef<Expr *> UnresolvedMappers) {
2037     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2038                                          MapperIdScopeSpec, MapperId, ColonLoc,
2039                                          VarList, Locs, UnresolvedMappers);
2040   }
2041 
2042   /// Build a new OpenMP 'from' clause.
2043   ///
2044   /// By default, performs semantic analysis to build the new statement.
2045   /// Subclasses may override this routine to provide different behavior.
2046   OMPClause *
2047   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2048                        ArrayRef<SourceLocation> MotionModifiersLoc,
2049                        CXXScopeSpec &MapperIdScopeSpec,
2050                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2051                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2052                        ArrayRef<Expr *> UnresolvedMappers) {
2053     return getSema().ActOnOpenMPFromClause(
2054         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2055         ColonLoc, VarList, Locs, UnresolvedMappers);
2056   }
2057 
2058   /// Build a new OpenMP 'use_device_ptr' clause.
2059   ///
2060   /// By default, performs semantic analysis to build the new OpenMP clause.
2061   /// Subclasses may override this routine to provide different behavior.
2062   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2063                                           const OMPVarListLocTy &Locs) {
2064     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2065   }
2066 
2067   /// Build a new OpenMP 'use_device_addr' clause.
2068   ///
2069   /// By default, performs semantic analysis to build the new OpenMP clause.
2070   /// Subclasses may override this routine to provide different behavior.
2071   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2072                                            const OMPVarListLocTy &Locs) {
2073     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2074   }
2075 
2076   /// Build a new OpenMP 'is_device_ptr' clause.
2077   ///
2078   /// By default, performs semantic analysis to build the new OpenMP clause.
2079   /// Subclasses may override this routine to provide different behavior.
2080   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2081                                          const OMPVarListLocTy &Locs) {
2082     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2083   }
2084 
2085   /// Build a new OpenMP 'defaultmap' clause.
2086   ///
2087   /// By default, performs semantic analysis to build the new OpenMP clause.
2088   /// Subclasses may override this routine to provide different behavior.
2089   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2090                                         OpenMPDefaultmapClauseKind Kind,
2091                                         SourceLocation StartLoc,
2092                                         SourceLocation LParenLoc,
2093                                         SourceLocation MLoc,
2094                                         SourceLocation KindLoc,
2095                                         SourceLocation EndLoc) {
2096     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2097                                                  MLoc, KindLoc, EndLoc);
2098   }
2099 
2100   /// Build a new OpenMP 'nontemporal' clause.
2101   ///
2102   /// By default, performs semantic analysis to build the new OpenMP clause.
2103   /// Subclasses may override this routine to provide different behavior.
2104   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2105                                          SourceLocation StartLoc,
2106                                          SourceLocation LParenLoc,
2107                                          SourceLocation EndLoc) {
2108     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2109                                                   EndLoc);
2110   }
2111 
2112   /// Build a new OpenMP 'inclusive' clause.
2113   ///
2114   /// By default, performs semantic analysis to build the new OpenMP clause.
2115   /// Subclasses may override this routine to provide different behavior.
2116   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2117                                        SourceLocation StartLoc,
2118                                        SourceLocation LParenLoc,
2119                                        SourceLocation EndLoc) {
2120     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2121                                                 EndLoc);
2122   }
2123 
2124   /// Build a new OpenMP 'exclusive' clause.
2125   ///
2126   /// By default, performs semantic analysis to build the new OpenMP clause.
2127   /// Subclasses may override this routine to provide different behavior.
2128   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2129                                        SourceLocation StartLoc,
2130                                        SourceLocation LParenLoc,
2131                                        SourceLocation EndLoc) {
2132     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2133                                                 EndLoc);
2134   }
2135 
2136   /// Build a new OpenMP 'uses_allocators' clause.
2137   ///
2138   /// By default, performs semantic analysis to build the new OpenMP clause.
2139   /// Subclasses may override this routine to provide different behavior.
2140   OMPClause *RebuildOMPUsesAllocatorsClause(
2141       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2142       SourceLocation LParenLoc, SourceLocation EndLoc) {
2143     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2144                                                     Data);
2145   }
2146 
2147   /// Build a new OpenMP 'affinity' clause.
2148   ///
2149   /// By default, performs semantic analysis to build the new OpenMP clause.
2150   /// Subclasses may override this routine to provide different behavior.
2151   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2152                                       SourceLocation LParenLoc,
2153                                       SourceLocation ColonLoc,
2154                                       SourceLocation EndLoc, Expr *Modifier,
2155                                       ArrayRef<Expr *> Locators) {
2156     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2157                                                EndLoc, Modifier, Locators);
2158   }
2159 
2160   /// Build a new OpenMP 'order' clause.
2161   ///
2162   /// By default, performs semantic analysis to build the new OpenMP clause.
2163   /// Subclasses may override this routine to provide different behavior.
2164   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2165                                    SourceLocation KindKwLoc,
2166                                    SourceLocation StartLoc,
2167                                    SourceLocation LParenLoc,
2168                                    SourceLocation EndLoc) {
2169     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2170                                             LParenLoc, EndLoc);
2171   }
2172 
2173   /// Build a new OpenMP 'init' clause.
2174   ///
2175   /// By default, performs semantic analysis to build the new OpenMP clause.
2176   /// Subclasses may override this routine to provide different behavior.
2177   OMPClause *RebuildOMPInitClause(Expr *InteropVar, ArrayRef<Expr *> PrefExprs,
2178                                   bool IsTarget, bool IsTargetSync,
2179                                   SourceLocation StartLoc,
2180                                   SourceLocation LParenLoc,
2181                                   SourceLocation VarLoc,
2182                                   SourceLocation EndLoc) {
2183     return getSema().ActOnOpenMPInitClause(InteropVar, PrefExprs, IsTarget,
2184                                            IsTargetSync, StartLoc, LParenLoc,
2185                                            VarLoc, EndLoc);
2186   }
2187 
2188   /// Build a new OpenMP 'use' clause.
2189   ///
2190   /// By default, performs semantic analysis to build the new OpenMP clause.
2191   /// Subclasses may override this routine to provide different behavior.
2192   OMPClause *RebuildOMPUseClause(Expr *InteropVar, SourceLocation StartLoc,
2193                                  SourceLocation LParenLoc,
2194                                  SourceLocation VarLoc, SourceLocation EndLoc) {
2195     return getSema().ActOnOpenMPUseClause(InteropVar, StartLoc, LParenLoc,
2196                                           VarLoc, EndLoc);
2197   }
2198 
2199   /// Build a new OpenMP 'destroy' clause.
2200   ///
2201   /// By default, performs semantic analysis to build the new OpenMP clause.
2202   /// Subclasses may override this routine to provide different behavior.
2203   OMPClause *RebuildOMPDestroyClause(Expr *InteropVar, SourceLocation StartLoc,
2204                                      SourceLocation LParenLoc,
2205                                      SourceLocation VarLoc,
2206                                      SourceLocation EndLoc) {
2207     return getSema().ActOnOpenMPDestroyClause(InteropVar, StartLoc, LParenLoc,
2208                                               VarLoc, EndLoc);
2209   }
2210 
2211   /// Build a new OpenMP 'novariants' clause.
2212   ///
2213   /// By default, performs semantic analysis to build the new OpenMP clause.
2214   /// Subclasses may override this routine to provide different behavior.
2215   OMPClause *RebuildOMPNovariantsClause(Expr *Condition,
2216                                         SourceLocation StartLoc,
2217                                         SourceLocation LParenLoc,
2218                                         SourceLocation EndLoc) {
2219     return getSema().ActOnOpenMPNovariantsClause(Condition, StartLoc, LParenLoc,
2220                                                  EndLoc);
2221   }
2222 
2223   /// Build a new OpenMP 'nocontext' clause.
2224   ///
2225   /// By default, performs semantic analysis to build the new OpenMP clause.
2226   /// Subclasses may override this routine to provide different behavior.
2227   OMPClause *RebuildOMPNocontextClause(Expr *Condition, SourceLocation StartLoc,
2228                                        SourceLocation LParenLoc,
2229                                        SourceLocation EndLoc) {
2230     return getSema().ActOnOpenMPNocontextClause(Condition, StartLoc, LParenLoc,
2231                                                 EndLoc);
2232   }
2233 
2234   /// Build a new OpenMP 'filter' clause.
2235   ///
2236   /// By default, performs semantic analysis to build the new OpenMP clause.
2237   /// Subclasses may override this routine to provide different behavior.
2238   OMPClause *RebuildOMPFilterClause(Expr *ThreadID, SourceLocation StartLoc,
2239                                     SourceLocation LParenLoc,
2240                                     SourceLocation EndLoc) {
2241     return getSema().ActOnOpenMPFilterClause(ThreadID, StartLoc, LParenLoc,
2242                                              EndLoc);
2243   }
2244 
2245   /// Rebuild the operand to an Objective-C \@synchronized statement.
2246   ///
2247   /// By default, performs semantic analysis to build the new statement.
2248   /// Subclasses may override this routine to provide different behavior.
2249   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2250                                               Expr *object) {
2251     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2252   }
2253 
2254   /// Build a new Objective-C \@synchronized statement.
2255   ///
2256   /// By default, performs semantic analysis to build the new statement.
2257   /// Subclasses may override this routine to provide different behavior.
2258   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2259                                            Expr *Object, Stmt *Body) {
2260     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2261   }
2262 
2263   /// Build a new Objective-C \@autoreleasepool statement.
2264   ///
2265   /// By default, performs semantic analysis to build the new statement.
2266   /// Subclasses may override this routine to provide different behavior.
2267   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2268                                             Stmt *Body) {
2269     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2270   }
2271 
2272   /// Build a new Objective-C fast enumeration statement.
2273   ///
2274   /// By default, performs semantic analysis to build the new statement.
2275   /// Subclasses may override this routine to provide different behavior.
2276   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2277                                           Stmt *Element,
2278                                           Expr *Collection,
2279                                           SourceLocation RParenLoc,
2280                                           Stmt *Body) {
2281     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2282                                                 Element,
2283                                                 Collection,
2284                                                 RParenLoc);
2285     if (ForEachStmt.isInvalid())
2286       return StmtError();
2287 
2288     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2289   }
2290 
2291   /// Build a new C++ exception declaration.
2292   ///
2293   /// By default, performs semantic analysis to build the new decaration.
2294   /// Subclasses may override this routine to provide different behavior.
2295   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2296                                 TypeSourceInfo *Declarator,
2297                                 SourceLocation StartLoc,
2298                                 SourceLocation IdLoc,
2299                                 IdentifierInfo *Id) {
2300     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2301                                                        StartLoc, IdLoc, Id);
2302     if (Var)
2303       getSema().CurContext->addDecl(Var);
2304     return Var;
2305   }
2306 
2307   /// Build a new C++ catch statement.
2308   ///
2309   /// By default, performs semantic analysis to build the new statement.
2310   /// Subclasses may override this routine to provide different behavior.
2311   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2312                                  VarDecl *ExceptionDecl,
2313                                  Stmt *Handler) {
2314     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2315                                                       Handler));
2316   }
2317 
2318   /// Build a new C++ try statement.
2319   ///
2320   /// By default, performs semantic analysis to build the new statement.
2321   /// Subclasses may override this routine to provide different behavior.
2322   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2323                                ArrayRef<Stmt *> Handlers) {
2324     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2325   }
2326 
2327   /// Build a new C++0x range-based for statement.
2328   ///
2329   /// By default, performs semantic analysis to build the new statement.
2330   /// Subclasses may override this routine to provide different behavior.
2331   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2332                                     SourceLocation CoawaitLoc, Stmt *Init,
2333                                     SourceLocation ColonLoc, Stmt *Range,
2334                                     Stmt *Begin, Stmt *End, Expr *Cond,
2335                                     Expr *Inc, Stmt *LoopVar,
2336                                     SourceLocation RParenLoc) {
2337     // If we've just learned that the range is actually an Objective-C
2338     // collection, treat this as an Objective-C fast enumeration loop.
2339     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2340       if (RangeStmt->isSingleDecl()) {
2341         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2342           if (RangeVar->isInvalidDecl())
2343             return StmtError();
2344 
2345           Expr *RangeExpr = RangeVar->getInit();
2346           if (!RangeExpr->isTypeDependent() &&
2347               RangeExpr->getType()->isObjCObjectPointerType()) {
2348             // FIXME: Support init-statements in Objective-C++20 ranged for
2349             // statement.
2350             if (Init) {
2351               return SemaRef.Diag(Init->getBeginLoc(),
2352                                   diag::err_objc_for_range_init_stmt)
2353                          << Init->getSourceRange();
2354             }
2355             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2356                                                         RangeExpr, RParenLoc);
2357           }
2358         }
2359       }
2360     }
2361 
2362     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2363                                           Range, Begin, End, Cond, Inc, LoopVar,
2364                                           RParenLoc, Sema::BFRK_Rebuild);
2365   }
2366 
2367   /// Build a new C++0x range-based for statement.
2368   ///
2369   /// By default, performs semantic analysis to build the new statement.
2370   /// Subclasses may override this routine to provide different behavior.
2371   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2372                                           bool IsIfExists,
2373                                           NestedNameSpecifierLoc QualifierLoc,
2374                                           DeclarationNameInfo NameInfo,
2375                                           Stmt *Nested) {
2376     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2377                                                 QualifierLoc, NameInfo, Nested);
2378   }
2379 
2380   /// Attach body to a C++0x range-based for statement.
2381   ///
2382   /// By default, performs semantic analysis to finish the new statement.
2383   /// Subclasses may override this routine to provide different behavior.
2384   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2385     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2386   }
2387 
2388   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2389                                Stmt *TryBlock, Stmt *Handler) {
2390     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2391   }
2392 
2393   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2394                                   Stmt *Block) {
2395     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2396   }
2397 
2398   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2399     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2400   }
2401 
2402   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2403                                              SourceLocation LParen,
2404                                              SourceLocation RParen, Expr *E) {
2405     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, E);
2406   }
2407 
2408   ExprResult RebuildSYCLUniqueStableNameExpr(SourceLocation OpLoc,
2409                                              SourceLocation LParen,
2410                                              SourceLocation RParen,
2411                                              TypeSourceInfo *TSI) {
2412     return getSema().BuildSYCLUniqueStableNameExpr(OpLoc, LParen, RParen, TSI);
2413   }
2414 
2415   /// Build a new predefined expression.
2416   ///
2417   /// By default, performs semantic analysis to build the new expression.
2418   /// Subclasses may override this routine to provide different behavior.
2419   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2420                                    PredefinedExpr::IdentKind IK) {
2421     return getSema().BuildPredefinedExpr(Loc, IK);
2422   }
2423 
2424   /// Build a new expression that references a declaration.
2425   ///
2426   /// By default, performs semantic analysis to build the new expression.
2427   /// Subclasses may override this routine to provide different behavior.
2428   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2429                                         LookupResult &R,
2430                                         bool RequiresADL) {
2431     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2432   }
2433 
2434 
2435   /// Build a new expression that references a declaration.
2436   ///
2437   /// By default, performs semantic analysis to build the new expression.
2438   /// Subclasses may override this routine to provide different behavior.
2439   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2440                                 ValueDecl *VD,
2441                                 const DeclarationNameInfo &NameInfo,
2442                                 NamedDecl *Found,
2443                                 TemplateArgumentListInfo *TemplateArgs) {
2444     CXXScopeSpec SS;
2445     SS.Adopt(QualifierLoc);
2446     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2447                                               TemplateArgs);
2448   }
2449 
2450   /// Build a new expression in parentheses.
2451   ///
2452   /// By default, performs semantic analysis to build the new expression.
2453   /// Subclasses may override this routine to provide different behavior.
2454   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2455                                     SourceLocation RParen) {
2456     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2457   }
2458 
2459   /// Build a new pseudo-destructor expression.
2460   ///
2461   /// By default, performs semantic analysis to build the new expression.
2462   /// Subclasses may override this routine to provide different behavior.
2463   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2464                                             SourceLocation OperatorLoc,
2465                                             bool isArrow,
2466                                             CXXScopeSpec &SS,
2467                                             TypeSourceInfo *ScopeType,
2468                                             SourceLocation CCLoc,
2469                                             SourceLocation TildeLoc,
2470                                         PseudoDestructorTypeStorage Destroyed);
2471 
2472   /// Build a new unary operator expression.
2473   ///
2474   /// By default, performs semantic analysis to build the new expression.
2475   /// Subclasses may override this routine to provide different behavior.
2476   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2477                                         UnaryOperatorKind Opc,
2478                                         Expr *SubExpr) {
2479     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2480   }
2481 
2482   /// Build a new builtin offsetof expression.
2483   ///
2484   /// By default, performs semantic analysis to build the new expression.
2485   /// Subclasses may override this routine to provide different behavior.
2486   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2487                                  TypeSourceInfo *Type,
2488                                  ArrayRef<Sema::OffsetOfComponent> Components,
2489                                  SourceLocation RParenLoc) {
2490     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2491                                           RParenLoc);
2492   }
2493 
2494   /// Build a new sizeof, alignof or vec_step expression with a
2495   /// type argument.
2496   ///
2497   /// By default, performs semantic analysis to build the new expression.
2498   /// Subclasses may override this routine to provide different behavior.
2499   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2500                                          SourceLocation OpLoc,
2501                                          UnaryExprOrTypeTrait ExprKind,
2502                                          SourceRange R) {
2503     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2504   }
2505 
2506   /// Build a new sizeof, alignof or vec step expression with an
2507   /// expression argument.
2508   ///
2509   /// By default, performs semantic analysis to build the new expression.
2510   /// Subclasses may override this routine to provide different behavior.
2511   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2512                                          UnaryExprOrTypeTrait ExprKind,
2513                                          SourceRange R) {
2514     ExprResult Result
2515       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2516     if (Result.isInvalid())
2517       return ExprError();
2518 
2519     return Result;
2520   }
2521 
2522   /// Build a new array subscript expression.
2523   ///
2524   /// By default, performs semantic analysis to build the new expression.
2525   /// Subclasses may override this routine to provide different behavior.
2526   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2527                                              SourceLocation LBracketLoc,
2528                                              Expr *RHS,
2529                                              SourceLocation RBracketLoc) {
2530     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2531                                              LBracketLoc, RHS,
2532                                              RBracketLoc);
2533   }
2534 
2535   /// Build a new matrix subscript expression.
2536   ///
2537   /// By default, performs semantic analysis to build the new expression.
2538   /// Subclasses may override this routine to provide different behavior.
2539   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2540                                         Expr *ColumnIdx,
2541                                         SourceLocation RBracketLoc) {
2542     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2543                                                       RBracketLoc);
2544   }
2545 
2546   /// Build a new array section expression.
2547   ///
2548   /// By default, performs semantic analysis to build the new expression.
2549   /// Subclasses may override this routine to provide different behavior.
2550   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2551                                         Expr *LowerBound,
2552                                         SourceLocation ColonLocFirst,
2553                                         SourceLocation ColonLocSecond,
2554                                         Expr *Length, Expr *Stride,
2555                                         SourceLocation RBracketLoc) {
2556     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2557                                               ColonLocFirst, ColonLocSecond,
2558                                               Length, Stride, RBracketLoc);
2559   }
2560 
2561   /// Build a new array shaping expression.
2562   ///
2563   /// By default, performs semantic analysis to build the new expression.
2564   /// Subclasses may override this routine to provide different behavior.
2565   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2566                                         SourceLocation RParenLoc,
2567                                         ArrayRef<Expr *> Dims,
2568                                         ArrayRef<SourceRange> BracketsRanges) {
2569     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2570                                               BracketsRanges);
2571   }
2572 
2573   /// Build a new iterator expression.
2574   ///
2575   /// By default, performs semantic analysis to build the new expression.
2576   /// Subclasses may override this routine to provide different behavior.
2577   ExprResult RebuildOMPIteratorExpr(
2578       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2579       ArrayRef<Sema::OMPIteratorData> Data) {
2580     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2581                                           LLoc, RLoc, Data);
2582   }
2583 
2584   /// Build a new call expression.
2585   ///
2586   /// By default, performs semantic analysis to build the new expression.
2587   /// Subclasses may override this routine to provide different behavior.
2588   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2589                                    MultiExprArg Args,
2590                                    SourceLocation RParenLoc,
2591                                    Expr *ExecConfig = nullptr) {
2592     return getSema().ActOnCallExpr(
2593         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2594   }
2595 
2596   /// Build a new member access expression.
2597   ///
2598   /// By default, performs semantic analysis to build the new expression.
2599   /// Subclasses may override this routine to provide different behavior.
2600   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2601                                bool isArrow,
2602                                NestedNameSpecifierLoc QualifierLoc,
2603                                SourceLocation TemplateKWLoc,
2604                                const DeclarationNameInfo &MemberNameInfo,
2605                                ValueDecl *Member,
2606                                NamedDecl *FoundDecl,
2607                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2608                                NamedDecl *FirstQualifierInScope) {
2609     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2610                                                                       isArrow);
2611     if (!Member->getDeclName()) {
2612       // We have a reference to an unnamed field.  This is always the
2613       // base of an anonymous struct/union member access, i.e. the
2614       // field is always of record type.
2615       assert(Member->getType()->isRecordType() &&
2616              "unnamed member not of record type?");
2617 
2618       BaseResult =
2619         getSema().PerformObjectMemberConversion(BaseResult.get(),
2620                                                 QualifierLoc.getNestedNameSpecifier(),
2621                                                 FoundDecl, Member);
2622       if (BaseResult.isInvalid())
2623         return ExprError();
2624       Base = BaseResult.get();
2625 
2626       CXXScopeSpec EmptySS;
2627       return getSema().BuildFieldReferenceExpr(
2628           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2629           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2630     }
2631 
2632     CXXScopeSpec SS;
2633     SS.Adopt(QualifierLoc);
2634 
2635     Base = BaseResult.get();
2636     QualType BaseType = Base->getType();
2637 
2638     if (isArrow && !BaseType->isPointerType())
2639       return ExprError();
2640 
2641     // FIXME: this involves duplicating earlier analysis in a lot of
2642     // cases; we should avoid this when possible.
2643     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2644     R.addDecl(FoundDecl);
2645     R.resolveKind();
2646 
2647     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2648                                               SS, TemplateKWLoc,
2649                                               FirstQualifierInScope,
2650                                               R, ExplicitTemplateArgs,
2651                                               /*S*/nullptr);
2652   }
2653 
2654   /// Build a new binary operator expression.
2655   ///
2656   /// By default, performs semantic analysis to build the new expression.
2657   /// Subclasses may override this routine to provide different behavior.
2658   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2659                                          BinaryOperatorKind Opc,
2660                                          Expr *LHS, Expr *RHS) {
2661     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2662   }
2663 
2664   /// Build a new rewritten operator expression.
2665   ///
2666   /// By default, performs semantic analysis to build the new expression.
2667   /// Subclasses may override this routine to provide different behavior.
2668   ExprResult RebuildCXXRewrittenBinaryOperator(
2669       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2670       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2671     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2672                                            RHS, /*RequiresADL*/false);
2673   }
2674 
2675   /// Build a new conditional operator expression.
2676   ///
2677   /// By default, performs semantic analysis to build the new expression.
2678   /// Subclasses may override this routine to provide different behavior.
2679   ExprResult RebuildConditionalOperator(Expr *Cond,
2680                                         SourceLocation QuestionLoc,
2681                                         Expr *LHS,
2682                                         SourceLocation ColonLoc,
2683                                         Expr *RHS) {
2684     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2685                                         LHS, RHS);
2686   }
2687 
2688   /// Build a new C-style cast expression.
2689   ///
2690   /// By default, performs semantic analysis to build the new expression.
2691   /// Subclasses may override this routine to provide different behavior.
2692   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2693                                          TypeSourceInfo *TInfo,
2694                                          SourceLocation RParenLoc,
2695                                          Expr *SubExpr) {
2696     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2697                                          SubExpr);
2698   }
2699 
2700   /// Build a new compound literal expression.
2701   ///
2702   /// By default, performs semantic analysis to build the new expression.
2703   /// Subclasses may override this routine to provide different behavior.
2704   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2705                                               TypeSourceInfo *TInfo,
2706                                               SourceLocation RParenLoc,
2707                                               Expr *Init) {
2708     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2709                                               Init);
2710   }
2711 
2712   /// Build a new extended vector element access expression.
2713   ///
2714   /// By default, performs semantic analysis to build the new expression.
2715   /// Subclasses may override this routine to provide different behavior.
2716   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2717                                                SourceLocation OpLoc,
2718                                                SourceLocation AccessorLoc,
2719                                                IdentifierInfo &Accessor) {
2720 
2721     CXXScopeSpec SS;
2722     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2723     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2724                                               OpLoc, /*IsArrow*/ false,
2725                                               SS, SourceLocation(),
2726                                               /*FirstQualifierInScope*/ nullptr,
2727                                               NameInfo,
2728                                               /* TemplateArgs */ nullptr,
2729                                               /*S*/ nullptr);
2730   }
2731 
2732   /// Build a new initializer list expression.
2733   ///
2734   /// By default, performs semantic analysis to build the new expression.
2735   /// Subclasses may override this routine to provide different behavior.
2736   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2737                              MultiExprArg Inits,
2738                              SourceLocation RBraceLoc) {
2739     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2740   }
2741 
2742   /// Build a new designated initializer expression.
2743   ///
2744   /// By default, performs semantic analysis to build the new expression.
2745   /// Subclasses may override this routine to provide different behavior.
2746   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2747                                              MultiExprArg ArrayExprs,
2748                                              SourceLocation EqualOrColonLoc,
2749                                              bool GNUSyntax,
2750                                              Expr *Init) {
2751     ExprResult Result
2752       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2753                                            Init);
2754     if (Result.isInvalid())
2755       return ExprError();
2756 
2757     return Result;
2758   }
2759 
2760   /// Build a new value-initialized expression.
2761   ///
2762   /// By default, builds the implicit value initialization without performing
2763   /// any semantic analysis. Subclasses may override this routine to provide
2764   /// different behavior.
2765   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2766     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2767   }
2768 
2769   /// Build a new \c va_arg expression.
2770   ///
2771   /// By default, performs semantic analysis to build the new expression.
2772   /// Subclasses may override this routine to provide different behavior.
2773   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2774                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2775                                     SourceLocation RParenLoc) {
2776     return getSema().BuildVAArgExpr(BuiltinLoc,
2777                                     SubExpr, TInfo,
2778                                     RParenLoc);
2779   }
2780 
2781   /// Build a new expression list in parentheses.
2782   ///
2783   /// By default, performs semantic analysis to build the new expression.
2784   /// Subclasses may override this routine to provide different behavior.
2785   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2786                                   MultiExprArg SubExprs,
2787                                   SourceLocation RParenLoc) {
2788     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2789   }
2790 
2791   /// Build a new address-of-label expression.
2792   ///
2793   /// By default, performs semantic analysis, using the name of the label
2794   /// rather than attempting to map the label statement itself.
2795   /// Subclasses may override this routine to provide different behavior.
2796   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2797                                   SourceLocation LabelLoc, LabelDecl *Label) {
2798     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2799   }
2800 
2801   /// Build a new GNU statement expression.
2802   ///
2803   /// By default, performs semantic analysis to build the new expression.
2804   /// Subclasses may override this routine to provide different behavior.
2805   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2806                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2807     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2808                                    TemplateDepth);
2809   }
2810 
2811   /// Build a new __builtin_choose_expr 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 RebuildChooseExpr(SourceLocation BuiltinLoc,
2816                                      Expr *Cond, Expr *LHS, Expr *RHS,
2817                                      SourceLocation RParenLoc) {
2818     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2819                                    Cond, LHS, RHS,
2820                                    RParenLoc);
2821   }
2822 
2823   /// Build a new generic selection expression.
2824   ///
2825   /// By default, performs semantic analysis to build the new expression.
2826   /// Subclasses may override this routine to provide different behavior.
2827   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2828                                          SourceLocation DefaultLoc,
2829                                          SourceLocation RParenLoc,
2830                                          Expr *ControllingExpr,
2831                                          ArrayRef<TypeSourceInfo *> Types,
2832                                          ArrayRef<Expr *> Exprs) {
2833     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2834                                                 ControllingExpr, Types, Exprs);
2835   }
2836 
2837   /// Build a new overloaded operator call expression.
2838   ///
2839   /// By default, performs semantic analysis to build the new expression.
2840   /// The semantic analysis provides the behavior of template instantiation,
2841   /// copying with transformations that turn what looks like an overloaded
2842   /// operator call into a use of a builtin operator, performing
2843   /// argument-dependent lookup, etc. Subclasses may override this routine to
2844   /// provide different behavior.
2845   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2846                                               SourceLocation OpLoc,
2847                                               Expr *Callee,
2848                                               Expr *First,
2849                                               Expr *Second);
2850 
2851   /// Build a new C++ "named" cast expression, such as static_cast or
2852   /// reinterpret_cast.
2853   ///
2854   /// By default, this routine dispatches to one of the more-specific routines
2855   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2856   /// Subclasses may override this routine to provide different behavior.
2857   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2858                                            Stmt::StmtClass Class,
2859                                            SourceLocation LAngleLoc,
2860                                            TypeSourceInfo *TInfo,
2861                                            SourceLocation RAngleLoc,
2862                                            SourceLocation LParenLoc,
2863                                            Expr *SubExpr,
2864                                            SourceLocation RParenLoc) {
2865     switch (Class) {
2866     case Stmt::CXXStaticCastExprClass:
2867       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2868                                                    RAngleLoc, LParenLoc,
2869                                                    SubExpr, RParenLoc);
2870 
2871     case Stmt::CXXDynamicCastExprClass:
2872       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2873                                                     RAngleLoc, LParenLoc,
2874                                                     SubExpr, RParenLoc);
2875 
2876     case Stmt::CXXReinterpretCastExprClass:
2877       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2878                                                         RAngleLoc, LParenLoc,
2879                                                         SubExpr,
2880                                                         RParenLoc);
2881 
2882     case Stmt::CXXConstCastExprClass:
2883       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2884                                                    RAngleLoc, LParenLoc,
2885                                                    SubExpr, RParenLoc);
2886 
2887     case Stmt::CXXAddrspaceCastExprClass:
2888       return getDerived().RebuildCXXAddrspaceCastExpr(
2889           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2890 
2891     default:
2892       llvm_unreachable("Invalid C++ named cast");
2893     }
2894   }
2895 
2896   /// Build a new C++ static_cast expression.
2897   ///
2898   /// By default, performs semantic analysis to build the new expression.
2899   /// Subclasses may override this routine to provide different behavior.
2900   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2901                                             SourceLocation LAngleLoc,
2902                                             TypeSourceInfo *TInfo,
2903                                             SourceLocation RAngleLoc,
2904                                             SourceLocation LParenLoc,
2905                                             Expr *SubExpr,
2906                                             SourceLocation RParenLoc) {
2907     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2908                                        TInfo, SubExpr,
2909                                        SourceRange(LAngleLoc, RAngleLoc),
2910                                        SourceRange(LParenLoc, RParenLoc));
2911   }
2912 
2913   /// Build a new C++ dynamic_cast expression.
2914   ///
2915   /// By default, performs semantic analysis to build the new expression.
2916   /// Subclasses may override this routine to provide different behavior.
2917   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2918                                              SourceLocation LAngleLoc,
2919                                              TypeSourceInfo *TInfo,
2920                                              SourceLocation RAngleLoc,
2921                                              SourceLocation LParenLoc,
2922                                              Expr *SubExpr,
2923                                              SourceLocation RParenLoc) {
2924     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2925                                        TInfo, SubExpr,
2926                                        SourceRange(LAngleLoc, RAngleLoc),
2927                                        SourceRange(LParenLoc, RParenLoc));
2928   }
2929 
2930   /// Build a new C++ reinterpret_cast expression.
2931   ///
2932   /// By default, performs semantic analysis to build the new expression.
2933   /// Subclasses may override this routine to provide different behavior.
2934   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2935                                                  SourceLocation LAngleLoc,
2936                                                  TypeSourceInfo *TInfo,
2937                                                  SourceLocation RAngleLoc,
2938                                                  SourceLocation LParenLoc,
2939                                                  Expr *SubExpr,
2940                                                  SourceLocation RParenLoc) {
2941     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2942                                        TInfo, SubExpr,
2943                                        SourceRange(LAngleLoc, RAngleLoc),
2944                                        SourceRange(LParenLoc, RParenLoc));
2945   }
2946 
2947   /// Build a new C++ const_cast 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 RebuildCXXConstCastExpr(SourceLocation OpLoc,
2952                                            SourceLocation LAngleLoc,
2953                                            TypeSourceInfo *TInfo,
2954                                            SourceLocation RAngleLoc,
2955                                            SourceLocation LParenLoc,
2956                                            Expr *SubExpr,
2957                                            SourceLocation RParenLoc) {
2958     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2959                                        TInfo, SubExpr,
2960                                        SourceRange(LAngleLoc, RAngleLoc),
2961                                        SourceRange(LParenLoc, RParenLoc));
2962   }
2963 
2964   ExprResult
2965   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2966                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2967                               SourceLocation LParenLoc, Expr *SubExpr,
2968                               SourceLocation RParenLoc) {
2969     return getSema().BuildCXXNamedCast(
2970         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2971         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2972   }
2973 
2974   /// Build a new C++ functional-style cast expression.
2975   ///
2976   /// By default, performs semantic analysis to build the new expression.
2977   /// Subclasses may override this routine to provide different behavior.
2978   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2979                                           SourceLocation LParenLoc,
2980                                           Expr *Sub,
2981                                           SourceLocation RParenLoc,
2982                                           bool ListInitialization) {
2983     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2984                                                MultiExprArg(&Sub, 1), RParenLoc,
2985                                                ListInitialization);
2986   }
2987 
2988   /// Build a new C++ __builtin_bit_cast expression.
2989   ///
2990   /// By default, performs semantic analysis to build the new expression.
2991   /// Subclasses may override this routine to provide different behavior.
2992   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2993                                        TypeSourceInfo *TSI, Expr *Sub,
2994                                        SourceLocation RParenLoc) {
2995     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2996   }
2997 
2998   /// Build a new C++ typeid(type) expression.
2999   ///
3000   /// By default, performs semantic analysis to build the new expression.
3001   /// Subclasses may override this routine to provide different behavior.
3002   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3003                                         SourceLocation TypeidLoc,
3004                                         TypeSourceInfo *Operand,
3005                                         SourceLocation RParenLoc) {
3006     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3007                                     RParenLoc);
3008   }
3009 
3010 
3011   /// Build a new C++ typeid(expr) expression.
3012   ///
3013   /// By default, performs semantic analysis to build the new expression.
3014   /// Subclasses may override this routine to provide different behavior.
3015   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
3016                                         SourceLocation TypeidLoc,
3017                                         Expr *Operand,
3018                                         SourceLocation RParenLoc) {
3019     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
3020                                     RParenLoc);
3021   }
3022 
3023   /// Build a new C++ __uuidof(type) expression.
3024   ///
3025   /// By default, performs semantic analysis to build the new expression.
3026   /// Subclasses may override this routine to provide different behavior.
3027   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3028                                   TypeSourceInfo *Operand,
3029                                   SourceLocation RParenLoc) {
3030     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3031   }
3032 
3033   /// Build a new C++ __uuidof(expr) expression.
3034   ///
3035   /// By default, performs semantic analysis to build the new expression.
3036   /// Subclasses may override this routine to provide different behavior.
3037   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
3038                                   Expr *Operand, SourceLocation RParenLoc) {
3039     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
3040   }
3041 
3042   /// Build a new C++ "this" expression.
3043   ///
3044   /// By default, builds a new "this" expression without performing any
3045   /// semantic analysis. Subclasses may override this routine to provide
3046   /// different behavior.
3047   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3048                                 QualType ThisType,
3049                                 bool isImplicit) {
3050     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3051   }
3052 
3053   /// Build a new C++ throw expression.
3054   ///
3055   /// By default, performs semantic analysis to build the new expression.
3056   /// Subclasses may override this routine to provide different behavior.
3057   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3058                                  bool IsThrownVariableInScope) {
3059     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3060   }
3061 
3062   /// Build a new C++ default-argument expression.
3063   ///
3064   /// By default, builds a new default-argument expression, which does not
3065   /// require any semantic analysis. Subclasses may override this routine to
3066   /// provide different behavior.
3067   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3068     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3069                                      getSema().CurContext);
3070   }
3071 
3072   /// Build a new C++11 default-initialization expression.
3073   ///
3074   /// By default, builds a new default field initialization expression, which
3075   /// does not require any semantic analysis. Subclasses may override this
3076   /// routine to provide different behavior.
3077   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3078                                        FieldDecl *Field) {
3079     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3080                                       getSema().CurContext);
3081   }
3082 
3083   /// Build a new C++ zero-initialization expression.
3084   ///
3085   /// By default, performs semantic analysis to build the new expression.
3086   /// Subclasses may override this routine to provide different behavior.
3087   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3088                                            SourceLocation LParenLoc,
3089                                            SourceLocation RParenLoc) {
3090     return getSema().BuildCXXTypeConstructExpr(
3091         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3092   }
3093 
3094   /// Build a new C++ "new" expression.
3095   ///
3096   /// By default, performs semantic analysis to build the new expression.
3097   /// Subclasses may override this routine to provide different behavior.
3098   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3099                                bool UseGlobal,
3100                                SourceLocation PlacementLParen,
3101                                MultiExprArg PlacementArgs,
3102                                SourceLocation PlacementRParen,
3103                                SourceRange TypeIdParens,
3104                                QualType AllocatedType,
3105                                TypeSourceInfo *AllocatedTypeInfo,
3106                                Optional<Expr *> ArraySize,
3107                                SourceRange DirectInitRange,
3108                                Expr *Initializer) {
3109     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3110                                  PlacementLParen,
3111                                  PlacementArgs,
3112                                  PlacementRParen,
3113                                  TypeIdParens,
3114                                  AllocatedType,
3115                                  AllocatedTypeInfo,
3116                                  ArraySize,
3117                                  DirectInitRange,
3118                                  Initializer);
3119   }
3120 
3121   /// Build a new C++ "delete" expression.
3122   ///
3123   /// By default, performs semantic analysis to build the new expression.
3124   /// Subclasses may override this routine to provide different behavior.
3125   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3126                                         bool IsGlobalDelete,
3127                                         bool IsArrayForm,
3128                                         Expr *Operand) {
3129     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3130                                     Operand);
3131   }
3132 
3133   /// Build a new type trait expression.
3134   ///
3135   /// By default, performs semantic analysis to build the new expression.
3136   /// Subclasses may override this routine to provide different behavior.
3137   ExprResult RebuildTypeTrait(TypeTrait Trait,
3138                               SourceLocation StartLoc,
3139                               ArrayRef<TypeSourceInfo *> Args,
3140                               SourceLocation RParenLoc) {
3141     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3142   }
3143 
3144   /// Build a new array type trait expression.
3145   ///
3146   /// By default, performs semantic analysis to build the new expression.
3147   /// Subclasses may override this routine to provide different behavior.
3148   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3149                                    SourceLocation StartLoc,
3150                                    TypeSourceInfo *TSInfo,
3151                                    Expr *DimExpr,
3152                                    SourceLocation RParenLoc) {
3153     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3154   }
3155 
3156   /// Build a new expression trait expression.
3157   ///
3158   /// By default, performs semantic analysis to build the new expression.
3159   /// Subclasses may override this routine to provide different behavior.
3160   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3161                                    SourceLocation StartLoc,
3162                                    Expr *Queried,
3163                                    SourceLocation RParenLoc) {
3164     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3165   }
3166 
3167   /// Build a new (previously unresolved) declaration reference
3168   /// expression.
3169   ///
3170   /// By default, performs semantic analysis to build the new expression.
3171   /// Subclasses may override this routine to provide different behavior.
3172   ExprResult RebuildDependentScopeDeclRefExpr(
3173                                           NestedNameSpecifierLoc QualifierLoc,
3174                                           SourceLocation TemplateKWLoc,
3175                                        const DeclarationNameInfo &NameInfo,
3176                               const TemplateArgumentListInfo *TemplateArgs,
3177                                           bool IsAddressOfOperand,
3178                                           TypeSourceInfo **RecoveryTSI) {
3179     CXXScopeSpec SS;
3180     SS.Adopt(QualifierLoc);
3181 
3182     if (TemplateArgs || TemplateKWLoc.isValid())
3183       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3184                                                     TemplateArgs);
3185 
3186     return getSema().BuildQualifiedDeclarationNameExpr(
3187         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3188   }
3189 
3190   /// Build a new template-id expression.
3191   ///
3192   /// By default, performs semantic analysis to build the new expression.
3193   /// Subclasses may override this routine to provide different behavior.
3194   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3195                                    SourceLocation TemplateKWLoc,
3196                                    LookupResult &R,
3197                                    bool RequiresADL,
3198                               const TemplateArgumentListInfo *TemplateArgs) {
3199     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3200                                          TemplateArgs);
3201   }
3202 
3203   /// Build a new object-construction expression.
3204   ///
3205   /// By default, performs semantic analysis to build the new expression.
3206   /// Subclasses may override this routine to provide different behavior.
3207   ExprResult RebuildCXXConstructExpr(QualType T,
3208                                      SourceLocation Loc,
3209                                      CXXConstructorDecl *Constructor,
3210                                      bool IsElidable,
3211                                      MultiExprArg Args,
3212                                      bool HadMultipleCandidates,
3213                                      bool ListInitialization,
3214                                      bool StdInitListInitialization,
3215                                      bool RequiresZeroInit,
3216                              CXXConstructExpr::ConstructionKind ConstructKind,
3217                                      SourceRange ParenRange) {
3218     // Reconstruct the constructor we originally found, which might be
3219     // different if this is a call to an inherited constructor.
3220     CXXConstructorDecl *FoundCtor = Constructor;
3221     if (Constructor->isInheritingConstructor())
3222       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3223 
3224     SmallVector<Expr *, 8> ConvertedArgs;
3225     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3226                                           ConvertedArgs))
3227       return ExprError();
3228 
3229     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3230                                            IsElidable,
3231                                            ConvertedArgs,
3232                                            HadMultipleCandidates,
3233                                            ListInitialization,
3234                                            StdInitListInitialization,
3235                                            RequiresZeroInit, ConstructKind,
3236                                            ParenRange);
3237   }
3238 
3239   /// Build a new implicit construction via inherited constructor
3240   /// expression.
3241   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3242                                              CXXConstructorDecl *Constructor,
3243                                              bool ConstructsVBase,
3244                                              bool InheritedFromVBase) {
3245     return new (getSema().Context) CXXInheritedCtorInitExpr(
3246         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3247   }
3248 
3249   /// Build a new object-construction expression.
3250   ///
3251   /// By default, performs semantic analysis to build the new expression.
3252   /// Subclasses may override this routine to provide different behavior.
3253   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3254                                            SourceLocation LParenOrBraceLoc,
3255                                            MultiExprArg Args,
3256                                            SourceLocation RParenOrBraceLoc,
3257                                            bool ListInitialization) {
3258     return getSema().BuildCXXTypeConstructExpr(
3259         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3260   }
3261 
3262   /// Build a new object-construction expression.
3263   ///
3264   /// By default, performs semantic analysis to build the new expression.
3265   /// Subclasses may override this routine to provide different behavior.
3266   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3267                                                SourceLocation LParenLoc,
3268                                                MultiExprArg Args,
3269                                                SourceLocation RParenLoc,
3270                                                bool ListInitialization) {
3271     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3272                                                RParenLoc, ListInitialization);
3273   }
3274 
3275   /// Build a new member reference expression.
3276   ///
3277   /// By default, performs semantic analysis to build the new expression.
3278   /// Subclasses may override this routine to provide different behavior.
3279   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3280                                                 QualType BaseType,
3281                                                 bool IsArrow,
3282                                                 SourceLocation OperatorLoc,
3283                                           NestedNameSpecifierLoc QualifierLoc,
3284                                                 SourceLocation TemplateKWLoc,
3285                                             NamedDecl *FirstQualifierInScope,
3286                                    const DeclarationNameInfo &MemberNameInfo,
3287                               const TemplateArgumentListInfo *TemplateArgs) {
3288     CXXScopeSpec SS;
3289     SS.Adopt(QualifierLoc);
3290 
3291     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3292                                             OperatorLoc, IsArrow,
3293                                             SS, TemplateKWLoc,
3294                                             FirstQualifierInScope,
3295                                             MemberNameInfo,
3296                                             TemplateArgs, /*S*/nullptr);
3297   }
3298 
3299   /// Build a new member reference expression.
3300   ///
3301   /// By default, performs semantic analysis to build the new expression.
3302   /// Subclasses may override this routine to provide different behavior.
3303   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3304                                          SourceLocation OperatorLoc,
3305                                          bool IsArrow,
3306                                          NestedNameSpecifierLoc QualifierLoc,
3307                                          SourceLocation TemplateKWLoc,
3308                                          NamedDecl *FirstQualifierInScope,
3309                                          LookupResult &R,
3310                                 const TemplateArgumentListInfo *TemplateArgs) {
3311     CXXScopeSpec SS;
3312     SS.Adopt(QualifierLoc);
3313 
3314     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3315                                             OperatorLoc, IsArrow,
3316                                             SS, TemplateKWLoc,
3317                                             FirstQualifierInScope,
3318                                             R, TemplateArgs, /*S*/nullptr);
3319   }
3320 
3321   /// Build a new noexcept expression.
3322   ///
3323   /// By default, performs semantic analysis to build the new expression.
3324   /// Subclasses may override this routine to provide different behavior.
3325   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3326     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3327   }
3328 
3329   /// Build a new expression to compute the length of a parameter pack.
3330   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3331                                    NamedDecl *Pack,
3332                                    SourceLocation PackLoc,
3333                                    SourceLocation RParenLoc,
3334                                    Optional<unsigned> Length,
3335                                    ArrayRef<TemplateArgument> PartialArgs) {
3336     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3337                                   RParenLoc, Length, PartialArgs);
3338   }
3339 
3340   /// Build a new expression representing a call to a source location
3341   ///  builtin.
3342   ///
3343   /// By default, performs semantic analysis to build the new expression.
3344   /// Subclasses may override this routine to provide different behavior.
3345   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3346                                   SourceLocation BuiltinLoc,
3347                                   SourceLocation RPLoc,
3348                                   DeclContext *ParentContext) {
3349     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3350   }
3351 
3352   /// Build a new Objective-C boxed expression.
3353   ///
3354   /// By default, performs semantic analysis to build the new expression.
3355   /// Subclasses may override this routine to provide different behavior.
3356   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3357       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3358       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3359       TemplateArgumentListInfo *TALI) {
3360     CXXScopeSpec SS;
3361     SS.Adopt(NNS);
3362     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3363                                                          ConceptNameInfo,
3364                                                          FoundDecl,
3365                                                          NamedConcept, TALI);
3366     if (Result.isInvalid())
3367       return ExprError();
3368     return Result;
3369   }
3370 
3371   /// \brief Build a new requires expression.
3372   ///
3373   /// By default, performs semantic analysis to build the new expression.
3374   /// Subclasses may override this routine to provide different behavior.
3375   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3376                                  RequiresExprBodyDecl *Body,
3377                                  ArrayRef<ParmVarDecl *> LocalParameters,
3378                                  ArrayRef<concepts::Requirement *> Requirements,
3379                                  SourceLocation ClosingBraceLoc) {
3380     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3381                                 LocalParameters, Requirements, ClosingBraceLoc);
3382   }
3383 
3384   concepts::TypeRequirement *
3385   RebuildTypeRequirement(
3386       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3387     return SemaRef.BuildTypeRequirement(SubstDiag);
3388   }
3389 
3390   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3391     return SemaRef.BuildTypeRequirement(T);
3392   }
3393 
3394   concepts::ExprRequirement *
3395   RebuildExprRequirement(
3396       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3397       SourceLocation NoexceptLoc,
3398       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3399     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3400                                         std::move(Ret));
3401   }
3402 
3403   concepts::ExprRequirement *
3404   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3405                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3406     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3407                                         std::move(Ret));
3408   }
3409 
3410   concepts::NestedRequirement *
3411   RebuildNestedRequirement(
3412       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3413     return SemaRef.BuildNestedRequirement(SubstDiag);
3414   }
3415 
3416   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3417     return SemaRef.BuildNestedRequirement(Constraint);
3418   }
3419 
3420   /// \brief Build a new Objective-C boxed 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 RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3425     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3426   }
3427 
3428   /// Build a new Objective-C array literal.
3429   ///
3430   /// By default, performs semantic analysis to build the new expression.
3431   /// Subclasses may override this routine to provide different behavior.
3432   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3433                                      Expr **Elements, unsigned NumElements) {
3434     return getSema().BuildObjCArrayLiteral(Range,
3435                                            MultiExprArg(Elements, NumElements));
3436   }
3437 
3438   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3439                                          Expr *Base, Expr *Key,
3440                                          ObjCMethodDecl *getterMethod,
3441                                          ObjCMethodDecl *setterMethod) {
3442     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3443                                                    getterMethod, setterMethod);
3444   }
3445 
3446   /// Build a new Objective-C dictionary literal.
3447   ///
3448   /// By default, performs semantic analysis to build the new expression.
3449   /// Subclasses may override this routine to provide different behavior.
3450   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3451                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3452     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3453   }
3454 
3455   /// Build a new Objective-C \@encode expression.
3456   ///
3457   /// By default, performs semantic analysis to build the new expression.
3458   /// Subclasses may override this routine to provide different behavior.
3459   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3460                                          TypeSourceInfo *EncodeTypeInfo,
3461                                          SourceLocation RParenLoc) {
3462     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3463   }
3464 
3465   /// Build a new Objective-C class message.
3466   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3467                                           Selector Sel,
3468                                           ArrayRef<SourceLocation> SelectorLocs,
3469                                           ObjCMethodDecl *Method,
3470                                           SourceLocation LBracLoc,
3471                                           MultiExprArg Args,
3472                                           SourceLocation RBracLoc) {
3473     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3474                                      ReceiverTypeInfo->getType(),
3475                                      /*SuperLoc=*/SourceLocation(),
3476                                      Sel, Method, LBracLoc, SelectorLocs,
3477                                      RBracLoc, Args);
3478   }
3479 
3480   /// Build a new Objective-C instance message.
3481   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3482                                           Selector Sel,
3483                                           ArrayRef<SourceLocation> SelectorLocs,
3484                                           ObjCMethodDecl *Method,
3485                                           SourceLocation LBracLoc,
3486                                           MultiExprArg Args,
3487                                           SourceLocation RBracLoc) {
3488     return SemaRef.BuildInstanceMessage(Receiver,
3489                                         Receiver->getType(),
3490                                         /*SuperLoc=*/SourceLocation(),
3491                                         Sel, Method, LBracLoc, SelectorLocs,
3492                                         RBracLoc, Args);
3493   }
3494 
3495   /// Build a new Objective-C instance/class message to 'super'.
3496   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3497                                     Selector Sel,
3498                                     ArrayRef<SourceLocation> SelectorLocs,
3499                                     QualType SuperType,
3500                                     ObjCMethodDecl *Method,
3501                                     SourceLocation LBracLoc,
3502                                     MultiExprArg Args,
3503                                     SourceLocation RBracLoc) {
3504     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3505                                           SuperType,
3506                                           SuperLoc,
3507                                           Sel, Method, LBracLoc, SelectorLocs,
3508                                           RBracLoc, Args)
3509                                       : SemaRef.BuildClassMessage(nullptr,
3510                                           SuperType,
3511                                           SuperLoc,
3512                                           Sel, Method, LBracLoc, SelectorLocs,
3513                                           RBracLoc, Args);
3514 
3515 
3516   }
3517 
3518   /// Build a new Objective-C ivar reference expression.
3519   ///
3520   /// By default, performs semantic analysis to build the new expression.
3521   /// Subclasses may override this routine to provide different behavior.
3522   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3523                                           SourceLocation IvarLoc,
3524                                           bool IsArrow, bool IsFreeIvar) {
3525     CXXScopeSpec SS;
3526     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3527     ExprResult Result = getSema().BuildMemberReferenceExpr(
3528         BaseArg, BaseArg->getType(),
3529         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3530         /*FirstQualifierInScope=*/nullptr, NameInfo,
3531         /*TemplateArgs=*/nullptr,
3532         /*S=*/nullptr);
3533     if (IsFreeIvar && Result.isUsable())
3534       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3535     return Result;
3536   }
3537 
3538   /// Build a new Objective-C property reference expression.
3539   ///
3540   /// By default, performs semantic analysis to build the new expression.
3541   /// Subclasses may override this routine to provide different behavior.
3542   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3543                                         ObjCPropertyDecl *Property,
3544                                         SourceLocation PropertyLoc) {
3545     CXXScopeSpec SS;
3546     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3547     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3548                                               /*FIXME:*/PropertyLoc,
3549                                               /*IsArrow=*/false,
3550                                               SS, SourceLocation(),
3551                                               /*FirstQualifierInScope=*/nullptr,
3552                                               NameInfo,
3553                                               /*TemplateArgs=*/nullptr,
3554                                               /*S=*/nullptr);
3555   }
3556 
3557   /// Build a new Objective-C property reference expression.
3558   ///
3559   /// By default, performs semantic analysis to build the new expression.
3560   /// Subclasses may override this routine to provide different behavior.
3561   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3562                                         ObjCMethodDecl *Getter,
3563                                         ObjCMethodDecl *Setter,
3564                                         SourceLocation PropertyLoc) {
3565     // Since these expressions can only be value-dependent, we do not
3566     // need to perform semantic analysis again.
3567     return Owned(
3568       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3569                                                   VK_LValue, OK_ObjCProperty,
3570                                                   PropertyLoc, Base));
3571   }
3572 
3573   /// Build a new Objective-C "isa" 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 RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3578                                 SourceLocation OpLoc, bool IsArrow) {
3579     CXXScopeSpec SS;
3580     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3581     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3582                                               OpLoc, IsArrow,
3583                                               SS, SourceLocation(),
3584                                               /*FirstQualifierInScope=*/nullptr,
3585                                               NameInfo,
3586                                               /*TemplateArgs=*/nullptr,
3587                                               /*S=*/nullptr);
3588   }
3589 
3590   /// Build a new shuffle vector expression.
3591   ///
3592   /// By default, performs semantic analysis to build the new expression.
3593   /// Subclasses may override this routine to provide different behavior.
3594   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3595                                       MultiExprArg SubExprs,
3596                                       SourceLocation RParenLoc) {
3597     // Find the declaration for __builtin_shufflevector
3598     const IdentifierInfo &Name
3599       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3600     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3601     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3602     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3603 
3604     // Build a reference to the __builtin_shufflevector builtin
3605     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3606     Expr *Callee = new (SemaRef.Context)
3607         DeclRefExpr(SemaRef.Context, Builtin, false,
3608                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3609     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3610     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3611                                        CK_BuiltinFnToFnPtr).get();
3612 
3613     // Build the CallExpr
3614     ExprResult TheCall = CallExpr::Create(
3615         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3616         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3617         FPOptionsOverride());
3618 
3619     // Type-check the __builtin_shufflevector expression.
3620     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3621   }
3622 
3623   /// Build a new convert vector expression.
3624   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3625                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3626                                       SourceLocation RParenLoc) {
3627     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3628                                          BuiltinLoc, RParenLoc);
3629   }
3630 
3631   /// Build a new template argument pack expansion.
3632   ///
3633   /// By default, performs semantic analysis to build a new pack expansion
3634   /// for a template argument. Subclasses may override this routine to provide
3635   /// different behavior.
3636   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3637                                            SourceLocation EllipsisLoc,
3638                                            Optional<unsigned> NumExpansions) {
3639     switch (Pattern.getArgument().getKind()) {
3640     case TemplateArgument::Expression: {
3641       ExprResult Result
3642         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3643                                        EllipsisLoc, NumExpansions);
3644       if (Result.isInvalid())
3645         return TemplateArgumentLoc();
3646 
3647       return TemplateArgumentLoc(Result.get(), Result.get());
3648     }
3649 
3650     case TemplateArgument::Template:
3651       return TemplateArgumentLoc(
3652           SemaRef.Context,
3653           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3654                            NumExpansions),
3655           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3656           EllipsisLoc);
3657 
3658     case TemplateArgument::Null:
3659     case TemplateArgument::Integral:
3660     case TemplateArgument::Declaration:
3661     case TemplateArgument::Pack:
3662     case TemplateArgument::TemplateExpansion:
3663     case TemplateArgument::NullPtr:
3664       llvm_unreachable("Pack expansion pattern has no parameter packs");
3665 
3666     case TemplateArgument::Type:
3667       if (TypeSourceInfo *Expansion
3668             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3669                                            EllipsisLoc,
3670                                            NumExpansions))
3671         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3672                                    Expansion);
3673       break;
3674     }
3675 
3676     return TemplateArgumentLoc();
3677   }
3678 
3679   /// Build a new expression pack expansion.
3680   ///
3681   /// By default, performs semantic analysis to build a new pack expansion
3682   /// for an expression. Subclasses may override this routine to provide
3683   /// different behavior.
3684   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3685                                   Optional<unsigned> NumExpansions) {
3686     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3687   }
3688 
3689   /// Build a new C++1z fold-expression.
3690   ///
3691   /// By default, performs semantic analysis in order to build a new fold
3692   /// expression.
3693   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3694                                 SourceLocation LParenLoc, Expr *LHS,
3695                                 BinaryOperatorKind Operator,
3696                                 SourceLocation EllipsisLoc, Expr *RHS,
3697                                 SourceLocation RParenLoc,
3698                                 Optional<unsigned> NumExpansions) {
3699     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3700                                       EllipsisLoc, RHS, RParenLoc,
3701                                       NumExpansions);
3702   }
3703 
3704   /// Build an empty C++1z fold-expression with the given operator.
3705   ///
3706   /// By default, produces the fallback value for the fold-expression, or
3707   /// produce an error if there is no fallback value.
3708   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3709                                      BinaryOperatorKind Operator) {
3710     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3711   }
3712 
3713   /// Build a new atomic operation expression.
3714   ///
3715   /// By default, performs semantic analysis to build the new expression.
3716   /// Subclasses may override this routine to provide different behavior.
3717   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3718                                AtomicExpr::AtomicOp Op,
3719                                SourceLocation RParenLoc) {
3720     // Use this for all of the locations, since we don't know the difference
3721     // between the call and the expr at this point.
3722     SourceRange Range{BuiltinLoc, RParenLoc};
3723     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3724                                      Sema::AtomicArgumentOrder::AST);
3725   }
3726 
3727   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3728                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3729     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3730   }
3731 
3732 private:
3733   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3734                                      QualType ObjectType,
3735                                      NamedDecl *FirstQualifierInScope,
3736                                      CXXScopeSpec &SS);
3737 
3738   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3739                                              QualType ObjectType,
3740                                              NamedDecl *FirstQualifierInScope,
3741                                              CXXScopeSpec &SS);
3742 
3743   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3744                                             NamedDecl *FirstQualifierInScope,
3745                                             CXXScopeSpec &SS);
3746 
3747   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3748                                       DependentNameTypeLoc TL,
3749                                       bool DeducibleTSTContext);
3750 };
3751 
3752 template <typename Derived>
3753 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3754   if (!S)
3755     return S;
3756 
3757   switch (S->getStmtClass()) {
3758   case Stmt::NoStmtClass: break;
3759 
3760   // Transform individual statement nodes
3761   // Pass SDK into statements that can produce a value
3762 #define STMT(Node, Parent)                                              \
3763   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3764 #define VALUESTMT(Node, Parent)                                         \
3765   case Stmt::Node##Class:                                               \
3766     return getDerived().Transform##Node(cast<Node>(S), SDK);
3767 #define ABSTRACT_STMT(Node)
3768 #define EXPR(Node, Parent)
3769 #include "clang/AST/StmtNodes.inc"
3770 
3771   // Transform expressions by calling TransformExpr.
3772 #define STMT(Node, Parent)
3773 #define ABSTRACT_STMT(Stmt)
3774 #define EXPR(Node, Parent) case Stmt::Node##Class:
3775 #include "clang/AST/StmtNodes.inc"
3776     {
3777       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3778 
3779       if (SDK == SDK_StmtExprResult)
3780         E = getSema().ActOnStmtExprResult(E);
3781       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3782     }
3783   }
3784 
3785   return S;
3786 }
3787 
3788 template<typename Derived>
3789 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3790   if (!S)
3791     return S;
3792 
3793   switch (S->getClauseKind()) {
3794   default: break;
3795   // Transform individual clause nodes
3796 #define GEN_CLANG_CLAUSE_CLASS
3797 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3798   case Enum:                                                                   \
3799     return getDerived().Transform##Class(cast<Class>(S));
3800 #include "llvm/Frontend/OpenMP/OMP.inc"
3801   }
3802 
3803   return S;
3804 }
3805 
3806 
3807 template<typename Derived>
3808 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3809   if (!E)
3810     return E;
3811 
3812   switch (E->getStmtClass()) {
3813     case Stmt::NoStmtClass: break;
3814 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3815 #define ABSTRACT_STMT(Stmt)
3816 #define EXPR(Node, Parent)                                              \
3817     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3818 #include "clang/AST/StmtNodes.inc"
3819   }
3820 
3821   return E;
3822 }
3823 
3824 template<typename Derived>
3825 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3826                                                         bool NotCopyInit) {
3827   // Initializers are instantiated like expressions, except that various outer
3828   // layers are stripped.
3829   if (!Init)
3830     return Init;
3831 
3832   if (auto *FE = dyn_cast<FullExpr>(Init))
3833     Init = FE->getSubExpr();
3834 
3835   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3836     Init = AIL->getCommonExpr();
3837 
3838   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3839     Init = MTE->getSubExpr();
3840 
3841   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3842     Init = Binder->getSubExpr();
3843 
3844   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3845     Init = ICE->getSubExprAsWritten();
3846 
3847   if (CXXStdInitializerListExpr *ILE =
3848           dyn_cast<CXXStdInitializerListExpr>(Init))
3849     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3850 
3851   // If this is copy-initialization, we only need to reconstruct
3852   // InitListExprs. Other forms of copy-initialization will be a no-op if
3853   // the initializer is already the right type.
3854   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3855   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3856     return getDerived().TransformExpr(Init);
3857 
3858   // Revert value-initialization back to empty parens.
3859   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3860     SourceRange Parens = VIE->getSourceRange();
3861     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3862                                              Parens.getEnd());
3863   }
3864 
3865   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3866   if (isa<ImplicitValueInitExpr>(Init))
3867     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3868                                              SourceLocation());
3869 
3870   // Revert initialization by constructor back to a parenthesized or braced list
3871   // of expressions. Any other form of initializer can just be reused directly.
3872   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3873     return getDerived().TransformExpr(Init);
3874 
3875   // If the initialization implicitly converted an initializer list to a
3876   // std::initializer_list object, unwrap the std::initializer_list too.
3877   if (Construct && Construct->isStdInitListInitialization())
3878     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3879 
3880   // Enter a list-init context if this was list initialization.
3881   EnterExpressionEvaluationContext Context(
3882       getSema(), EnterExpressionEvaluationContext::InitList,
3883       Construct->isListInitialization());
3884 
3885   SmallVector<Expr*, 8> NewArgs;
3886   bool ArgChanged = false;
3887   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3888                                   /*IsCall*/true, NewArgs, &ArgChanged))
3889     return ExprError();
3890 
3891   // If this was list initialization, revert to syntactic list form.
3892   if (Construct->isListInitialization())
3893     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3894                                         Construct->getEndLoc());
3895 
3896   // Build a ParenListExpr to represent anything else.
3897   SourceRange Parens = Construct->getParenOrBraceRange();
3898   if (Parens.isInvalid()) {
3899     // This was a variable declaration's initialization for which no initializer
3900     // was specified.
3901     assert(NewArgs.empty() &&
3902            "no parens or braces but have direct init with arguments?");
3903     return ExprEmpty();
3904   }
3905   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3906                                            Parens.getEnd());
3907 }
3908 
3909 template<typename Derived>
3910 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3911                                             unsigned NumInputs,
3912                                             bool IsCall,
3913                                       SmallVectorImpl<Expr *> &Outputs,
3914                                             bool *ArgChanged) {
3915   for (unsigned I = 0; I != NumInputs; ++I) {
3916     // If requested, drop call arguments that need to be dropped.
3917     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3918       if (ArgChanged)
3919         *ArgChanged = true;
3920 
3921       break;
3922     }
3923 
3924     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3925       Expr *Pattern = Expansion->getPattern();
3926 
3927       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3928       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3929       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3930 
3931       // Determine whether the set of unexpanded parameter packs can and should
3932       // be expanded.
3933       bool Expand = true;
3934       bool RetainExpansion = false;
3935       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3936       Optional<unsigned> NumExpansions = OrigNumExpansions;
3937       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3938                                                Pattern->getSourceRange(),
3939                                                Unexpanded,
3940                                                Expand, RetainExpansion,
3941                                                NumExpansions))
3942         return true;
3943 
3944       if (!Expand) {
3945         // The transform has determined that we should perform a simple
3946         // transformation on the pack expansion, producing another pack
3947         // expansion.
3948         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3949         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3950         if (OutPattern.isInvalid())
3951           return true;
3952 
3953         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3954                                                 Expansion->getEllipsisLoc(),
3955                                                            NumExpansions);
3956         if (Out.isInvalid())
3957           return true;
3958 
3959         if (ArgChanged)
3960           *ArgChanged = true;
3961         Outputs.push_back(Out.get());
3962         continue;
3963       }
3964 
3965       // Record right away that the argument was changed.  This needs
3966       // to happen even if the array expands to nothing.
3967       if (ArgChanged) *ArgChanged = true;
3968 
3969       // The transform has determined that we should perform an elementwise
3970       // expansion of the pattern. Do so.
3971       for (unsigned I = 0; I != *NumExpansions; ++I) {
3972         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3973         ExprResult Out = getDerived().TransformExpr(Pattern);
3974         if (Out.isInvalid())
3975           return true;
3976 
3977         if (Out.get()->containsUnexpandedParameterPack()) {
3978           Out = getDerived().RebuildPackExpansion(
3979               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3980           if (Out.isInvalid())
3981             return true;
3982         }
3983 
3984         Outputs.push_back(Out.get());
3985       }
3986 
3987       // If we're supposed to retain a pack expansion, do so by temporarily
3988       // forgetting the partially-substituted parameter pack.
3989       if (RetainExpansion) {
3990         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3991 
3992         ExprResult Out = getDerived().TransformExpr(Pattern);
3993         if (Out.isInvalid())
3994           return true;
3995 
3996         Out = getDerived().RebuildPackExpansion(
3997             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3998         if (Out.isInvalid())
3999           return true;
4000 
4001         Outputs.push_back(Out.get());
4002       }
4003 
4004       continue;
4005     }
4006 
4007     ExprResult Result =
4008       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
4009              : getDerived().TransformExpr(Inputs[I]);
4010     if (Result.isInvalid())
4011       return true;
4012 
4013     if (Result.get() != Inputs[I] && ArgChanged)
4014       *ArgChanged = true;
4015 
4016     Outputs.push_back(Result.get());
4017   }
4018 
4019   return false;
4020 }
4021 
4022 template <typename Derived>
4023 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
4024     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
4025   if (Var) {
4026     VarDecl *ConditionVar = cast_or_null<VarDecl>(
4027         getDerived().TransformDefinition(Var->getLocation(), Var));
4028 
4029     if (!ConditionVar)
4030       return Sema::ConditionError();
4031 
4032     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
4033   }
4034 
4035   if (Expr) {
4036     ExprResult CondExpr = getDerived().TransformExpr(Expr);
4037 
4038     if (CondExpr.isInvalid())
4039       return Sema::ConditionError();
4040 
4041     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
4042   }
4043 
4044   return Sema::ConditionResult();
4045 }
4046 
4047 template <typename Derived>
4048 NestedNameSpecifierLoc TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4049     NestedNameSpecifierLoc NNS, QualType ObjectType,
4050     NamedDecl *FirstQualifierInScope) {
4051   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4052   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4053        Qualifier = Qualifier.getPrefix())
4054     Qualifiers.push_back(Qualifier);
4055 
4056   CXXScopeSpec SS;
4057   while (!Qualifiers.empty()) {
4058     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4059     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4060 
4061     switch (QNNS->getKind()) {
4062     case NestedNameSpecifier::Identifier: {
4063       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4064                                       Q.getLocalBeginLoc(), Q.getLocalEndLoc(),
4065                                       ObjectType);
4066       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4067                                               SS, FirstQualifierInScope, false))
4068         return NestedNameSpecifierLoc();
4069       break;
4070     }
4071 
4072     case NestedNameSpecifier::Namespace: {
4073       NamespaceDecl *NS =
4074           cast_or_null<NamespaceDecl>(getDerived().TransformDecl(
4075               Q.getLocalBeginLoc(), QNNS->getAsNamespace()));
4076       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4077       break;
4078     }
4079 
4080     case NestedNameSpecifier::NamespaceAlias: {
4081       NamespaceAliasDecl *Alias =
4082           cast_or_null<NamespaceAliasDecl>(getDerived().TransformDecl(
4083               Q.getLocalBeginLoc(), QNNS->getAsNamespaceAlias()));
4084       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4085                 Q.getLocalEndLoc());
4086       break;
4087     }
4088 
4089     case NestedNameSpecifier::Global:
4090       // There is no meaningful transformation that one could perform on the
4091       // global scope.
4092       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4093       break;
4094 
4095     case NestedNameSpecifier::Super: {
4096       CXXRecordDecl *RD =
4097           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4098               SourceLocation(), QNNS->getAsRecordDecl()));
4099       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4100       break;
4101     }
4102 
4103     case NestedNameSpecifier::TypeSpecWithTemplate:
4104     case NestedNameSpecifier::TypeSpec: {
4105       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4106                                               FirstQualifierInScope, SS);
4107 
4108       if (!TL)
4109         return NestedNameSpecifierLoc();
4110 
4111       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4112           (SemaRef.getLangOpts().CPlusPlus11 &&
4113            TL.getType()->isEnumeralType())) {
4114         assert(!TL.getType().hasLocalQualifiers() &&
4115                "Can't get cv-qualifiers here");
4116         if (TL.getType()->isEnumeralType())
4117           SemaRef.Diag(TL.getBeginLoc(),
4118                        diag::warn_cxx98_compat_enum_nested_name_spec);
4119         SS.Extend(SemaRef.Context, /*FIXME:*/ SourceLocation(), TL,
4120                   Q.getLocalEndLoc());
4121         break;
4122       }
4123       // If the nested-name-specifier is an invalid type def, don't emit an
4124       // error because a previous error should have already been emitted.
4125       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4126       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4127         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4128             << TL.getType() << SS.getRange();
4129       }
4130       return NestedNameSpecifierLoc();
4131     }
4132     }
4133 
4134     // The qualifier-in-scope and object type only apply to the leftmost entity.
4135     FirstQualifierInScope = nullptr;
4136     ObjectType = QualType();
4137   }
4138 
4139   // Don't rebuild the nested-name-specifier if we don't have to.
4140   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4141       !getDerived().AlwaysRebuild())
4142     return NNS;
4143 
4144   // If we can re-use the source-location data from the original
4145   // nested-name-specifier, do so.
4146   if (SS.location_size() == NNS.getDataLength() &&
4147       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4148     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4149 
4150   // Allocate new nested-name-specifier location information.
4151   return SS.getWithLocInContext(SemaRef.Context);
4152 }
4153 
4154 template<typename Derived>
4155 DeclarationNameInfo
4156 TreeTransform<Derived>
4157 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4158   DeclarationName Name = NameInfo.getName();
4159   if (!Name)
4160     return DeclarationNameInfo();
4161 
4162   switch (Name.getNameKind()) {
4163   case DeclarationName::Identifier:
4164   case DeclarationName::ObjCZeroArgSelector:
4165   case DeclarationName::ObjCOneArgSelector:
4166   case DeclarationName::ObjCMultiArgSelector:
4167   case DeclarationName::CXXOperatorName:
4168   case DeclarationName::CXXLiteralOperatorName:
4169   case DeclarationName::CXXUsingDirective:
4170     return NameInfo;
4171 
4172   case DeclarationName::CXXDeductionGuideName: {
4173     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4174     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4175         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4176     if (!NewTemplate)
4177       return DeclarationNameInfo();
4178 
4179     DeclarationNameInfo NewNameInfo(NameInfo);
4180     NewNameInfo.setName(
4181         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4182     return NewNameInfo;
4183   }
4184 
4185   case DeclarationName::CXXConstructorName:
4186   case DeclarationName::CXXDestructorName:
4187   case DeclarationName::CXXConversionFunctionName: {
4188     TypeSourceInfo *NewTInfo;
4189     CanQualType NewCanTy;
4190     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4191       NewTInfo = getDerived().TransformType(OldTInfo);
4192       if (!NewTInfo)
4193         return DeclarationNameInfo();
4194       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4195     }
4196     else {
4197       NewTInfo = nullptr;
4198       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4199       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4200       if (NewT.isNull())
4201         return DeclarationNameInfo();
4202       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4203     }
4204 
4205     DeclarationName NewName
4206       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4207                                                            NewCanTy);
4208     DeclarationNameInfo NewNameInfo(NameInfo);
4209     NewNameInfo.setName(NewName);
4210     NewNameInfo.setNamedTypeInfo(NewTInfo);
4211     return NewNameInfo;
4212   }
4213   }
4214 
4215   llvm_unreachable("Unknown name kind.");
4216 }
4217 
4218 template<typename Derived>
4219 TemplateName
4220 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4221                                               TemplateName Name,
4222                                               SourceLocation NameLoc,
4223                                               QualType ObjectType,
4224                                               NamedDecl *FirstQualifierInScope,
4225                                               bool AllowInjectedClassName) {
4226   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4227     TemplateDecl *Template = QTN->getTemplateDecl();
4228     assert(Template && "qualified template name must refer to a template");
4229 
4230     TemplateDecl *TransTemplate
4231       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4232                                                               Template));
4233     if (!TransTemplate)
4234       return TemplateName();
4235 
4236     if (!getDerived().AlwaysRebuild() &&
4237         SS.getScopeRep() == QTN->getQualifier() &&
4238         TransTemplate == Template)
4239       return Name;
4240 
4241     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4242                                             TransTemplate);
4243   }
4244 
4245   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4246     if (SS.getScopeRep()) {
4247       // These apply to the scope specifier, not the template.
4248       ObjectType = QualType();
4249       FirstQualifierInScope = nullptr;
4250     }
4251 
4252     if (!getDerived().AlwaysRebuild() &&
4253         SS.getScopeRep() == DTN->getQualifier() &&
4254         ObjectType.isNull())
4255       return Name;
4256 
4257     // FIXME: Preserve the location of the "template" keyword.
4258     SourceLocation TemplateKWLoc = NameLoc;
4259 
4260     if (DTN->isIdentifier()) {
4261       return getDerived().RebuildTemplateName(SS,
4262                                               TemplateKWLoc,
4263                                               *DTN->getIdentifier(),
4264                                               NameLoc,
4265                                               ObjectType,
4266                                               FirstQualifierInScope,
4267                                               AllowInjectedClassName);
4268     }
4269 
4270     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4271                                             DTN->getOperator(), NameLoc,
4272                                             ObjectType, AllowInjectedClassName);
4273   }
4274 
4275   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4276     TemplateDecl *TransTemplate
4277       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4278                                                               Template));
4279     if (!TransTemplate)
4280       return TemplateName();
4281 
4282     if (!getDerived().AlwaysRebuild() &&
4283         TransTemplate == Template)
4284       return Name;
4285 
4286     return TemplateName(TransTemplate);
4287   }
4288 
4289   if (SubstTemplateTemplateParmPackStorage *SubstPack
4290       = Name.getAsSubstTemplateTemplateParmPack()) {
4291     TemplateTemplateParmDecl *TransParam
4292     = cast_or_null<TemplateTemplateParmDecl>(
4293             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4294     if (!TransParam)
4295       return TemplateName();
4296 
4297     if (!getDerived().AlwaysRebuild() &&
4298         TransParam == SubstPack->getParameterPack())
4299       return Name;
4300 
4301     return getDerived().RebuildTemplateName(TransParam,
4302                                             SubstPack->getArgumentPack());
4303   }
4304 
4305   // These should be getting filtered out before they reach the AST.
4306   llvm_unreachable("overloaded function decl survived to here");
4307 }
4308 
4309 template<typename Derived>
4310 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4311                                          const TemplateArgument &Arg,
4312                                          TemplateArgumentLoc &Output) {
4313   Output = getSema().getTrivialTemplateArgumentLoc(
4314       Arg, QualType(), getDerived().getBaseLocation());
4315 }
4316 
4317 template<typename Derived>
4318 bool TreeTransform<Derived>::TransformTemplateArgument(
4319                                          const TemplateArgumentLoc &Input,
4320                                          TemplateArgumentLoc &Output, bool Uneval) {
4321   const TemplateArgument &Arg = Input.getArgument();
4322   switch (Arg.getKind()) {
4323   case TemplateArgument::Null:
4324   case TemplateArgument::Pack:
4325     llvm_unreachable("Unexpected TemplateArgument");
4326 
4327   case TemplateArgument::Integral:
4328   case TemplateArgument::NullPtr:
4329   case TemplateArgument::Declaration: {
4330     // Transform a resolved template argument straight to a resolved template
4331     // argument. We get here when substituting into an already-substituted
4332     // template type argument during concept satisfaction checking.
4333     QualType T = Arg.getNonTypeTemplateArgumentType();
4334     QualType NewT = getDerived().TransformType(T);
4335     if (NewT.isNull())
4336       return true;
4337 
4338     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4339                        ? Arg.getAsDecl()
4340                        : nullptr;
4341     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4342                               getDerived().getBaseLocation(), D))
4343                         : nullptr;
4344     if (D && !NewD)
4345       return true;
4346 
4347     if (NewT == T && D == NewD)
4348       Output = Input;
4349     else if (Arg.getKind() == TemplateArgument::Integral)
4350       Output = TemplateArgumentLoc(
4351           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4352           TemplateArgumentLocInfo());
4353     else if (Arg.getKind() == TemplateArgument::NullPtr)
4354       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4355                                    TemplateArgumentLocInfo());
4356     else
4357       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4358                                    TemplateArgumentLocInfo());
4359 
4360     return false;
4361   }
4362 
4363   case TemplateArgument::Type: {
4364     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4365     if (!DI)
4366       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4367 
4368     DI = getDerived().TransformType(DI);
4369     if (!DI) return true;
4370 
4371     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4372     return false;
4373   }
4374 
4375   case TemplateArgument::Template: {
4376     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4377     if (QualifierLoc) {
4378       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4379       if (!QualifierLoc)
4380         return true;
4381     }
4382 
4383     CXXScopeSpec SS;
4384     SS.Adopt(QualifierLoc);
4385     TemplateName Template
4386       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4387                                            Input.getTemplateNameLoc());
4388     if (Template.isNull())
4389       return true;
4390 
4391     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4392                                  QualifierLoc, Input.getTemplateNameLoc());
4393     return false;
4394   }
4395 
4396   case TemplateArgument::TemplateExpansion:
4397     llvm_unreachable("Caller should expand pack expansions");
4398 
4399   case TemplateArgument::Expression: {
4400     // Template argument expressions are constant expressions.
4401     EnterExpressionEvaluationContext Unevaluated(
4402         getSema(),
4403         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4404                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4405         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4406         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4407 
4408     Expr *InputExpr = Input.getSourceExpression();
4409     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4410 
4411     ExprResult E = getDerived().TransformExpr(InputExpr);
4412     E = SemaRef.ActOnConstantExpression(E);
4413     if (E.isInvalid()) return true;
4414     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4415     return false;
4416   }
4417   }
4418 
4419   // Work around bogus GCC warning
4420   return true;
4421 }
4422 
4423 /// Iterator adaptor that invents template argument location information
4424 /// for each of the template arguments in its underlying iterator.
4425 template<typename Derived, typename InputIterator>
4426 class TemplateArgumentLocInventIterator {
4427   TreeTransform<Derived> &Self;
4428   InputIterator Iter;
4429 
4430 public:
4431   typedef TemplateArgumentLoc value_type;
4432   typedef TemplateArgumentLoc reference;
4433   typedef typename std::iterator_traits<InputIterator>::difference_type
4434     difference_type;
4435   typedef std::input_iterator_tag iterator_category;
4436 
4437   class pointer {
4438     TemplateArgumentLoc Arg;
4439 
4440   public:
4441     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4442 
4443     const TemplateArgumentLoc *operator->() const { return &Arg; }
4444   };
4445 
4446   TemplateArgumentLocInventIterator() { }
4447 
4448   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4449                                              InputIterator Iter)
4450     : Self(Self), Iter(Iter) { }
4451 
4452   TemplateArgumentLocInventIterator &operator++() {
4453     ++Iter;
4454     return *this;
4455   }
4456 
4457   TemplateArgumentLocInventIterator operator++(int) {
4458     TemplateArgumentLocInventIterator Old(*this);
4459     ++(*this);
4460     return Old;
4461   }
4462 
4463   reference operator*() const {
4464     TemplateArgumentLoc Result;
4465     Self.InventTemplateArgumentLoc(*Iter, Result);
4466     return Result;
4467   }
4468 
4469   pointer operator->() const { return pointer(**this); }
4470 
4471   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4472                          const TemplateArgumentLocInventIterator &Y) {
4473     return X.Iter == Y.Iter;
4474   }
4475 
4476   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4477                          const TemplateArgumentLocInventIterator &Y) {
4478     return X.Iter != Y.Iter;
4479   }
4480 };
4481 
4482 template<typename Derived>
4483 template<typename InputIterator>
4484 bool TreeTransform<Derived>::TransformTemplateArguments(
4485     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4486     bool Uneval) {
4487   for (; First != Last; ++First) {
4488     TemplateArgumentLoc Out;
4489     TemplateArgumentLoc In = *First;
4490 
4491     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4492       // Unpack argument packs, which we translate them into separate
4493       // arguments.
4494       // FIXME: We could do much better if we could guarantee that the
4495       // TemplateArgumentLocInfo for the pack expansion would be usable for
4496       // all of the template arguments in the argument pack.
4497       typedef TemplateArgumentLocInventIterator<Derived,
4498                                                 TemplateArgument::pack_iterator>
4499         PackLocIterator;
4500       if (TransformTemplateArguments(PackLocIterator(*this,
4501                                                  In.getArgument().pack_begin()),
4502                                      PackLocIterator(*this,
4503                                                    In.getArgument().pack_end()),
4504                                      Outputs, Uneval))
4505         return true;
4506 
4507       continue;
4508     }
4509 
4510     if (In.getArgument().isPackExpansion()) {
4511       // We have a pack expansion, for which we will be substituting into
4512       // the pattern.
4513       SourceLocation Ellipsis;
4514       Optional<unsigned> OrigNumExpansions;
4515       TemplateArgumentLoc Pattern
4516         = getSema().getTemplateArgumentPackExpansionPattern(
4517               In, Ellipsis, OrigNumExpansions);
4518 
4519       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4520       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4521       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4522 
4523       // Determine whether the set of unexpanded parameter packs can and should
4524       // be expanded.
4525       bool Expand = true;
4526       bool RetainExpansion = false;
4527       Optional<unsigned> NumExpansions = OrigNumExpansions;
4528       if (getDerived().TryExpandParameterPacks(Ellipsis,
4529                                                Pattern.getSourceRange(),
4530                                                Unexpanded,
4531                                                Expand,
4532                                                RetainExpansion,
4533                                                NumExpansions))
4534         return true;
4535 
4536       if (!Expand) {
4537         // The transform has determined that we should perform a simple
4538         // transformation on the pack expansion, producing another pack
4539         // expansion.
4540         TemplateArgumentLoc OutPattern;
4541         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4542         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4543           return true;
4544 
4545         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4546                                                 NumExpansions);
4547         if (Out.getArgument().isNull())
4548           return true;
4549 
4550         Outputs.addArgument(Out);
4551         continue;
4552       }
4553 
4554       // The transform has determined that we should perform an elementwise
4555       // expansion of the pattern. Do so.
4556       for (unsigned I = 0; I != *NumExpansions; ++I) {
4557         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4558 
4559         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4560           return true;
4561 
4562         if (Out.getArgument().containsUnexpandedParameterPack()) {
4563           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4564                                                   OrigNumExpansions);
4565           if (Out.getArgument().isNull())
4566             return true;
4567         }
4568 
4569         Outputs.addArgument(Out);
4570       }
4571 
4572       // If we're supposed to retain a pack expansion, do so by temporarily
4573       // forgetting the partially-substituted parameter pack.
4574       if (RetainExpansion) {
4575         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4576 
4577         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4578           return true;
4579 
4580         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4581                                                 OrigNumExpansions);
4582         if (Out.getArgument().isNull())
4583           return true;
4584 
4585         Outputs.addArgument(Out);
4586       }
4587 
4588       continue;
4589     }
4590 
4591     // The simple case:
4592     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4593       return true;
4594 
4595     Outputs.addArgument(Out);
4596   }
4597 
4598   return false;
4599 
4600 }
4601 
4602 //===----------------------------------------------------------------------===//
4603 // Type transformation
4604 //===----------------------------------------------------------------------===//
4605 
4606 template<typename Derived>
4607 QualType TreeTransform<Derived>::TransformType(QualType T) {
4608   if (getDerived().AlreadyTransformed(T))
4609     return T;
4610 
4611   // Temporary workaround.  All of these transformations should
4612   // eventually turn into transformations on TypeLocs.
4613   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4614                                                 getDerived().getBaseLocation());
4615 
4616   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4617 
4618   if (!NewDI)
4619     return QualType();
4620 
4621   return NewDI->getType();
4622 }
4623 
4624 template<typename Derived>
4625 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4626   // Refine the base location to the type's location.
4627   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4628                        getDerived().getBaseEntity());
4629   if (getDerived().AlreadyTransformed(DI->getType()))
4630     return DI;
4631 
4632   TypeLocBuilder TLB;
4633 
4634   TypeLoc TL = DI->getTypeLoc();
4635   TLB.reserve(TL.getFullDataSize());
4636 
4637   QualType Result = getDerived().TransformType(TLB, TL);
4638   if (Result.isNull())
4639     return nullptr;
4640 
4641   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4642 }
4643 
4644 template<typename Derived>
4645 QualType
4646 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4647   switch (T.getTypeLocClass()) {
4648 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4649 #define TYPELOC(CLASS, PARENT)                                                 \
4650   case TypeLoc::CLASS:                                                         \
4651     return getDerived().Transform##CLASS##Type(TLB,                            \
4652                                                T.castAs<CLASS##TypeLoc>());
4653 #include "clang/AST/TypeLocNodes.def"
4654   }
4655 
4656   llvm_unreachable("unhandled type loc!");
4657 }
4658 
4659 template<typename Derived>
4660 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4661   if (!isa<DependentNameType>(T))
4662     return TransformType(T);
4663 
4664   if (getDerived().AlreadyTransformed(T))
4665     return T;
4666   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4667                                                 getDerived().getBaseLocation());
4668   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4669   return NewDI ? NewDI->getType() : QualType();
4670 }
4671 
4672 template<typename Derived>
4673 TypeSourceInfo *
4674 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4675   if (!isa<DependentNameType>(DI->getType()))
4676     return TransformType(DI);
4677 
4678   // Refine the base location to the type's location.
4679   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4680                        getDerived().getBaseEntity());
4681   if (getDerived().AlreadyTransformed(DI->getType()))
4682     return DI;
4683 
4684   TypeLocBuilder TLB;
4685 
4686   TypeLoc TL = DI->getTypeLoc();
4687   TLB.reserve(TL.getFullDataSize());
4688 
4689   auto QTL = TL.getAs<QualifiedTypeLoc>();
4690   if (QTL)
4691     TL = QTL.getUnqualifiedLoc();
4692 
4693   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4694 
4695   QualType Result = getDerived().TransformDependentNameType(
4696       TLB, DNTL, /*DeducedTSTContext*/true);
4697   if (Result.isNull())
4698     return nullptr;
4699 
4700   if (QTL) {
4701     Result = getDerived().RebuildQualifiedType(Result, QTL);
4702     if (Result.isNull())
4703       return nullptr;
4704     TLB.TypeWasModifiedSafely(Result);
4705   }
4706 
4707   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4708 }
4709 
4710 template<typename Derived>
4711 QualType
4712 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4713                                                QualifiedTypeLoc T) {
4714   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4715   if (Result.isNull())
4716     return QualType();
4717 
4718   Result = getDerived().RebuildQualifiedType(Result, T);
4719 
4720   if (Result.isNull())
4721     return QualType();
4722 
4723   // RebuildQualifiedType might have updated the type, but not in a way
4724   // that invalidates the TypeLoc. (There's no location information for
4725   // qualifiers.)
4726   TLB.TypeWasModifiedSafely(Result);
4727 
4728   return Result;
4729 }
4730 
4731 template <typename Derived>
4732 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4733                                                       QualifiedTypeLoc TL) {
4734 
4735   SourceLocation Loc = TL.getBeginLoc();
4736   Qualifiers Quals = TL.getType().getLocalQualifiers();
4737 
4738   if (((T.getAddressSpace() != LangAS::Default &&
4739         Quals.getAddressSpace() != LangAS::Default)) &&
4740       T.getAddressSpace() != Quals.getAddressSpace()) {
4741     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4742         << TL.getType() << T;
4743     return QualType();
4744   }
4745 
4746   // C++ [dcl.fct]p7:
4747   //   [When] adding cv-qualifications on top of the function type [...] the
4748   //   cv-qualifiers are ignored.
4749   if (T->isFunctionType()) {
4750     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4751                                                      Quals.getAddressSpace());
4752     return T;
4753   }
4754 
4755   // C++ [dcl.ref]p1:
4756   //   when the cv-qualifiers are introduced through the use of a typedef-name
4757   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4758   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4759   // applied to a reference type.
4760   if (T->isReferenceType()) {
4761     // The only qualifier that applies to a reference type is restrict.
4762     if (!Quals.hasRestrict())
4763       return T;
4764     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4765   }
4766 
4767   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4768   // resulting type.
4769   if (Quals.hasObjCLifetime()) {
4770     if (!T->isObjCLifetimeType() && !T->isDependentType())
4771       Quals.removeObjCLifetime();
4772     else if (T.getObjCLifetime()) {
4773       // Objective-C ARC:
4774       //   A lifetime qualifier applied to a substituted template parameter
4775       //   overrides the lifetime qualifier from the template argument.
4776       const AutoType *AutoTy;
4777       if (const SubstTemplateTypeParmType *SubstTypeParam
4778                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4779         QualType Replacement = SubstTypeParam->getReplacementType();
4780         Qualifiers Qs = Replacement.getQualifiers();
4781         Qs.removeObjCLifetime();
4782         Replacement = SemaRef.Context.getQualifiedType(
4783             Replacement.getUnqualifiedType(), Qs);
4784         T = SemaRef.Context.getSubstTemplateTypeParmType(
4785             SubstTypeParam->getReplacedParameter(), Replacement);
4786       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4787         // 'auto' types behave the same way as template parameters.
4788         QualType Deduced = AutoTy->getDeducedType();
4789         Qualifiers Qs = Deduced.getQualifiers();
4790         Qs.removeObjCLifetime();
4791         Deduced =
4792             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4793         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4794                                         AutoTy->isDependentType(),
4795                                         /*isPack=*/false,
4796                                         AutoTy->getTypeConstraintConcept(),
4797                                         AutoTy->getTypeConstraintArguments());
4798       } else {
4799         // Otherwise, complain about the addition of a qualifier to an
4800         // already-qualified type.
4801         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4802         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4803         Quals.removeObjCLifetime();
4804       }
4805     }
4806   }
4807 
4808   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4809 }
4810 
4811 template<typename Derived>
4812 TypeLoc
4813 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4814                                                    QualType ObjectType,
4815                                                    NamedDecl *UnqualLookup,
4816                                                    CXXScopeSpec &SS) {
4817   if (getDerived().AlreadyTransformed(TL.getType()))
4818     return TL;
4819 
4820   TypeSourceInfo *TSI =
4821       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4822   if (TSI)
4823     return TSI->getTypeLoc();
4824   return TypeLoc();
4825 }
4826 
4827 template<typename Derived>
4828 TypeSourceInfo *
4829 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4830                                                    QualType ObjectType,
4831                                                    NamedDecl *UnqualLookup,
4832                                                    CXXScopeSpec &SS) {
4833   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4834     return TSInfo;
4835 
4836   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4837                                    UnqualLookup, SS);
4838 }
4839 
4840 template <typename Derived>
4841 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4842     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4843     CXXScopeSpec &SS) {
4844   QualType T = TL.getType();
4845   assert(!getDerived().AlreadyTransformed(T));
4846 
4847   TypeLocBuilder TLB;
4848   QualType Result;
4849 
4850   if (isa<TemplateSpecializationType>(T)) {
4851     TemplateSpecializationTypeLoc SpecTL =
4852         TL.castAs<TemplateSpecializationTypeLoc>();
4853 
4854     TemplateName Template = getDerived().TransformTemplateName(
4855         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4856         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4857     if (Template.isNull())
4858       return nullptr;
4859 
4860     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4861                                                               Template);
4862   } else if (isa<DependentTemplateSpecializationType>(T)) {
4863     DependentTemplateSpecializationTypeLoc SpecTL =
4864         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4865 
4866     TemplateName Template
4867       = getDerived().RebuildTemplateName(SS,
4868                                          SpecTL.getTemplateKeywordLoc(),
4869                                          *SpecTL.getTypePtr()->getIdentifier(),
4870                                          SpecTL.getTemplateNameLoc(),
4871                                          ObjectType, UnqualLookup,
4872                                          /*AllowInjectedClassName*/true);
4873     if (Template.isNull())
4874       return nullptr;
4875 
4876     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4877                                                                        SpecTL,
4878                                                                        Template,
4879                                                                        SS);
4880   } else {
4881     // Nothing special needs to be done for these.
4882     Result = getDerived().TransformType(TLB, TL);
4883   }
4884 
4885   if (Result.isNull())
4886     return nullptr;
4887 
4888   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4889 }
4890 
4891 template <class TyLoc> static inline
4892 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4893   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4894   NewT.setNameLoc(T.getNameLoc());
4895   return T.getType();
4896 }
4897 
4898 template<typename Derived>
4899 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4900                                                       BuiltinTypeLoc T) {
4901   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4902   NewT.setBuiltinLoc(T.getBuiltinLoc());
4903   if (T.needsExtraLocalData())
4904     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4905   return T.getType();
4906 }
4907 
4908 template<typename Derived>
4909 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4910                                                       ComplexTypeLoc T) {
4911   // FIXME: recurse?
4912   return TransformTypeSpecType(TLB, T);
4913 }
4914 
4915 template <typename Derived>
4916 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4917                                                        AdjustedTypeLoc TL) {
4918   // Adjustments applied during transformation are handled elsewhere.
4919   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4920 }
4921 
4922 template<typename Derived>
4923 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4924                                                       DecayedTypeLoc TL) {
4925   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4926   if (OriginalType.isNull())
4927     return QualType();
4928 
4929   QualType Result = TL.getType();
4930   if (getDerived().AlwaysRebuild() ||
4931       OriginalType != TL.getOriginalLoc().getType())
4932     Result = SemaRef.Context.getDecayedType(OriginalType);
4933   TLB.push<DecayedTypeLoc>(Result);
4934   // Nothing to set for DecayedTypeLoc.
4935   return Result;
4936 }
4937 
4938 template<typename Derived>
4939 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4940                                                       PointerTypeLoc TL) {
4941   QualType PointeeType
4942     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4943   if (PointeeType.isNull())
4944     return QualType();
4945 
4946   QualType Result = TL.getType();
4947   if (PointeeType->getAs<ObjCObjectType>()) {
4948     // A dependent pointer type 'T *' has is being transformed such
4949     // that an Objective-C class type is being replaced for 'T'. The
4950     // resulting pointer type is an ObjCObjectPointerType, not a
4951     // PointerType.
4952     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4953 
4954     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4955     NewT.setStarLoc(TL.getStarLoc());
4956     return Result;
4957   }
4958 
4959   if (getDerived().AlwaysRebuild() ||
4960       PointeeType != TL.getPointeeLoc().getType()) {
4961     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4962     if (Result.isNull())
4963       return QualType();
4964   }
4965 
4966   // Objective-C ARC can add lifetime qualifiers to the type that we're
4967   // pointing to.
4968   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4969 
4970   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4971   NewT.setSigilLoc(TL.getSigilLoc());
4972   return Result;
4973 }
4974 
4975 template<typename Derived>
4976 QualType
4977 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4978                                                   BlockPointerTypeLoc TL) {
4979   QualType PointeeType
4980     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4981   if (PointeeType.isNull())
4982     return QualType();
4983 
4984   QualType Result = TL.getType();
4985   if (getDerived().AlwaysRebuild() ||
4986       PointeeType != TL.getPointeeLoc().getType()) {
4987     Result = getDerived().RebuildBlockPointerType(PointeeType,
4988                                                   TL.getSigilLoc());
4989     if (Result.isNull())
4990       return QualType();
4991   }
4992 
4993   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4994   NewT.setSigilLoc(TL.getSigilLoc());
4995   return Result;
4996 }
4997 
4998 /// Transforms a reference type.  Note that somewhat paradoxically we
4999 /// don't care whether the type itself is an l-value type or an r-value
5000 /// type;  we only care if the type was *written* as an l-value type
5001 /// or an r-value type.
5002 template<typename Derived>
5003 QualType
5004 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
5005                                                ReferenceTypeLoc TL) {
5006   const ReferenceType *T = TL.getTypePtr();
5007 
5008   // Note that this works with the pointee-as-written.
5009   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5010   if (PointeeType.isNull())
5011     return QualType();
5012 
5013   QualType Result = TL.getType();
5014   if (getDerived().AlwaysRebuild() ||
5015       PointeeType != T->getPointeeTypeAsWritten()) {
5016     Result = getDerived().RebuildReferenceType(PointeeType,
5017                                                T->isSpelledAsLValue(),
5018                                                TL.getSigilLoc());
5019     if (Result.isNull())
5020       return QualType();
5021   }
5022 
5023   // Objective-C ARC can add lifetime qualifiers to the type that we're
5024   // referring to.
5025   TLB.TypeWasModifiedSafely(
5026       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
5027 
5028   // r-value references can be rebuilt as l-value references.
5029   ReferenceTypeLoc NewTL;
5030   if (isa<LValueReferenceType>(Result))
5031     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
5032   else
5033     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
5034   NewTL.setSigilLoc(TL.getSigilLoc());
5035 
5036   return Result;
5037 }
5038 
5039 template<typename Derived>
5040 QualType
5041 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
5042                                                  LValueReferenceTypeLoc TL) {
5043   return TransformReferenceType(TLB, TL);
5044 }
5045 
5046 template<typename Derived>
5047 QualType
5048 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5049                                                  RValueReferenceTypeLoc TL) {
5050   return TransformReferenceType(TLB, TL);
5051 }
5052 
5053 template<typename Derived>
5054 QualType
5055 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5056                                                    MemberPointerTypeLoc TL) {
5057   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5058   if (PointeeType.isNull())
5059     return QualType();
5060 
5061   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5062   TypeSourceInfo *NewClsTInfo = nullptr;
5063   if (OldClsTInfo) {
5064     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5065     if (!NewClsTInfo)
5066       return QualType();
5067   }
5068 
5069   const MemberPointerType *T = TL.getTypePtr();
5070   QualType OldClsType = QualType(T->getClass(), 0);
5071   QualType NewClsType;
5072   if (NewClsTInfo)
5073     NewClsType = NewClsTInfo->getType();
5074   else {
5075     NewClsType = getDerived().TransformType(OldClsType);
5076     if (NewClsType.isNull())
5077       return QualType();
5078   }
5079 
5080   QualType Result = TL.getType();
5081   if (getDerived().AlwaysRebuild() ||
5082       PointeeType != T->getPointeeType() ||
5083       NewClsType != OldClsType) {
5084     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5085                                                    TL.getStarLoc());
5086     if (Result.isNull())
5087       return QualType();
5088   }
5089 
5090   // If we had to adjust the pointee type when building a member pointer, make
5091   // sure to push TypeLoc info for it.
5092   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5093   if (MPT && PointeeType != MPT->getPointeeType()) {
5094     assert(isa<AdjustedType>(MPT->getPointeeType()));
5095     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5096   }
5097 
5098   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5099   NewTL.setSigilLoc(TL.getSigilLoc());
5100   NewTL.setClassTInfo(NewClsTInfo);
5101 
5102   return Result;
5103 }
5104 
5105 template<typename Derived>
5106 QualType
5107 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5108                                                    ConstantArrayTypeLoc TL) {
5109   const ConstantArrayType *T = TL.getTypePtr();
5110   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5111   if (ElementType.isNull())
5112     return QualType();
5113 
5114   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5115   Expr *OldSize = TL.getSizeExpr();
5116   if (!OldSize)
5117     OldSize = const_cast<Expr*>(T->getSizeExpr());
5118   Expr *NewSize = nullptr;
5119   if (OldSize) {
5120     EnterExpressionEvaluationContext Unevaluated(
5121         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5122     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5123     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5124   }
5125 
5126   QualType Result = TL.getType();
5127   if (getDerived().AlwaysRebuild() ||
5128       ElementType != T->getElementType() ||
5129       (T->getSizeExpr() && NewSize != OldSize)) {
5130     Result = getDerived().RebuildConstantArrayType(ElementType,
5131                                                    T->getSizeModifier(),
5132                                                    T->getSize(), NewSize,
5133                                              T->getIndexTypeCVRQualifiers(),
5134                                                    TL.getBracketsRange());
5135     if (Result.isNull())
5136       return QualType();
5137   }
5138 
5139   // We might have either a ConstantArrayType or a VariableArrayType now:
5140   // a ConstantArrayType is allowed to have an element type which is a
5141   // VariableArrayType if the type is dependent.  Fortunately, all array
5142   // types have the same location layout.
5143   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5144   NewTL.setLBracketLoc(TL.getLBracketLoc());
5145   NewTL.setRBracketLoc(TL.getRBracketLoc());
5146   NewTL.setSizeExpr(NewSize);
5147 
5148   return Result;
5149 }
5150 
5151 template<typename Derived>
5152 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5153                                               TypeLocBuilder &TLB,
5154                                               IncompleteArrayTypeLoc TL) {
5155   const IncompleteArrayType *T = TL.getTypePtr();
5156   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5157   if (ElementType.isNull())
5158     return QualType();
5159 
5160   QualType Result = TL.getType();
5161   if (getDerived().AlwaysRebuild() ||
5162       ElementType != T->getElementType()) {
5163     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5164                                                      T->getSizeModifier(),
5165                                            T->getIndexTypeCVRQualifiers(),
5166                                                      TL.getBracketsRange());
5167     if (Result.isNull())
5168       return QualType();
5169   }
5170 
5171   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5172   NewTL.setLBracketLoc(TL.getLBracketLoc());
5173   NewTL.setRBracketLoc(TL.getRBracketLoc());
5174   NewTL.setSizeExpr(nullptr);
5175 
5176   return Result;
5177 }
5178 
5179 template<typename Derived>
5180 QualType
5181 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5182                                                    VariableArrayTypeLoc TL) {
5183   const VariableArrayType *T = TL.getTypePtr();
5184   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5185   if (ElementType.isNull())
5186     return QualType();
5187 
5188   ExprResult SizeResult;
5189   {
5190     EnterExpressionEvaluationContext Context(
5191         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5192     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5193   }
5194   if (SizeResult.isInvalid())
5195     return QualType();
5196   SizeResult =
5197       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5198   if (SizeResult.isInvalid())
5199     return QualType();
5200 
5201   Expr *Size = SizeResult.get();
5202 
5203   QualType Result = TL.getType();
5204   if (getDerived().AlwaysRebuild() ||
5205       ElementType != T->getElementType() ||
5206       Size != T->getSizeExpr()) {
5207     Result = getDerived().RebuildVariableArrayType(ElementType,
5208                                                    T->getSizeModifier(),
5209                                                    Size,
5210                                              T->getIndexTypeCVRQualifiers(),
5211                                                    TL.getBracketsRange());
5212     if (Result.isNull())
5213       return QualType();
5214   }
5215 
5216   // We might have constant size array now, but fortunately it has the same
5217   // location layout.
5218   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5219   NewTL.setLBracketLoc(TL.getLBracketLoc());
5220   NewTL.setRBracketLoc(TL.getRBracketLoc());
5221   NewTL.setSizeExpr(Size);
5222 
5223   return Result;
5224 }
5225 
5226 template<typename Derived>
5227 QualType
5228 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5229                                              DependentSizedArrayTypeLoc TL) {
5230   const DependentSizedArrayType *T = TL.getTypePtr();
5231   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5232   if (ElementType.isNull())
5233     return QualType();
5234 
5235   // Array bounds are constant expressions.
5236   EnterExpressionEvaluationContext Unevaluated(
5237       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5238 
5239   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5240   Expr *origSize = TL.getSizeExpr();
5241   if (!origSize) origSize = T->getSizeExpr();
5242 
5243   ExprResult sizeResult
5244     = getDerived().TransformExpr(origSize);
5245   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5246   if (sizeResult.isInvalid())
5247     return QualType();
5248 
5249   Expr *size = sizeResult.get();
5250 
5251   QualType Result = TL.getType();
5252   if (getDerived().AlwaysRebuild() ||
5253       ElementType != T->getElementType() ||
5254       size != origSize) {
5255     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5256                                                          T->getSizeModifier(),
5257                                                          size,
5258                                                 T->getIndexTypeCVRQualifiers(),
5259                                                         TL.getBracketsRange());
5260     if (Result.isNull())
5261       return QualType();
5262   }
5263 
5264   // We might have any sort of array type now, but fortunately they
5265   // all have the same location layout.
5266   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5267   NewTL.setLBracketLoc(TL.getLBracketLoc());
5268   NewTL.setRBracketLoc(TL.getRBracketLoc());
5269   NewTL.setSizeExpr(size);
5270 
5271   return Result;
5272 }
5273 
5274 template <typename Derived>
5275 QualType TreeTransform<Derived>::TransformDependentVectorType(
5276     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5277   const DependentVectorType *T = TL.getTypePtr();
5278   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5279   if (ElementType.isNull())
5280     return QualType();
5281 
5282   EnterExpressionEvaluationContext Unevaluated(
5283       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5284 
5285   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5286   Size = SemaRef.ActOnConstantExpression(Size);
5287   if (Size.isInvalid())
5288     return QualType();
5289 
5290   QualType Result = TL.getType();
5291   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5292       Size.get() != T->getSizeExpr()) {
5293     Result = getDerived().RebuildDependentVectorType(
5294         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5295     if (Result.isNull())
5296       return QualType();
5297   }
5298 
5299   // Result might be dependent or not.
5300   if (isa<DependentVectorType>(Result)) {
5301     DependentVectorTypeLoc NewTL =
5302         TLB.push<DependentVectorTypeLoc>(Result);
5303     NewTL.setNameLoc(TL.getNameLoc());
5304   } else {
5305     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5306     NewTL.setNameLoc(TL.getNameLoc());
5307   }
5308 
5309   return Result;
5310 }
5311 
5312 template<typename Derived>
5313 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5314                                       TypeLocBuilder &TLB,
5315                                       DependentSizedExtVectorTypeLoc TL) {
5316   const DependentSizedExtVectorType *T = TL.getTypePtr();
5317 
5318   // FIXME: ext vector locs should be nested
5319   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5320   if (ElementType.isNull())
5321     return QualType();
5322 
5323   // Vector sizes are constant expressions.
5324   EnterExpressionEvaluationContext Unevaluated(
5325       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5326 
5327   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5328   Size = SemaRef.ActOnConstantExpression(Size);
5329   if (Size.isInvalid())
5330     return QualType();
5331 
5332   QualType Result = TL.getType();
5333   if (getDerived().AlwaysRebuild() ||
5334       ElementType != T->getElementType() ||
5335       Size.get() != T->getSizeExpr()) {
5336     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5337                                                              Size.get(),
5338                                                          T->getAttributeLoc());
5339     if (Result.isNull())
5340       return QualType();
5341   }
5342 
5343   // Result might be dependent or not.
5344   if (isa<DependentSizedExtVectorType>(Result)) {
5345     DependentSizedExtVectorTypeLoc NewTL
5346       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5347     NewTL.setNameLoc(TL.getNameLoc());
5348   } else {
5349     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5350     NewTL.setNameLoc(TL.getNameLoc());
5351   }
5352 
5353   return Result;
5354 }
5355 
5356 template <typename Derived>
5357 QualType
5358 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5359                                                     ConstantMatrixTypeLoc TL) {
5360   const ConstantMatrixType *T = TL.getTypePtr();
5361   QualType ElementType = getDerived().TransformType(T->getElementType());
5362   if (ElementType.isNull())
5363     return QualType();
5364 
5365   QualType Result = TL.getType();
5366   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5367     Result = getDerived().RebuildConstantMatrixType(
5368         ElementType, T->getNumRows(), T->getNumColumns());
5369     if (Result.isNull())
5370       return QualType();
5371   }
5372 
5373   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5374   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5375   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5376   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5377   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5378 
5379   return Result;
5380 }
5381 
5382 template <typename Derived>
5383 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5384     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5385   const DependentSizedMatrixType *T = TL.getTypePtr();
5386 
5387   QualType ElementType = getDerived().TransformType(T->getElementType());
5388   if (ElementType.isNull()) {
5389     return QualType();
5390   }
5391 
5392   // Matrix dimensions are constant expressions.
5393   EnterExpressionEvaluationContext Unevaluated(
5394       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5395 
5396   Expr *origRows = TL.getAttrRowOperand();
5397   if (!origRows)
5398     origRows = T->getRowExpr();
5399   Expr *origColumns = TL.getAttrColumnOperand();
5400   if (!origColumns)
5401     origColumns = T->getColumnExpr();
5402 
5403   ExprResult rowResult = getDerived().TransformExpr(origRows);
5404   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5405   if (rowResult.isInvalid())
5406     return QualType();
5407 
5408   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5409   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5410   if (columnResult.isInvalid())
5411     return QualType();
5412 
5413   Expr *rows = rowResult.get();
5414   Expr *columns = columnResult.get();
5415 
5416   QualType Result = TL.getType();
5417   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5418       rows != origRows || columns != origColumns) {
5419     Result = getDerived().RebuildDependentSizedMatrixType(
5420         ElementType, rows, columns, T->getAttributeLoc());
5421 
5422     if (Result.isNull())
5423       return QualType();
5424   }
5425 
5426   // We might have any sort of matrix type now, but fortunately they
5427   // all have the same location layout.
5428   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5429   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5430   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5431   NewTL.setAttrRowOperand(rows);
5432   NewTL.setAttrColumnOperand(columns);
5433   return Result;
5434 }
5435 
5436 template <typename Derived>
5437 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5438     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5439   const DependentAddressSpaceType *T = TL.getTypePtr();
5440 
5441   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5442 
5443   if (pointeeType.isNull())
5444     return QualType();
5445 
5446   // Address spaces are constant expressions.
5447   EnterExpressionEvaluationContext Unevaluated(
5448       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5449 
5450   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5451   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5452   if (AddrSpace.isInvalid())
5453     return QualType();
5454 
5455   QualType Result = TL.getType();
5456   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5457       AddrSpace.get() != T->getAddrSpaceExpr()) {
5458     Result = getDerived().RebuildDependentAddressSpaceType(
5459         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5460     if (Result.isNull())
5461       return QualType();
5462   }
5463 
5464   // Result might be dependent or not.
5465   if (isa<DependentAddressSpaceType>(Result)) {
5466     DependentAddressSpaceTypeLoc NewTL =
5467         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5468 
5469     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5470     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5471     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5472 
5473   } else {
5474     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5475         Result, getDerived().getBaseLocation());
5476     TransformType(TLB, DI->getTypeLoc());
5477   }
5478 
5479   return Result;
5480 }
5481 
5482 template <typename Derived>
5483 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5484                                                      VectorTypeLoc TL) {
5485   const VectorType *T = TL.getTypePtr();
5486   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5487   if (ElementType.isNull())
5488     return QualType();
5489 
5490   QualType Result = TL.getType();
5491   if (getDerived().AlwaysRebuild() ||
5492       ElementType != T->getElementType()) {
5493     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5494                                             T->getVectorKind());
5495     if (Result.isNull())
5496       return QualType();
5497   }
5498 
5499   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5500   NewTL.setNameLoc(TL.getNameLoc());
5501 
5502   return Result;
5503 }
5504 
5505 template<typename Derived>
5506 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5507                                                         ExtVectorTypeLoc TL) {
5508   const VectorType *T = TL.getTypePtr();
5509   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5510   if (ElementType.isNull())
5511     return QualType();
5512 
5513   QualType Result = TL.getType();
5514   if (getDerived().AlwaysRebuild() ||
5515       ElementType != T->getElementType()) {
5516     Result = getDerived().RebuildExtVectorType(ElementType,
5517                                                T->getNumElements(),
5518                                                /*FIXME*/ SourceLocation());
5519     if (Result.isNull())
5520       return QualType();
5521   }
5522 
5523   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5524   NewTL.setNameLoc(TL.getNameLoc());
5525 
5526   return Result;
5527 }
5528 
5529 template <typename Derived>
5530 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5531     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5532     bool ExpectParameterPack) {
5533   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5534   TypeSourceInfo *NewDI = nullptr;
5535 
5536   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5537     // If we're substituting into a pack expansion type and we know the
5538     // length we want to expand to, just substitute for the pattern.
5539     TypeLoc OldTL = OldDI->getTypeLoc();
5540     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5541 
5542     TypeLocBuilder TLB;
5543     TypeLoc NewTL = OldDI->getTypeLoc();
5544     TLB.reserve(NewTL.getFullDataSize());
5545 
5546     QualType Result = getDerived().TransformType(TLB,
5547                                                OldExpansionTL.getPatternLoc());
5548     if (Result.isNull())
5549       return nullptr;
5550 
5551     Result = RebuildPackExpansionType(Result,
5552                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5553                                       OldExpansionTL.getEllipsisLoc(),
5554                                       NumExpansions);
5555     if (Result.isNull())
5556       return nullptr;
5557 
5558     PackExpansionTypeLoc NewExpansionTL
5559       = TLB.push<PackExpansionTypeLoc>(Result);
5560     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5561     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5562   } else
5563     NewDI = getDerived().TransformType(OldDI);
5564   if (!NewDI)
5565     return nullptr;
5566 
5567   if (NewDI == OldDI && indexAdjustment == 0)
5568     return OldParm;
5569 
5570   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5571                                              OldParm->getDeclContext(),
5572                                              OldParm->getInnerLocStart(),
5573                                              OldParm->getLocation(),
5574                                              OldParm->getIdentifier(),
5575                                              NewDI->getType(),
5576                                              NewDI,
5577                                              OldParm->getStorageClass(),
5578                                              /* DefArg */ nullptr);
5579   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5580                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5581   transformedLocalDecl(OldParm, {newParm});
5582   return newParm;
5583 }
5584 
5585 template <typename Derived>
5586 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5587     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5588     const QualType *ParamTypes,
5589     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5590     SmallVectorImpl<QualType> &OutParamTypes,
5591     SmallVectorImpl<ParmVarDecl *> *PVars,
5592     Sema::ExtParameterInfoBuilder &PInfos) {
5593   int indexAdjustment = 0;
5594 
5595   unsigned NumParams = Params.size();
5596   for (unsigned i = 0; i != NumParams; ++i) {
5597     if (ParmVarDecl *OldParm = Params[i]) {
5598       assert(OldParm->getFunctionScopeIndex() == i);
5599 
5600       Optional<unsigned> NumExpansions;
5601       ParmVarDecl *NewParm = nullptr;
5602       if (OldParm->isParameterPack()) {
5603         // We have a function parameter pack that may need to be expanded.
5604         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5605 
5606         // Find the parameter packs that could be expanded.
5607         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5608         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5609         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5610         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5611 
5612         // Determine whether we should expand the parameter packs.
5613         bool ShouldExpand = false;
5614         bool RetainExpansion = false;
5615         Optional<unsigned> OrigNumExpansions;
5616         if (Unexpanded.size() > 0) {
5617           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5618           NumExpansions = OrigNumExpansions;
5619           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5620                                                    Pattern.getSourceRange(),
5621                                                    Unexpanded,
5622                                                    ShouldExpand,
5623                                                    RetainExpansion,
5624                                                    NumExpansions)) {
5625             return true;
5626           }
5627         } else {
5628 #ifndef NDEBUG
5629           const AutoType *AT =
5630               Pattern.getType().getTypePtr()->getContainedAutoType();
5631           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5632                  "Could not find parameter packs or undeduced auto type!");
5633 #endif
5634         }
5635 
5636         if (ShouldExpand) {
5637           // Expand the function parameter pack into multiple, separate
5638           // parameters.
5639           getDerived().ExpandingFunctionParameterPack(OldParm);
5640           for (unsigned I = 0; I != *NumExpansions; ++I) {
5641             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5642             ParmVarDecl *NewParm
5643               = getDerived().TransformFunctionTypeParam(OldParm,
5644                                                         indexAdjustment++,
5645                                                         OrigNumExpansions,
5646                                                 /*ExpectParameterPack=*/false);
5647             if (!NewParm)
5648               return true;
5649 
5650             if (ParamInfos)
5651               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5652             OutParamTypes.push_back(NewParm->getType());
5653             if (PVars)
5654               PVars->push_back(NewParm);
5655           }
5656 
5657           // If we're supposed to retain a pack expansion, do so by temporarily
5658           // forgetting the partially-substituted parameter pack.
5659           if (RetainExpansion) {
5660             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5661             ParmVarDecl *NewParm
5662               = getDerived().TransformFunctionTypeParam(OldParm,
5663                                                         indexAdjustment++,
5664                                                         OrigNumExpansions,
5665                                                 /*ExpectParameterPack=*/false);
5666             if (!NewParm)
5667               return true;
5668 
5669             if (ParamInfos)
5670               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5671             OutParamTypes.push_back(NewParm->getType());
5672             if (PVars)
5673               PVars->push_back(NewParm);
5674           }
5675 
5676           // The next parameter should have the same adjustment as the
5677           // last thing we pushed, but we post-incremented indexAdjustment
5678           // on every push.  Also, if we push nothing, the adjustment should
5679           // go down by one.
5680           indexAdjustment--;
5681 
5682           // We're done with the pack expansion.
5683           continue;
5684         }
5685 
5686         // We'll substitute the parameter now without expanding the pack
5687         // expansion.
5688         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5689         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5690                                                           indexAdjustment,
5691                                                           NumExpansions,
5692                                                   /*ExpectParameterPack=*/true);
5693         assert(NewParm->isParameterPack() &&
5694                "Parameter pack no longer a parameter pack after "
5695                "transformation.");
5696       } else {
5697         NewParm = getDerived().TransformFunctionTypeParam(
5698             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5699       }
5700 
5701       if (!NewParm)
5702         return true;
5703 
5704       if (ParamInfos)
5705         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5706       OutParamTypes.push_back(NewParm->getType());
5707       if (PVars)
5708         PVars->push_back(NewParm);
5709       continue;
5710     }
5711 
5712     // Deal with the possibility that we don't have a parameter
5713     // declaration for this parameter.
5714     QualType OldType = ParamTypes[i];
5715     bool IsPackExpansion = false;
5716     Optional<unsigned> NumExpansions;
5717     QualType NewType;
5718     if (const PackExpansionType *Expansion
5719                                        = dyn_cast<PackExpansionType>(OldType)) {
5720       // We have a function parameter pack that may need to be expanded.
5721       QualType Pattern = Expansion->getPattern();
5722       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5723       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5724 
5725       // Determine whether we should expand the parameter packs.
5726       bool ShouldExpand = false;
5727       bool RetainExpansion = false;
5728       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5729                                                Unexpanded,
5730                                                ShouldExpand,
5731                                                RetainExpansion,
5732                                                NumExpansions)) {
5733         return true;
5734       }
5735 
5736       if (ShouldExpand) {
5737         // Expand the function parameter pack into multiple, separate
5738         // parameters.
5739         for (unsigned I = 0; I != *NumExpansions; ++I) {
5740           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5741           QualType NewType = getDerived().TransformType(Pattern);
5742           if (NewType.isNull())
5743             return true;
5744 
5745           if (NewType->containsUnexpandedParameterPack()) {
5746             NewType =
5747                 getSema().getASTContext().getPackExpansionType(NewType, None);
5748 
5749             if (NewType.isNull())
5750               return true;
5751           }
5752 
5753           if (ParamInfos)
5754             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5755           OutParamTypes.push_back(NewType);
5756           if (PVars)
5757             PVars->push_back(nullptr);
5758         }
5759 
5760         // We're done with the pack expansion.
5761         continue;
5762       }
5763 
5764       // If we're supposed to retain a pack expansion, do so by temporarily
5765       // forgetting the partially-substituted parameter pack.
5766       if (RetainExpansion) {
5767         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5768         QualType NewType = getDerived().TransformType(Pattern);
5769         if (NewType.isNull())
5770           return true;
5771 
5772         if (ParamInfos)
5773           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5774         OutParamTypes.push_back(NewType);
5775         if (PVars)
5776           PVars->push_back(nullptr);
5777       }
5778 
5779       // We'll substitute the parameter now without expanding the pack
5780       // expansion.
5781       OldType = Expansion->getPattern();
5782       IsPackExpansion = true;
5783       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5784       NewType = getDerived().TransformType(OldType);
5785     } else {
5786       NewType = getDerived().TransformType(OldType);
5787     }
5788 
5789     if (NewType.isNull())
5790       return true;
5791 
5792     if (IsPackExpansion)
5793       NewType = getSema().Context.getPackExpansionType(NewType,
5794                                                        NumExpansions);
5795 
5796     if (ParamInfos)
5797       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5798     OutParamTypes.push_back(NewType);
5799     if (PVars)
5800       PVars->push_back(nullptr);
5801   }
5802 
5803 #ifndef NDEBUG
5804   if (PVars) {
5805     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5806       if (ParmVarDecl *parm = (*PVars)[i])
5807         assert(parm->getFunctionScopeIndex() == i);
5808   }
5809 #endif
5810 
5811   return false;
5812 }
5813 
5814 template<typename Derived>
5815 QualType
5816 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5817                                                    FunctionProtoTypeLoc TL) {
5818   SmallVector<QualType, 4> ExceptionStorage;
5819   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5820   return getDerived().TransformFunctionProtoType(
5821       TLB, TL, nullptr, Qualifiers(),
5822       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5823         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5824                                             ExceptionStorage, Changed);
5825       });
5826 }
5827 
5828 template<typename Derived> template<typename Fn>
5829 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5830     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5831     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5832 
5833   // Transform the parameters and return type.
5834   //
5835   // We are required to instantiate the params and return type in source order.
5836   // When the function has a trailing return type, we instantiate the
5837   // parameters before the return type,  since the return type can then refer
5838   // to the parameters themselves (via decltype, sizeof, etc.).
5839   //
5840   SmallVector<QualType, 4> ParamTypes;
5841   SmallVector<ParmVarDecl*, 4> ParamDecls;
5842   Sema::ExtParameterInfoBuilder ExtParamInfos;
5843   const FunctionProtoType *T = TL.getTypePtr();
5844 
5845   QualType ResultType;
5846 
5847   if (T->hasTrailingReturn()) {
5848     if (getDerived().TransformFunctionTypeParams(
5849             TL.getBeginLoc(), TL.getParams(),
5850             TL.getTypePtr()->param_type_begin(),
5851             T->getExtParameterInfosOrNull(),
5852             ParamTypes, &ParamDecls, ExtParamInfos))
5853       return QualType();
5854 
5855     {
5856       // C++11 [expr.prim.general]p3:
5857       //   If a declaration declares a member function or member function
5858       //   template of a class X, the expression this is a prvalue of type
5859       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5860       //   and the end of the function-definition, member-declarator, or
5861       //   declarator.
5862       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5863 
5864       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5865       if (ResultType.isNull())
5866         return QualType();
5867     }
5868   }
5869   else {
5870     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5871     if (ResultType.isNull())
5872       return QualType();
5873 
5874     if (getDerived().TransformFunctionTypeParams(
5875             TL.getBeginLoc(), TL.getParams(),
5876             TL.getTypePtr()->param_type_begin(),
5877             T->getExtParameterInfosOrNull(),
5878             ParamTypes, &ParamDecls, ExtParamInfos))
5879       return QualType();
5880   }
5881 
5882   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5883 
5884   bool EPIChanged = false;
5885   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5886     return QualType();
5887 
5888   // Handle extended parameter information.
5889   if (auto NewExtParamInfos =
5890         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5891     if (!EPI.ExtParameterInfos ||
5892         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5893           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5894       EPIChanged = true;
5895     }
5896     EPI.ExtParameterInfos = NewExtParamInfos;
5897   } else if (EPI.ExtParameterInfos) {
5898     EPIChanged = true;
5899     EPI.ExtParameterInfos = nullptr;
5900   }
5901 
5902   QualType Result = TL.getType();
5903   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5904       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5905     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5906     if (Result.isNull())
5907       return QualType();
5908   }
5909 
5910   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5911   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5912   NewTL.setLParenLoc(TL.getLParenLoc());
5913   NewTL.setRParenLoc(TL.getRParenLoc());
5914   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5915   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5916   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5917     NewTL.setParam(i, ParamDecls[i]);
5918 
5919   return Result;
5920 }
5921 
5922 template<typename Derived>
5923 bool TreeTransform<Derived>::TransformExceptionSpec(
5924     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5925     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5926   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5927 
5928   // Instantiate a dynamic noexcept expression, if any.
5929   if (isComputedNoexcept(ESI.Type)) {
5930     EnterExpressionEvaluationContext Unevaluated(
5931         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5932     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5933     if (NoexceptExpr.isInvalid())
5934       return true;
5935 
5936     ExceptionSpecificationType EST = ESI.Type;
5937     NoexceptExpr =
5938         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5939     if (NoexceptExpr.isInvalid())
5940       return true;
5941 
5942     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5943       Changed = true;
5944     ESI.NoexceptExpr = NoexceptExpr.get();
5945     ESI.Type = EST;
5946   }
5947 
5948   if (ESI.Type != EST_Dynamic)
5949     return false;
5950 
5951   // Instantiate a dynamic exception specification's type.
5952   for (QualType T : ESI.Exceptions) {
5953     if (const PackExpansionType *PackExpansion =
5954             T->getAs<PackExpansionType>()) {
5955       Changed = true;
5956 
5957       // We have a pack expansion. Instantiate it.
5958       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5959       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5960                                               Unexpanded);
5961       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5962 
5963       // Determine whether the set of unexpanded parameter packs can and
5964       // should
5965       // be expanded.
5966       bool Expand = false;
5967       bool RetainExpansion = false;
5968       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5969       // FIXME: Track the location of the ellipsis (and track source location
5970       // information for the types in the exception specification in general).
5971       if (getDerived().TryExpandParameterPacks(
5972               Loc, SourceRange(), Unexpanded, Expand,
5973               RetainExpansion, NumExpansions))
5974         return true;
5975 
5976       if (!Expand) {
5977         // We can't expand this pack expansion into separate arguments yet;
5978         // just substitute into the pattern and create a new pack expansion
5979         // type.
5980         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5981         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5982         if (U.isNull())
5983           return true;
5984 
5985         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5986         Exceptions.push_back(U);
5987         continue;
5988       }
5989 
5990       // Substitute into the pack expansion pattern for each slice of the
5991       // pack.
5992       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5993         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5994 
5995         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5996         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5997           return true;
5998 
5999         Exceptions.push_back(U);
6000       }
6001     } else {
6002       QualType U = getDerived().TransformType(T);
6003       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
6004         return true;
6005       if (T != U)
6006         Changed = true;
6007 
6008       Exceptions.push_back(U);
6009     }
6010   }
6011 
6012   ESI.Exceptions = Exceptions;
6013   if (ESI.Exceptions.empty())
6014     ESI.Type = EST_DynamicNone;
6015   return false;
6016 }
6017 
6018 template<typename Derived>
6019 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
6020                                                  TypeLocBuilder &TLB,
6021                                                  FunctionNoProtoTypeLoc TL) {
6022   const FunctionNoProtoType *T = TL.getTypePtr();
6023   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
6024   if (ResultType.isNull())
6025     return QualType();
6026 
6027   QualType Result = TL.getType();
6028   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
6029     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
6030 
6031   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
6032   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
6033   NewTL.setLParenLoc(TL.getLParenLoc());
6034   NewTL.setRParenLoc(TL.getRParenLoc());
6035   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
6036 
6037   return Result;
6038 }
6039 
6040 template<typename Derived> QualType
6041 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
6042                                                  UnresolvedUsingTypeLoc TL) {
6043   const UnresolvedUsingType *T = TL.getTypePtr();
6044   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6045   if (!D)
6046     return QualType();
6047 
6048   QualType Result = TL.getType();
6049   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6050     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6051     if (Result.isNull())
6052       return QualType();
6053   }
6054 
6055   // We might get an arbitrary type spec type back.  We should at
6056   // least always get a type spec type, though.
6057   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6058   NewTL.setNameLoc(TL.getNameLoc());
6059 
6060   return Result;
6061 }
6062 
6063 template<typename Derived>
6064 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6065                                                       TypedefTypeLoc TL) {
6066   const TypedefType *T = TL.getTypePtr();
6067   TypedefNameDecl *Typedef
6068     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6069                                                                T->getDecl()));
6070   if (!Typedef)
6071     return QualType();
6072 
6073   QualType Result = TL.getType();
6074   if (getDerived().AlwaysRebuild() ||
6075       Typedef != T->getDecl()) {
6076     Result = getDerived().RebuildTypedefType(Typedef);
6077     if (Result.isNull())
6078       return QualType();
6079   }
6080 
6081   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6082   NewTL.setNameLoc(TL.getNameLoc());
6083 
6084   return Result;
6085 }
6086 
6087 template<typename Derived>
6088 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6089                                                       TypeOfExprTypeLoc TL) {
6090   // typeof expressions are not potentially evaluated contexts
6091   EnterExpressionEvaluationContext Unevaluated(
6092       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6093       Sema::ReuseLambdaContextDecl);
6094 
6095   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6096   if (E.isInvalid())
6097     return QualType();
6098 
6099   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6100   if (E.isInvalid())
6101     return QualType();
6102 
6103   QualType Result = TL.getType();
6104   if (getDerived().AlwaysRebuild() ||
6105       E.get() != TL.getUnderlyingExpr()) {
6106     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6107     if (Result.isNull())
6108       return QualType();
6109   }
6110   else E.get();
6111 
6112   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6113   NewTL.setTypeofLoc(TL.getTypeofLoc());
6114   NewTL.setLParenLoc(TL.getLParenLoc());
6115   NewTL.setRParenLoc(TL.getRParenLoc());
6116 
6117   return Result;
6118 }
6119 
6120 template<typename Derived>
6121 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6122                                                      TypeOfTypeLoc TL) {
6123   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6124   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6125   if (!New_Under_TI)
6126     return QualType();
6127 
6128   QualType Result = TL.getType();
6129   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6130     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6131     if (Result.isNull())
6132       return QualType();
6133   }
6134 
6135   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6136   NewTL.setTypeofLoc(TL.getTypeofLoc());
6137   NewTL.setLParenLoc(TL.getLParenLoc());
6138   NewTL.setRParenLoc(TL.getRParenLoc());
6139   NewTL.setUnderlyingTInfo(New_Under_TI);
6140 
6141   return Result;
6142 }
6143 
6144 template<typename Derived>
6145 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6146                                                        DecltypeTypeLoc TL) {
6147   const DecltypeType *T = TL.getTypePtr();
6148 
6149   // decltype expressions are not potentially evaluated contexts
6150   EnterExpressionEvaluationContext Unevaluated(
6151       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6152       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6153 
6154   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6155   if (E.isInvalid())
6156     return QualType();
6157 
6158   E = getSema().ActOnDecltypeExpression(E.get());
6159   if (E.isInvalid())
6160     return QualType();
6161 
6162   QualType Result = TL.getType();
6163   if (getDerived().AlwaysRebuild() ||
6164       E.get() != T->getUnderlyingExpr()) {
6165     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6166     if (Result.isNull())
6167       return QualType();
6168   }
6169   else E.get();
6170 
6171   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6172   NewTL.setNameLoc(TL.getNameLoc());
6173 
6174   return Result;
6175 }
6176 
6177 template<typename Derived>
6178 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6179                                                             TypeLocBuilder &TLB,
6180                                                      UnaryTransformTypeLoc TL) {
6181   QualType Result = TL.getType();
6182   if (Result->isDependentType()) {
6183     const UnaryTransformType *T = TL.getTypePtr();
6184     QualType NewBase =
6185       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6186     Result = getDerived().RebuildUnaryTransformType(NewBase,
6187                                                     T->getUTTKind(),
6188                                                     TL.getKWLoc());
6189     if (Result.isNull())
6190       return QualType();
6191   }
6192 
6193   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6194   NewTL.setKWLoc(TL.getKWLoc());
6195   NewTL.setParensRange(TL.getParensRange());
6196   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6197   return Result;
6198 }
6199 
6200 template<typename Derived>
6201 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6202     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6203   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6204 
6205   CXXScopeSpec SS;
6206   TemplateName TemplateName = getDerived().TransformTemplateName(
6207       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6208   if (TemplateName.isNull())
6209     return QualType();
6210 
6211   QualType OldDeduced = T->getDeducedType();
6212   QualType NewDeduced;
6213   if (!OldDeduced.isNull()) {
6214     NewDeduced = getDerived().TransformType(OldDeduced);
6215     if (NewDeduced.isNull())
6216       return QualType();
6217   }
6218 
6219   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6220       TemplateName, NewDeduced);
6221   if (Result.isNull())
6222     return QualType();
6223 
6224   DeducedTemplateSpecializationTypeLoc NewTL =
6225       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6226   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6227 
6228   return Result;
6229 }
6230 
6231 template<typename Derived>
6232 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6233                                                      RecordTypeLoc TL) {
6234   const RecordType *T = TL.getTypePtr();
6235   RecordDecl *Record
6236     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6237                                                           T->getDecl()));
6238   if (!Record)
6239     return QualType();
6240 
6241   QualType Result = TL.getType();
6242   if (getDerived().AlwaysRebuild() ||
6243       Record != T->getDecl()) {
6244     Result = getDerived().RebuildRecordType(Record);
6245     if (Result.isNull())
6246       return QualType();
6247   }
6248 
6249   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6250   NewTL.setNameLoc(TL.getNameLoc());
6251 
6252   return Result;
6253 }
6254 
6255 template<typename Derived>
6256 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6257                                                    EnumTypeLoc TL) {
6258   const EnumType *T = TL.getTypePtr();
6259   EnumDecl *Enum
6260     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6261                                                         T->getDecl()));
6262   if (!Enum)
6263     return QualType();
6264 
6265   QualType Result = TL.getType();
6266   if (getDerived().AlwaysRebuild() ||
6267       Enum != T->getDecl()) {
6268     Result = getDerived().RebuildEnumType(Enum);
6269     if (Result.isNull())
6270       return QualType();
6271   }
6272 
6273   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6274   NewTL.setNameLoc(TL.getNameLoc());
6275 
6276   return Result;
6277 }
6278 
6279 template<typename Derived>
6280 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6281                                          TypeLocBuilder &TLB,
6282                                          InjectedClassNameTypeLoc TL) {
6283   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6284                                        TL.getTypePtr()->getDecl());
6285   if (!D) return QualType();
6286 
6287   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6288   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6289   return T;
6290 }
6291 
6292 template<typename Derived>
6293 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6294                                                 TypeLocBuilder &TLB,
6295                                                 TemplateTypeParmTypeLoc TL) {
6296   return TransformTypeSpecType(TLB, TL);
6297 }
6298 
6299 template<typename Derived>
6300 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6301                                          TypeLocBuilder &TLB,
6302                                          SubstTemplateTypeParmTypeLoc TL) {
6303   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6304 
6305   // Substitute into the replacement type, which itself might involve something
6306   // that needs to be transformed. This only tends to occur with default
6307   // template arguments of template template parameters.
6308   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6309   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6310   if (Replacement.isNull())
6311     return QualType();
6312 
6313   // Always canonicalize the replacement type.
6314   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6315   QualType Result
6316     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6317                                                    Replacement);
6318 
6319   // Propagate type-source information.
6320   SubstTemplateTypeParmTypeLoc NewTL
6321     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6322   NewTL.setNameLoc(TL.getNameLoc());
6323   return Result;
6324 
6325 }
6326 
6327 template<typename Derived>
6328 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6329                                           TypeLocBuilder &TLB,
6330                                           SubstTemplateTypeParmPackTypeLoc TL) {
6331   return TransformTypeSpecType(TLB, TL);
6332 }
6333 
6334 template<typename Derived>
6335 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6336                                                         TypeLocBuilder &TLB,
6337                                            TemplateSpecializationTypeLoc TL) {
6338   const TemplateSpecializationType *T = TL.getTypePtr();
6339 
6340   // The nested-name-specifier never matters in a TemplateSpecializationType,
6341   // because we can't have a dependent nested-name-specifier anyway.
6342   CXXScopeSpec SS;
6343   TemplateName Template
6344     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6345                                          TL.getTemplateNameLoc());
6346   if (Template.isNull())
6347     return QualType();
6348 
6349   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6350 }
6351 
6352 template<typename Derived>
6353 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6354                                                      AtomicTypeLoc TL) {
6355   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6356   if (ValueType.isNull())
6357     return QualType();
6358 
6359   QualType Result = TL.getType();
6360   if (getDerived().AlwaysRebuild() ||
6361       ValueType != TL.getValueLoc().getType()) {
6362     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6363     if (Result.isNull())
6364       return QualType();
6365   }
6366 
6367   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6368   NewTL.setKWLoc(TL.getKWLoc());
6369   NewTL.setLParenLoc(TL.getLParenLoc());
6370   NewTL.setRParenLoc(TL.getRParenLoc());
6371 
6372   return Result;
6373 }
6374 
6375 template <typename Derived>
6376 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6377                                                    PipeTypeLoc TL) {
6378   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6379   if (ValueType.isNull())
6380     return QualType();
6381 
6382   QualType Result = TL.getType();
6383   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6384     const PipeType *PT = Result->castAs<PipeType>();
6385     bool isReadPipe = PT->isReadOnly();
6386     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6387     if (Result.isNull())
6388       return QualType();
6389   }
6390 
6391   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6392   NewTL.setKWLoc(TL.getKWLoc());
6393 
6394   return Result;
6395 }
6396 
6397 template <typename Derived>
6398 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6399                                                      ExtIntTypeLoc TL) {
6400   const ExtIntType *EIT = TL.getTypePtr();
6401   QualType Result = TL.getType();
6402 
6403   if (getDerived().AlwaysRebuild()) {
6404     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6405                                             EIT->getNumBits(), TL.getNameLoc());
6406     if (Result.isNull())
6407       return QualType();
6408   }
6409 
6410   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6411   NewTL.setNameLoc(TL.getNameLoc());
6412   return Result;
6413 }
6414 
6415 template <typename Derived>
6416 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6417     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6418   const DependentExtIntType *EIT = TL.getTypePtr();
6419 
6420   EnterExpressionEvaluationContext Unevaluated(
6421       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6422   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6423   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6424 
6425   if (BitsExpr.isInvalid())
6426     return QualType();
6427 
6428   QualType Result = TL.getType();
6429 
6430   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6431     Result = getDerived().RebuildDependentExtIntType(
6432         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6433 
6434     if (Result.isNull())
6435       return QualType();
6436   }
6437 
6438   if (isa<DependentExtIntType>(Result)) {
6439     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6440     NewTL.setNameLoc(TL.getNameLoc());
6441   } else {
6442     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6443     NewTL.setNameLoc(TL.getNameLoc());
6444   }
6445   return Result;
6446 }
6447 
6448   /// Simple iterator that traverses the template arguments in a
6449   /// container that provides a \c getArgLoc() member function.
6450   ///
6451   /// This iterator is intended to be used with the iterator form of
6452   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6453   template<typename ArgLocContainer>
6454   class TemplateArgumentLocContainerIterator {
6455     ArgLocContainer *Container;
6456     unsigned Index;
6457 
6458   public:
6459     typedef TemplateArgumentLoc value_type;
6460     typedef TemplateArgumentLoc reference;
6461     typedef int difference_type;
6462     typedef std::input_iterator_tag iterator_category;
6463 
6464     class pointer {
6465       TemplateArgumentLoc Arg;
6466 
6467     public:
6468       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6469 
6470       const TemplateArgumentLoc *operator->() const {
6471         return &Arg;
6472       }
6473     };
6474 
6475 
6476     TemplateArgumentLocContainerIterator() {}
6477 
6478     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6479                                  unsigned Index)
6480       : Container(&Container), Index(Index) { }
6481 
6482     TemplateArgumentLocContainerIterator &operator++() {
6483       ++Index;
6484       return *this;
6485     }
6486 
6487     TemplateArgumentLocContainerIterator operator++(int) {
6488       TemplateArgumentLocContainerIterator Old(*this);
6489       ++(*this);
6490       return Old;
6491     }
6492 
6493     TemplateArgumentLoc operator*() const {
6494       return Container->getArgLoc(Index);
6495     }
6496 
6497     pointer operator->() const {
6498       return pointer(Container->getArgLoc(Index));
6499     }
6500 
6501     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6502                            const TemplateArgumentLocContainerIterator &Y) {
6503       return X.Container == Y.Container && X.Index == Y.Index;
6504     }
6505 
6506     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6507                            const TemplateArgumentLocContainerIterator &Y) {
6508       return !(X == Y);
6509     }
6510   };
6511 
6512 template<typename Derived>
6513 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6514                                                    AutoTypeLoc TL) {
6515   const AutoType *T = TL.getTypePtr();
6516   QualType OldDeduced = T->getDeducedType();
6517   QualType NewDeduced;
6518   if (!OldDeduced.isNull()) {
6519     NewDeduced = getDerived().TransformType(OldDeduced);
6520     if (NewDeduced.isNull())
6521       return QualType();
6522   }
6523 
6524   ConceptDecl *NewCD = nullptr;
6525   TemplateArgumentListInfo NewTemplateArgs;
6526   NestedNameSpecifierLoc NewNestedNameSpec;
6527   if (T->isConstrained()) {
6528     NewCD = cast_or_null<ConceptDecl>(getDerived().TransformDecl(
6529         TL.getConceptNameLoc(), T->getTypeConstraintConcept()));
6530 
6531     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6532     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6533     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6534     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6535                                                 ArgIterator(TL,
6536                                                             TL.getNumArgs()),
6537                                                 NewTemplateArgs))
6538       return QualType();
6539 
6540     if (TL.getNestedNameSpecifierLoc()) {
6541       NewNestedNameSpec
6542         = getDerived().TransformNestedNameSpecifierLoc(
6543             TL.getNestedNameSpecifierLoc());
6544       if (!NewNestedNameSpec)
6545         return QualType();
6546     }
6547   }
6548 
6549   QualType Result = TL.getType();
6550   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6551       T->isDependentType() || T->isConstrained()) {
6552     // FIXME: Maybe don't rebuild if all template arguments are the same.
6553     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6554     NewArgList.reserve(NewArgList.size());
6555     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6556       NewArgList.push_back(ArgLoc.getArgument());
6557     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6558                                           NewArgList);
6559     if (Result.isNull())
6560       return QualType();
6561   }
6562 
6563   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6564   NewTL.setNameLoc(TL.getNameLoc());
6565   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6566   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6567   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6568   NewTL.setFoundDecl(TL.getFoundDecl());
6569   NewTL.setLAngleLoc(TL.getLAngleLoc());
6570   NewTL.setRAngleLoc(TL.getRAngleLoc());
6571   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6572     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6573 
6574   return Result;
6575 }
6576 
6577 template <typename Derived>
6578 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6579                                                         TypeLocBuilder &TLB,
6580                                            TemplateSpecializationTypeLoc TL,
6581                                                       TemplateName Template) {
6582   TemplateArgumentListInfo NewTemplateArgs;
6583   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6584   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6585   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6586     ArgIterator;
6587   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6588                                               ArgIterator(TL, TL.getNumArgs()),
6589                                               NewTemplateArgs))
6590     return QualType();
6591 
6592   // FIXME: maybe don't rebuild if all the template arguments are the same.
6593 
6594   QualType Result =
6595     getDerived().RebuildTemplateSpecializationType(Template,
6596                                                    TL.getTemplateNameLoc(),
6597                                                    NewTemplateArgs);
6598 
6599   if (!Result.isNull()) {
6600     // Specializations of template template parameters are represented as
6601     // TemplateSpecializationTypes, and substitution of type alias templates
6602     // within a dependent context can transform them into
6603     // DependentTemplateSpecializationTypes.
6604     if (isa<DependentTemplateSpecializationType>(Result)) {
6605       DependentTemplateSpecializationTypeLoc NewTL
6606         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6607       NewTL.setElaboratedKeywordLoc(SourceLocation());
6608       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6609       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6610       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6611       NewTL.setLAngleLoc(TL.getLAngleLoc());
6612       NewTL.setRAngleLoc(TL.getRAngleLoc());
6613       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6614         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6615       return Result;
6616     }
6617 
6618     TemplateSpecializationTypeLoc NewTL
6619       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6620     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6621     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6622     NewTL.setLAngleLoc(TL.getLAngleLoc());
6623     NewTL.setRAngleLoc(TL.getRAngleLoc());
6624     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6625       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6626   }
6627 
6628   return Result;
6629 }
6630 
6631 template <typename Derived>
6632 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6633                                      TypeLocBuilder &TLB,
6634                                      DependentTemplateSpecializationTypeLoc TL,
6635                                      TemplateName Template,
6636                                      CXXScopeSpec &SS) {
6637   TemplateArgumentListInfo NewTemplateArgs;
6638   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6639   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6640   typedef TemplateArgumentLocContainerIterator<
6641             DependentTemplateSpecializationTypeLoc> ArgIterator;
6642   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6643                                               ArgIterator(TL, TL.getNumArgs()),
6644                                               NewTemplateArgs))
6645     return QualType();
6646 
6647   // FIXME: maybe don't rebuild if all the template arguments are the same.
6648 
6649   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6650     QualType Result
6651       = getSema().Context.getDependentTemplateSpecializationType(
6652                                                 TL.getTypePtr()->getKeyword(),
6653                                                          DTN->getQualifier(),
6654                                                          DTN->getIdentifier(),
6655                                                                NewTemplateArgs);
6656 
6657     DependentTemplateSpecializationTypeLoc NewTL
6658       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6659     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6660     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6661     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6662     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6663     NewTL.setLAngleLoc(TL.getLAngleLoc());
6664     NewTL.setRAngleLoc(TL.getRAngleLoc());
6665     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6666       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6667     return Result;
6668   }
6669 
6670   QualType Result
6671     = getDerived().RebuildTemplateSpecializationType(Template,
6672                                                      TL.getTemplateNameLoc(),
6673                                                      NewTemplateArgs);
6674 
6675   if (!Result.isNull()) {
6676     /// FIXME: Wrap this in an elaborated-type-specifier?
6677     TemplateSpecializationTypeLoc NewTL
6678       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6679     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6680     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6681     NewTL.setLAngleLoc(TL.getLAngleLoc());
6682     NewTL.setRAngleLoc(TL.getRAngleLoc());
6683     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6684       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6685   }
6686 
6687   return Result;
6688 }
6689 
6690 template<typename Derived>
6691 QualType
6692 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6693                                                 ElaboratedTypeLoc TL) {
6694   const ElaboratedType *T = TL.getTypePtr();
6695 
6696   NestedNameSpecifierLoc QualifierLoc;
6697   // NOTE: the qualifier in an ElaboratedType is optional.
6698   if (TL.getQualifierLoc()) {
6699     QualifierLoc
6700       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6701     if (!QualifierLoc)
6702       return QualType();
6703   }
6704 
6705   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6706   if (NamedT.isNull())
6707     return QualType();
6708 
6709   // C++0x [dcl.type.elab]p2:
6710   //   If the identifier resolves to a typedef-name or the simple-template-id
6711   //   resolves to an alias template specialization, the
6712   //   elaborated-type-specifier is ill-formed.
6713   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6714     if (const TemplateSpecializationType *TST =
6715           NamedT->getAs<TemplateSpecializationType>()) {
6716       TemplateName Template = TST->getTemplateName();
6717       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6718               Template.getAsTemplateDecl())) {
6719         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6720                      diag::err_tag_reference_non_tag)
6721             << TAT << Sema::NTK_TypeAliasTemplate
6722             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6723         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6724       }
6725     }
6726   }
6727 
6728   QualType Result = TL.getType();
6729   if (getDerived().AlwaysRebuild() ||
6730       QualifierLoc != TL.getQualifierLoc() ||
6731       NamedT != T->getNamedType()) {
6732     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6733                                                 T->getKeyword(),
6734                                                 QualifierLoc, NamedT);
6735     if (Result.isNull())
6736       return QualType();
6737   }
6738 
6739   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6740   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6741   NewTL.setQualifierLoc(QualifierLoc);
6742   return Result;
6743 }
6744 
6745 template<typename Derived>
6746 QualType TreeTransform<Derived>::TransformAttributedType(
6747                                                 TypeLocBuilder &TLB,
6748                                                 AttributedTypeLoc TL) {
6749   const AttributedType *oldType = TL.getTypePtr();
6750   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6751   if (modifiedType.isNull())
6752     return QualType();
6753 
6754   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6755   const Attr *oldAttr = TL.getAttr();
6756   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6757   if (oldAttr && !newAttr)
6758     return QualType();
6759 
6760   QualType result = TL.getType();
6761 
6762   // FIXME: dependent operand expressions?
6763   if (getDerived().AlwaysRebuild() ||
6764       modifiedType != oldType->getModifiedType()) {
6765     // TODO: this is really lame; we should really be rebuilding the
6766     // equivalent type from first principles.
6767     QualType equivalentType
6768       = getDerived().TransformType(oldType->getEquivalentType());
6769     if (equivalentType.isNull())
6770       return QualType();
6771 
6772     // Check whether we can add nullability; it is only represented as
6773     // type sugar, and therefore cannot be diagnosed in any other way.
6774     if (auto nullability = oldType->getImmediateNullability()) {
6775       if (!modifiedType->canHaveNullability()) {
6776         SemaRef.Diag(TL.getAttr()->getLocation(),
6777                      diag::err_nullability_nonpointer)
6778             << DiagNullabilityKind(*nullability, false) << modifiedType;
6779         return QualType();
6780       }
6781     }
6782 
6783     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6784                                                modifiedType,
6785                                                equivalentType);
6786   }
6787 
6788   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6789   newTL.setAttr(newAttr);
6790   return result;
6791 }
6792 
6793 template<typename Derived>
6794 QualType
6795 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6796                                            ParenTypeLoc TL) {
6797   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6798   if (Inner.isNull())
6799     return QualType();
6800 
6801   QualType Result = TL.getType();
6802   if (getDerived().AlwaysRebuild() ||
6803       Inner != TL.getInnerLoc().getType()) {
6804     Result = getDerived().RebuildParenType(Inner);
6805     if (Result.isNull())
6806       return QualType();
6807   }
6808 
6809   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6810   NewTL.setLParenLoc(TL.getLParenLoc());
6811   NewTL.setRParenLoc(TL.getRParenLoc());
6812   return Result;
6813 }
6814 
6815 template <typename Derived>
6816 QualType
6817 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6818                                                     MacroQualifiedTypeLoc TL) {
6819   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6820   if (Inner.isNull())
6821     return QualType();
6822 
6823   QualType Result = TL.getType();
6824   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6825     Result =
6826         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6827     if (Result.isNull())
6828       return QualType();
6829   }
6830 
6831   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6832   NewTL.setExpansionLoc(TL.getExpansionLoc());
6833   return Result;
6834 }
6835 
6836 template<typename Derived>
6837 QualType TreeTransform<Derived>::TransformDependentNameType(
6838     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6839   return TransformDependentNameType(TLB, TL, false);
6840 }
6841 
6842 template<typename Derived>
6843 QualType TreeTransform<Derived>::TransformDependentNameType(
6844     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6845   const DependentNameType *T = TL.getTypePtr();
6846 
6847   NestedNameSpecifierLoc QualifierLoc
6848     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6849   if (!QualifierLoc)
6850     return QualType();
6851 
6852   QualType Result
6853     = getDerived().RebuildDependentNameType(T->getKeyword(),
6854                                             TL.getElaboratedKeywordLoc(),
6855                                             QualifierLoc,
6856                                             T->getIdentifier(),
6857                                             TL.getNameLoc(),
6858                                             DeducedTSTContext);
6859   if (Result.isNull())
6860     return QualType();
6861 
6862   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6863     QualType NamedT = ElabT->getNamedType();
6864     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6865 
6866     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6867     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6868     NewTL.setQualifierLoc(QualifierLoc);
6869   } else {
6870     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6871     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6872     NewTL.setQualifierLoc(QualifierLoc);
6873     NewTL.setNameLoc(TL.getNameLoc());
6874   }
6875   return Result;
6876 }
6877 
6878 template<typename Derived>
6879 QualType TreeTransform<Derived>::
6880           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6881                                  DependentTemplateSpecializationTypeLoc TL) {
6882   NestedNameSpecifierLoc QualifierLoc;
6883   if (TL.getQualifierLoc()) {
6884     QualifierLoc
6885       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6886     if (!QualifierLoc)
6887       return QualType();
6888   }
6889 
6890   return getDerived()
6891            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6892 }
6893 
6894 template<typename Derived>
6895 QualType TreeTransform<Derived>::
6896 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6897                                    DependentTemplateSpecializationTypeLoc TL,
6898                                        NestedNameSpecifierLoc QualifierLoc) {
6899   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6900 
6901   TemplateArgumentListInfo NewTemplateArgs;
6902   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6903   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6904 
6905   typedef TemplateArgumentLocContainerIterator<
6906   DependentTemplateSpecializationTypeLoc> ArgIterator;
6907   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6908                                               ArgIterator(TL, TL.getNumArgs()),
6909                                               NewTemplateArgs))
6910     return QualType();
6911 
6912   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6913       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6914       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6915       /*AllowInjectedClassName*/ false);
6916   if (Result.isNull())
6917     return QualType();
6918 
6919   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6920     QualType NamedT = ElabT->getNamedType();
6921 
6922     // Copy information relevant to the template specialization.
6923     TemplateSpecializationTypeLoc NamedTL
6924       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6925     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6926     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6927     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6928     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6929     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6930       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6931 
6932     // Copy information relevant to the elaborated type.
6933     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6934     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6935     NewTL.setQualifierLoc(QualifierLoc);
6936   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6937     DependentTemplateSpecializationTypeLoc SpecTL
6938       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6939     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6940     SpecTL.setQualifierLoc(QualifierLoc);
6941     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6942     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6943     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6944     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6945     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6946       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6947   } else {
6948     TemplateSpecializationTypeLoc SpecTL
6949       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6950     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6951     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6952     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6953     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6954     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6955       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6956   }
6957   return Result;
6958 }
6959 
6960 template<typename Derived>
6961 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6962                                                       PackExpansionTypeLoc TL) {
6963   QualType Pattern
6964     = getDerived().TransformType(TLB, TL.getPatternLoc());
6965   if (Pattern.isNull())
6966     return QualType();
6967 
6968   QualType Result = TL.getType();
6969   if (getDerived().AlwaysRebuild() ||
6970       Pattern != TL.getPatternLoc().getType()) {
6971     Result = getDerived().RebuildPackExpansionType(Pattern,
6972                                            TL.getPatternLoc().getSourceRange(),
6973                                                    TL.getEllipsisLoc(),
6974                                            TL.getTypePtr()->getNumExpansions());
6975     if (Result.isNull())
6976       return QualType();
6977   }
6978 
6979   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6980   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6981   return Result;
6982 }
6983 
6984 template<typename Derived>
6985 QualType
6986 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6987                                                    ObjCInterfaceTypeLoc TL) {
6988   // ObjCInterfaceType is never dependent.
6989   TLB.pushFullCopy(TL);
6990   return TL.getType();
6991 }
6992 
6993 template<typename Derived>
6994 QualType
6995 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6996                                                    ObjCTypeParamTypeLoc TL) {
6997   const ObjCTypeParamType *T = TL.getTypePtr();
6998   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6999       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
7000   if (!OTP)
7001     return QualType();
7002 
7003   QualType Result = TL.getType();
7004   if (getDerived().AlwaysRebuild() ||
7005       OTP != T->getDecl()) {
7006     Result = getDerived().RebuildObjCTypeParamType(OTP,
7007                  TL.getProtocolLAngleLoc(),
7008                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
7009                                     TL.getNumProtocols()),
7010                  TL.getProtocolLocs(),
7011                  TL.getProtocolRAngleLoc());
7012     if (Result.isNull())
7013       return QualType();
7014   }
7015 
7016   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
7017   if (TL.getNumProtocols()) {
7018     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7019     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7020       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
7021     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7022   }
7023   return Result;
7024 }
7025 
7026 template<typename Derived>
7027 QualType
7028 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
7029                                                 ObjCObjectTypeLoc TL) {
7030   // Transform base type.
7031   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
7032   if (BaseType.isNull())
7033     return QualType();
7034 
7035   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
7036 
7037   // Transform type arguments.
7038   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
7039   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
7040     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
7041     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7042     QualType TypeArg = TypeArgInfo->getType();
7043     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7044       AnyChanged = true;
7045 
7046       // We have a pack expansion. Instantiate it.
7047       const auto *PackExpansion = PackExpansionLoc.getType()
7048                                     ->castAs<PackExpansionType>();
7049       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7050       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7051                                               Unexpanded);
7052       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7053 
7054       // Determine whether the set of unexpanded parameter packs can
7055       // and should be expanded.
7056       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7057       bool Expand = false;
7058       bool RetainExpansion = false;
7059       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7060       if (getDerived().TryExpandParameterPacks(
7061             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7062             Unexpanded, Expand, RetainExpansion, NumExpansions))
7063         return QualType();
7064 
7065       if (!Expand) {
7066         // We can't expand this pack expansion into separate arguments yet;
7067         // just substitute into the pattern and create a new pack expansion
7068         // type.
7069         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7070 
7071         TypeLocBuilder TypeArgBuilder;
7072         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7073         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7074                                                              PatternLoc);
7075         if (NewPatternType.isNull())
7076           return QualType();
7077 
7078         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7079                                       NewPatternType, NumExpansions);
7080         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7081         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7082         NewTypeArgInfos.push_back(
7083           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7084         continue;
7085       }
7086 
7087       // Substitute into the pack expansion pattern for each slice of the
7088       // pack.
7089       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7090         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7091 
7092         TypeLocBuilder TypeArgBuilder;
7093         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7094 
7095         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7096                                                          PatternLoc);
7097         if (NewTypeArg.isNull())
7098           return QualType();
7099 
7100         NewTypeArgInfos.push_back(
7101           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7102       }
7103 
7104       continue;
7105     }
7106 
7107     TypeLocBuilder TypeArgBuilder;
7108     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7109     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7110     if (NewTypeArg.isNull())
7111       return QualType();
7112 
7113     // If nothing changed, just keep the old TypeSourceInfo.
7114     if (NewTypeArg == TypeArg) {
7115       NewTypeArgInfos.push_back(TypeArgInfo);
7116       continue;
7117     }
7118 
7119     NewTypeArgInfos.push_back(
7120       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7121     AnyChanged = true;
7122   }
7123 
7124   QualType Result = TL.getType();
7125   if (getDerived().AlwaysRebuild() || AnyChanged) {
7126     // Rebuild the type.
7127     Result = getDerived().RebuildObjCObjectType(
7128         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7129         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7130         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7131         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7132 
7133     if (Result.isNull())
7134       return QualType();
7135   }
7136 
7137   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7138   NewT.setHasBaseTypeAsWritten(true);
7139   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7140   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7141     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7142   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7143   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7144   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7145     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7146   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7147   return Result;
7148 }
7149 
7150 template<typename Derived>
7151 QualType
7152 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7153                                                ObjCObjectPointerTypeLoc TL) {
7154   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7155   if (PointeeType.isNull())
7156     return QualType();
7157 
7158   QualType Result = TL.getType();
7159   if (getDerived().AlwaysRebuild() ||
7160       PointeeType != TL.getPointeeLoc().getType()) {
7161     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7162                                                        TL.getStarLoc());
7163     if (Result.isNull())
7164       return QualType();
7165   }
7166 
7167   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7168   NewT.setStarLoc(TL.getStarLoc());
7169   return Result;
7170 }
7171 
7172 //===----------------------------------------------------------------------===//
7173 // Statement transformation
7174 //===----------------------------------------------------------------------===//
7175 template<typename Derived>
7176 StmtResult
7177 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7178   return S;
7179 }
7180 
7181 template<typename Derived>
7182 StmtResult
7183 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7184   return getDerived().TransformCompoundStmt(S, false);
7185 }
7186 
7187 template<typename Derived>
7188 StmtResult
7189 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7190                                               bool IsStmtExpr) {
7191   Sema::CompoundScopeRAII CompoundScope(getSema());
7192 
7193   const Stmt *ExprResult = S->getStmtExprResult();
7194   bool SubStmtInvalid = false;
7195   bool SubStmtChanged = false;
7196   SmallVector<Stmt*, 8> Statements;
7197   for (auto *B : S->body()) {
7198     StmtResult Result = getDerived().TransformStmt(
7199         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7200 
7201     if (Result.isInvalid()) {
7202       // Immediately fail if this was a DeclStmt, since it's very
7203       // likely that this will cause problems for future statements.
7204       if (isa<DeclStmt>(B))
7205         return StmtError();
7206 
7207       // Otherwise, just keep processing substatements and fail later.
7208       SubStmtInvalid = true;
7209       continue;
7210     }
7211 
7212     SubStmtChanged = SubStmtChanged || Result.get() != B;
7213     Statements.push_back(Result.getAs<Stmt>());
7214   }
7215 
7216   if (SubStmtInvalid)
7217     return StmtError();
7218 
7219   if (!getDerived().AlwaysRebuild() &&
7220       !SubStmtChanged)
7221     return S;
7222 
7223   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7224                                           Statements,
7225                                           S->getRBracLoc(),
7226                                           IsStmtExpr);
7227 }
7228 
7229 template<typename Derived>
7230 StmtResult
7231 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7232   ExprResult LHS, RHS;
7233   {
7234     EnterExpressionEvaluationContext Unevaluated(
7235         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7236 
7237     // Transform the left-hand case value.
7238     LHS = getDerived().TransformExpr(S->getLHS());
7239     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7240     if (LHS.isInvalid())
7241       return StmtError();
7242 
7243     // Transform the right-hand case value (for the GNU case-range extension).
7244     RHS = getDerived().TransformExpr(S->getRHS());
7245     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7246     if (RHS.isInvalid())
7247       return StmtError();
7248   }
7249 
7250   // Build the case statement.
7251   // Case statements are always rebuilt so that they will attached to their
7252   // transformed switch statement.
7253   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7254                                                        LHS.get(),
7255                                                        S->getEllipsisLoc(),
7256                                                        RHS.get(),
7257                                                        S->getColonLoc());
7258   if (Case.isInvalid())
7259     return StmtError();
7260 
7261   // Transform the statement following the case
7262   StmtResult SubStmt =
7263       getDerived().TransformStmt(S->getSubStmt());
7264   if (SubStmt.isInvalid())
7265     return StmtError();
7266 
7267   // Attach the body to the case statement
7268   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7269 }
7270 
7271 template <typename Derived>
7272 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7273   // Transform the statement following the default case
7274   StmtResult SubStmt =
7275       getDerived().TransformStmt(S->getSubStmt());
7276   if (SubStmt.isInvalid())
7277     return StmtError();
7278 
7279   // Default statements are always rebuilt
7280   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7281                                          SubStmt.get());
7282 }
7283 
7284 template<typename Derived>
7285 StmtResult
7286 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7287   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7288   if (SubStmt.isInvalid())
7289     return StmtError();
7290 
7291   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7292                                         S->getDecl());
7293   if (!LD)
7294     return StmtError();
7295 
7296   // If we're transforming "in-place" (we're not creating new local
7297   // declarations), assume we're replacing the old label statement
7298   // and clear out the reference to it.
7299   if (LD == S->getDecl())
7300     S->getDecl()->setStmt(nullptr);
7301 
7302   // FIXME: Pass the real colon location in.
7303   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7304                                        cast<LabelDecl>(LD), SourceLocation(),
7305                                        SubStmt.get());
7306 }
7307 
7308 template <typename Derived>
7309 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7310   if (!R)
7311     return R;
7312 
7313   switch (R->getKind()) {
7314 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7315 #define ATTR(X)
7316 #define PRAGMA_SPELLING_ATTR(X)                                                \
7317   case attr::X:                                                                \
7318     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7319 #include "clang/Basic/AttrList.inc"
7320   default:
7321     return R;
7322   }
7323 }
7324 
7325 template <typename Derived>
7326 StmtResult
7327 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7328                                                 StmtDiscardKind SDK) {
7329   bool AttrsChanged = false;
7330   SmallVector<const Attr *, 1> Attrs;
7331 
7332   // Visit attributes and keep track if any are transformed.
7333   for (const auto *I : S->getAttrs()) {
7334     const Attr *R = getDerived().TransformAttr(I);
7335     AttrsChanged |= (I != R);
7336     if (R)
7337       Attrs.push_back(R);
7338   }
7339 
7340   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7341   if (SubStmt.isInvalid())
7342     return StmtError();
7343 
7344   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7345     return S;
7346 
7347   // If transforming the attributes failed for all of the attributes in the
7348   // statement, don't make an AttributedStmt without attributes.
7349   if (Attrs.empty())
7350     return SubStmt;
7351 
7352   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7353                                             SubStmt.get());
7354 }
7355 
7356 template<typename Derived>
7357 StmtResult
7358 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7359   // Transform the initialization statement
7360   StmtResult Init = getDerived().TransformStmt(S->getInit());
7361   if (Init.isInvalid())
7362     return StmtError();
7363 
7364   // Transform the condition
7365   Sema::ConditionResult Cond = getDerived().TransformCondition(
7366       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7367       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7368                        : Sema::ConditionKind::Boolean);
7369   if (Cond.isInvalid())
7370     return StmtError();
7371 
7372   // If this is a constexpr if, determine which arm we should instantiate.
7373   llvm::Optional<bool> ConstexprConditionValue;
7374   if (S->isConstexpr())
7375     ConstexprConditionValue = Cond.getKnownValue();
7376 
7377   // Transform the "then" branch.
7378   StmtResult Then;
7379   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7380     Then = getDerived().TransformStmt(S->getThen());
7381     if (Then.isInvalid())
7382       return StmtError();
7383   } else {
7384     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7385   }
7386 
7387   // Transform the "else" branch.
7388   StmtResult Else;
7389   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7390     Else = getDerived().TransformStmt(S->getElse());
7391     if (Else.isInvalid())
7392       return StmtError();
7393   }
7394 
7395   if (!getDerived().AlwaysRebuild() &&
7396       Init.get() == S->getInit() &&
7397       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7398       Then.get() == S->getThen() &&
7399       Else.get() == S->getElse())
7400     return S;
7401 
7402   return getDerived().RebuildIfStmt(
7403       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7404       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7405 }
7406 
7407 template<typename Derived>
7408 StmtResult
7409 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7410   // Transform the initialization statement
7411   StmtResult Init = getDerived().TransformStmt(S->getInit());
7412   if (Init.isInvalid())
7413     return StmtError();
7414 
7415   // Transform the condition.
7416   Sema::ConditionResult Cond = getDerived().TransformCondition(
7417       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7418       Sema::ConditionKind::Switch);
7419   if (Cond.isInvalid())
7420     return StmtError();
7421 
7422   // Rebuild the switch statement.
7423   StmtResult Switch =
7424       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7425                                           Init.get(), Cond, S->getRParenLoc());
7426   if (Switch.isInvalid())
7427     return StmtError();
7428 
7429   // Transform the body of the switch statement.
7430   StmtResult Body = getDerived().TransformStmt(S->getBody());
7431   if (Body.isInvalid())
7432     return StmtError();
7433 
7434   // Complete the switch statement.
7435   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7436                                             Body.get());
7437 }
7438 
7439 template<typename Derived>
7440 StmtResult
7441 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7442   // Transform the condition
7443   Sema::ConditionResult Cond = getDerived().TransformCondition(
7444       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7445       Sema::ConditionKind::Boolean);
7446   if (Cond.isInvalid())
7447     return StmtError();
7448 
7449   // Transform the body
7450   StmtResult Body = getDerived().TransformStmt(S->getBody());
7451   if (Body.isInvalid())
7452     return StmtError();
7453 
7454   if (!getDerived().AlwaysRebuild() &&
7455       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7456       Body.get() == S->getBody())
7457     return Owned(S);
7458 
7459   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7460                                        Cond, S->getRParenLoc(), Body.get());
7461 }
7462 
7463 template<typename Derived>
7464 StmtResult
7465 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7466   // Transform the body
7467   StmtResult Body = getDerived().TransformStmt(S->getBody());
7468   if (Body.isInvalid())
7469     return StmtError();
7470 
7471   // Transform the condition
7472   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7473   if (Cond.isInvalid())
7474     return StmtError();
7475 
7476   if (!getDerived().AlwaysRebuild() &&
7477       Cond.get() == S->getCond() &&
7478       Body.get() == S->getBody())
7479     return S;
7480 
7481   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7482                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7483                                     S->getRParenLoc());
7484 }
7485 
7486 template<typename Derived>
7487 StmtResult
7488 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7489   if (getSema().getLangOpts().OpenMP)
7490     getSema().startOpenMPLoop();
7491 
7492   // Transform the initialization statement
7493   StmtResult Init = getDerived().TransformStmt(S->getInit());
7494   if (Init.isInvalid())
7495     return StmtError();
7496 
7497   // In OpenMP loop region loop control variable must be captured and be
7498   // private. Perform analysis of first part (if any).
7499   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7500     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7501 
7502   // Transform the condition
7503   Sema::ConditionResult Cond = getDerived().TransformCondition(
7504       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7505       Sema::ConditionKind::Boolean);
7506   if (Cond.isInvalid())
7507     return StmtError();
7508 
7509   // Transform the increment
7510   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7511   if (Inc.isInvalid())
7512     return StmtError();
7513 
7514   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7515   if (S->getInc() && !FullInc.get())
7516     return StmtError();
7517 
7518   // Transform the body
7519   StmtResult Body = getDerived().TransformStmt(S->getBody());
7520   if (Body.isInvalid())
7521     return StmtError();
7522 
7523   if (!getDerived().AlwaysRebuild() &&
7524       Init.get() == S->getInit() &&
7525       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7526       Inc.get() == S->getInc() &&
7527       Body.get() == S->getBody())
7528     return S;
7529 
7530   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7531                                      Init.get(), Cond, FullInc,
7532                                      S->getRParenLoc(), Body.get());
7533 }
7534 
7535 template<typename Derived>
7536 StmtResult
7537 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7538   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7539                                         S->getLabel());
7540   if (!LD)
7541     return StmtError();
7542 
7543   // Goto statements must always be rebuilt, to resolve the label.
7544   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7545                                       cast<LabelDecl>(LD));
7546 }
7547 
7548 template<typename Derived>
7549 StmtResult
7550 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7551   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7552   if (Target.isInvalid())
7553     return StmtError();
7554   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7555 
7556   if (!getDerived().AlwaysRebuild() &&
7557       Target.get() == S->getTarget())
7558     return S;
7559 
7560   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7561                                               Target.get());
7562 }
7563 
7564 template<typename Derived>
7565 StmtResult
7566 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7567   return S;
7568 }
7569 
7570 template<typename Derived>
7571 StmtResult
7572 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7573   return S;
7574 }
7575 
7576 template<typename Derived>
7577 StmtResult
7578 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7579   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7580                                                         /*NotCopyInit*/false);
7581   if (Result.isInvalid())
7582     return StmtError();
7583 
7584   // FIXME: We always rebuild the return statement because there is no way
7585   // to tell whether the return type of the function has changed.
7586   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7587 }
7588 
7589 template<typename Derived>
7590 StmtResult
7591 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7592   bool DeclChanged = false;
7593   SmallVector<Decl *, 4> Decls;
7594   for (auto *D : S->decls()) {
7595     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7596     if (!Transformed)
7597       return StmtError();
7598 
7599     if (Transformed != D)
7600       DeclChanged = true;
7601 
7602     Decls.push_back(Transformed);
7603   }
7604 
7605   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7606     return S;
7607 
7608   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7609 }
7610 
7611 template<typename Derived>
7612 StmtResult
7613 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7614 
7615   SmallVector<Expr*, 8> Constraints;
7616   SmallVector<Expr*, 8> Exprs;
7617   SmallVector<IdentifierInfo *, 4> Names;
7618 
7619   ExprResult AsmString;
7620   SmallVector<Expr*, 8> Clobbers;
7621 
7622   bool ExprsChanged = false;
7623 
7624   // Go through the outputs.
7625   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7626     Names.push_back(S->getOutputIdentifier(I));
7627 
7628     // No need to transform the constraint literal.
7629     Constraints.push_back(S->getOutputConstraintLiteral(I));
7630 
7631     // Transform the output expr.
7632     Expr *OutputExpr = S->getOutputExpr(I);
7633     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7634     if (Result.isInvalid())
7635       return StmtError();
7636 
7637     ExprsChanged |= Result.get() != OutputExpr;
7638 
7639     Exprs.push_back(Result.get());
7640   }
7641 
7642   // Go through the inputs.
7643   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7644     Names.push_back(S->getInputIdentifier(I));
7645 
7646     // No need to transform the constraint literal.
7647     Constraints.push_back(S->getInputConstraintLiteral(I));
7648 
7649     // Transform the input expr.
7650     Expr *InputExpr = S->getInputExpr(I);
7651     ExprResult Result = getDerived().TransformExpr(InputExpr);
7652     if (Result.isInvalid())
7653       return StmtError();
7654 
7655     ExprsChanged |= Result.get() != InputExpr;
7656 
7657     Exprs.push_back(Result.get());
7658   }
7659 
7660   // Go through the Labels.
7661   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7662     Names.push_back(S->getLabelIdentifier(I));
7663 
7664     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7665     if (Result.isInvalid())
7666       return StmtError();
7667     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7668     Exprs.push_back(Result.get());
7669   }
7670   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7671     return S;
7672 
7673   // Go through the clobbers.
7674   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7675     Clobbers.push_back(S->getClobberStringLiteral(I));
7676 
7677   // No need to transform the asm string literal.
7678   AsmString = S->getAsmString();
7679   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7680                                         S->isVolatile(), S->getNumOutputs(),
7681                                         S->getNumInputs(), Names.data(),
7682                                         Constraints, Exprs, AsmString.get(),
7683                                         Clobbers, S->getNumLabels(),
7684                                         S->getRParenLoc());
7685 }
7686 
7687 template<typename Derived>
7688 StmtResult
7689 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7690   ArrayRef<Token> AsmToks =
7691     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7692 
7693   bool HadError = false, HadChange = false;
7694 
7695   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7696   SmallVector<Expr*, 8> TransformedExprs;
7697   TransformedExprs.reserve(SrcExprs.size());
7698   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7699     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7700     if (!Result.isUsable()) {
7701       HadError = true;
7702     } else {
7703       HadChange |= (Result.get() != SrcExprs[i]);
7704       TransformedExprs.push_back(Result.get());
7705     }
7706   }
7707 
7708   if (HadError) return StmtError();
7709   if (!HadChange && !getDerived().AlwaysRebuild())
7710     return Owned(S);
7711 
7712   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7713                                        AsmToks, S->getAsmString(),
7714                                        S->getNumOutputs(), S->getNumInputs(),
7715                                        S->getAllConstraints(), S->getClobbers(),
7716                                        TransformedExprs, S->getEndLoc());
7717 }
7718 
7719 // C++ Coroutines TS
7720 
7721 template<typename Derived>
7722 StmtResult
7723 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7724   auto *ScopeInfo = SemaRef.getCurFunction();
7725   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7726   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7727          ScopeInfo->NeedsCoroutineSuspends &&
7728          ScopeInfo->CoroutineSuspends.first == nullptr &&
7729          ScopeInfo->CoroutineSuspends.second == nullptr &&
7730          "expected clean scope info");
7731 
7732   // Set that we have (possibly-invalid) suspend points before we do anything
7733   // that may fail.
7734   ScopeInfo->setNeedsCoroutineSuspends(false);
7735 
7736   // We re-build the coroutine promise object (and the coroutine parameters its
7737   // type and constructor depend on) based on the types used in our current
7738   // function. We must do so, and set it on the current FunctionScopeInfo,
7739   // before attempting to transform the other parts of the coroutine body
7740   // statement, such as the implicit suspend statements (because those
7741   // statements reference the FunctionScopeInfo::CoroutinePromise).
7742   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7743     return StmtError();
7744   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7745   if (!Promise)
7746     return StmtError();
7747   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7748   ScopeInfo->CoroutinePromise = Promise;
7749 
7750   // Transform the implicit coroutine statements constructed using dependent
7751   // types during the previous parse: initial and final suspensions, the return
7752   // object, and others. We also transform the coroutine function's body.
7753   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7754   if (InitSuspend.isInvalid())
7755     return StmtError();
7756   StmtResult FinalSuspend =
7757       getDerived().TransformStmt(S->getFinalSuspendStmt());
7758   if (FinalSuspend.isInvalid() ||
7759       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7760     return StmtError();
7761   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7762   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7763 
7764   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7765   if (BodyRes.isInvalid())
7766     return StmtError();
7767 
7768   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7769   if (Builder.isInvalid())
7770     return StmtError();
7771 
7772   Expr *ReturnObject = S->getReturnValueInit();
7773   assert(ReturnObject && "the return object is expected to be valid");
7774   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7775                                                      /*NoCopyInit*/ false);
7776   if (Res.isInvalid())
7777     return StmtError();
7778   Builder.ReturnValue = Res.get();
7779 
7780   // If during the previous parse the coroutine still had a dependent promise
7781   // statement, we may need to build some implicit coroutine statements
7782   // (such as exception and fallthrough handlers) for the first time.
7783   if (S->hasDependentPromiseType()) {
7784     // We can only build these statements, however, if the current promise type
7785     // is not dependent.
7786     if (!Promise->getType()->isDependentType()) {
7787       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7788              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7789              "these nodes should not have been built yet");
7790       if (!Builder.buildDependentStatements())
7791         return StmtError();
7792     }
7793   } else {
7794     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7795       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7796       if (Res.isInvalid())
7797         return StmtError();
7798       Builder.OnFallthrough = Res.get();
7799     }
7800 
7801     if (auto *OnException = S->getExceptionHandler()) {
7802       StmtResult Res = getDerived().TransformStmt(OnException);
7803       if (Res.isInvalid())
7804         return StmtError();
7805       Builder.OnException = Res.get();
7806     }
7807 
7808     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7809       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7810       if (Res.isInvalid())
7811         return StmtError();
7812       Builder.ReturnStmtOnAllocFailure = Res.get();
7813     }
7814 
7815     // Transform any additional statements we may have already built
7816     assert(S->getAllocate() && S->getDeallocate() &&
7817            "allocation and deallocation calls must already be built");
7818     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7819     if (AllocRes.isInvalid())
7820       return StmtError();
7821     Builder.Allocate = AllocRes.get();
7822 
7823     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7824     if (DeallocRes.isInvalid())
7825       return StmtError();
7826     Builder.Deallocate = DeallocRes.get();
7827 
7828     assert(S->getResultDecl() && "ResultDecl must already be built");
7829     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7830     if (ResultDecl.isInvalid())
7831       return StmtError();
7832     Builder.ResultDecl = ResultDecl.get();
7833 
7834     if (auto *ReturnStmt = S->getReturnStmt()) {
7835       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7836       if (Res.isInvalid())
7837         return StmtError();
7838       Builder.ReturnStmt = Res.get();
7839     }
7840   }
7841 
7842   return getDerived().RebuildCoroutineBodyStmt(Builder);
7843 }
7844 
7845 template<typename Derived>
7846 StmtResult
7847 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7848   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7849                                                         /*NotCopyInit*/false);
7850   if (Result.isInvalid())
7851     return StmtError();
7852 
7853   // Always rebuild; we don't know if this needs to be injected into a new
7854   // context or if the promise type has changed.
7855   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7856                                           S->isImplicit());
7857 }
7858 
7859 template<typename Derived>
7860 ExprResult
7861 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7862   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7863                                                         /*NotCopyInit*/false);
7864   if (Result.isInvalid())
7865     return ExprError();
7866 
7867   // Always rebuild; we don't know if this needs to be injected into a new
7868   // context or if the promise type has changed.
7869   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7870                                          E->isImplicit());
7871 }
7872 
7873 template <typename Derived>
7874 ExprResult
7875 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7876   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7877                                                         /*NotCopyInit*/ false);
7878   if (OperandResult.isInvalid())
7879     return ExprError();
7880 
7881   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7882           E->getOperatorCoawaitLookup());
7883 
7884   if (LookupResult.isInvalid())
7885     return ExprError();
7886 
7887   // Always rebuild; we don't know if this needs to be injected into a new
7888   // context or if the promise type has changed.
7889   return getDerived().RebuildDependentCoawaitExpr(
7890       E->getKeywordLoc(), OperandResult.get(),
7891       cast<UnresolvedLookupExpr>(LookupResult.get()));
7892 }
7893 
7894 template<typename Derived>
7895 ExprResult
7896 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7897   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7898                                                         /*NotCopyInit*/false);
7899   if (Result.isInvalid())
7900     return ExprError();
7901 
7902   // Always rebuild; we don't know if this needs to be injected into a new
7903   // context or if the promise type has changed.
7904   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7905 }
7906 
7907 // Objective-C Statements.
7908 
7909 template<typename Derived>
7910 StmtResult
7911 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7912   // Transform the body of the @try.
7913   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7914   if (TryBody.isInvalid())
7915     return StmtError();
7916 
7917   // Transform the @catch statements (if present).
7918   bool AnyCatchChanged = false;
7919   SmallVector<Stmt*, 8> CatchStmts;
7920   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7921     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7922     if (Catch.isInvalid())
7923       return StmtError();
7924     if (Catch.get() != S->getCatchStmt(I))
7925       AnyCatchChanged = true;
7926     CatchStmts.push_back(Catch.get());
7927   }
7928 
7929   // Transform the @finally statement (if present).
7930   StmtResult Finally;
7931   if (S->getFinallyStmt()) {
7932     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7933     if (Finally.isInvalid())
7934       return StmtError();
7935   }
7936 
7937   // If nothing changed, just retain this statement.
7938   if (!getDerived().AlwaysRebuild() &&
7939       TryBody.get() == S->getTryBody() &&
7940       !AnyCatchChanged &&
7941       Finally.get() == S->getFinallyStmt())
7942     return S;
7943 
7944   // Build a new statement.
7945   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7946                                            CatchStmts, Finally.get());
7947 }
7948 
7949 template<typename Derived>
7950 StmtResult
7951 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7952   // Transform the @catch parameter, if there is one.
7953   VarDecl *Var = nullptr;
7954   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7955     TypeSourceInfo *TSInfo = nullptr;
7956     if (FromVar->getTypeSourceInfo()) {
7957       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7958       if (!TSInfo)
7959         return StmtError();
7960     }
7961 
7962     QualType T;
7963     if (TSInfo)
7964       T = TSInfo->getType();
7965     else {
7966       T = getDerived().TransformType(FromVar->getType());
7967       if (T.isNull())
7968         return StmtError();
7969     }
7970 
7971     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7972     if (!Var)
7973       return StmtError();
7974   }
7975 
7976   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7977   if (Body.isInvalid())
7978     return StmtError();
7979 
7980   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7981                                              S->getRParenLoc(),
7982                                              Var, Body.get());
7983 }
7984 
7985 template<typename Derived>
7986 StmtResult
7987 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7988   // Transform the body.
7989   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7990   if (Body.isInvalid())
7991     return StmtError();
7992 
7993   // If nothing changed, just retain this statement.
7994   if (!getDerived().AlwaysRebuild() &&
7995       Body.get() == S->getFinallyBody())
7996     return S;
7997 
7998   // Build a new statement.
7999   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
8000                                                Body.get());
8001 }
8002 
8003 template<typename Derived>
8004 StmtResult
8005 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
8006   ExprResult Operand;
8007   if (S->getThrowExpr()) {
8008     Operand = getDerived().TransformExpr(S->getThrowExpr());
8009     if (Operand.isInvalid())
8010       return StmtError();
8011   }
8012 
8013   if (!getDerived().AlwaysRebuild() &&
8014       Operand.get() == S->getThrowExpr())
8015     return S;
8016 
8017   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
8018 }
8019 
8020 template<typename Derived>
8021 StmtResult
8022 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
8023                                                   ObjCAtSynchronizedStmt *S) {
8024   // Transform the object we are locking.
8025   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
8026   if (Object.isInvalid())
8027     return StmtError();
8028   Object =
8029     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
8030                                                   Object.get());
8031   if (Object.isInvalid())
8032     return StmtError();
8033 
8034   // Transform the body.
8035   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
8036   if (Body.isInvalid())
8037     return StmtError();
8038 
8039   // If nothing change, just retain the current statement.
8040   if (!getDerived().AlwaysRebuild() &&
8041       Object.get() == S->getSynchExpr() &&
8042       Body.get() == S->getSynchBody())
8043     return S;
8044 
8045   // Build a new statement.
8046   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
8047                                                     Object.get(), Body.get());
8048 }
8049 
8050 template<typename Derived>
8051 StmtResult
8052 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8053                                               ObjCAutoreleasePoolStmt *S) {
8054   // Transform the body.
8055   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8056   if (Body.isInvalid())
8057     return StmtError();
8058 
8059   // If nothing changed, just retain this statement.
8060   if (!getDerived().AlwaysRebuild() &&
8061       Body.get() == S->getSubStmt())
8062     return S;
8063 
8064   // Build a new statement.
8065   return getDerived().RebuildObjCAutoreleasePoolStmt(
8066                         S->getAtLoc(), Body.get());
8067 }
8068 
8069 template<typename Derived>
8070 StmtResult
8071 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8072                                                   ObjCForCollectionStmt *S) {
8073   // Transform the element statement.
8074   StmtResult Element =
8075       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8076   if (Element.isInvalid())
8077     return StmtError();
8078 
8079   // Transform the collection expression.
8080   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8081   if (Collection.isInvalid())
8082     return StmtError();
8083 
8084   // Transform the body.
8085   StmtResult Body = getDerived().TransformStmt(S->getBody());
8086   if (Body.isInvalid())
8087     return StmtError();
8088 
8089   // If nothing changed, just retain this statement.
8090   if (!getDerived().AlwaysRebuild() &&
8091       Element.get() == S->getElement() &&
8092       Collection.get() == S->getCollection() &&
8093       Body.get() == S->getBody())
8094     return S;
8095 
8096   // Build a new statement.
8097   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8098                                                    Element.get(),
8099                                                    Collection.get(),
8100                                                    S->getRParenLoc(),
8101                                                    Body.get());
8102 }
8103 
8104 template <typename Derived>
8105 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8106   // Transform the exception declaration, if any.
8107   VarDecl *Var = nullptr;
8108   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8109     TypeSourceInfo *T =
8110         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8111     if (!T)
8112       return StmtError();
8113 
8114     Var = getDerived().RebuildExceptionDecl(
8115         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8116         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8117     if (!Var || Var->isInvalidDecl())
8118       return StmtError();
8119   }
8120 
8121   // Transform the actual exception handler.
8122   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8123   if (Handler.isInvalid())
8124     return StmtError();
8125 
8126   if (!getDerived().AlwaysRebuild() && !Var &&
8127       Handler.get() == S->getHandlerBlock())
8128     return S;
8129 
8130   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8131 }
8132 
8133 template <typename Derived>
8134 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8135   // Transform the try block itself.
8136   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8137   if (TryBlock.isInvalid())
8138     return StmtError();
8139 
8140   // Transform the handlers.
8141   bool HandlerChanged = false;
8142   SmallVector<Stmt *, 8> Handlers;
8143   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8144     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8145     if (Handler.isInvalid())
8146       return StmtError();
8147 
8148     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8149     Handlers.push_back(Handler.getAs<Stmt>());
8150   }
8151 
8152   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8153       !HandlerChanged)
8154     return S;
8155 
8156   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8157                                         Handlers);
8158 }
8159 
8160 template<typename Derived>
8161 StmtResult
8162 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8163   StmtResult Init =
8164       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8165   if (Init.isInvalid())
8166     return StmtError();
8167 
8168   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8169   if (Range.isInvalid())
8170     return StmtError();
8171 
8172   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8173   if (Begin.isInvalid())
8174     return StmtError();
8175   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8176   if (End.isInvalid())
8177     return StmtError();
8178 
8179   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8180   if (Cond.isInvalid())
8181     return StmtError();
8182   if (Cond.get())
8183     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8184   if (Cond.isInvalid())
8185     return StmtError();
8186   if (Cond.get())
8187     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8188 
8189   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8190   if (Inc.isInvalid())
8191     return StmtError();
8192   if (Inc.get())
8193     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8194 
8195   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8196   if (LoopVar.isInvalid())
8197     return StmtError();
8198 
8199   StmtResult NewStmt = S;
8200   if (getDerived().AlwaysRebuild() ||
8201       Init.get() != S->getInit() ||
8202       Range.get() != S->getRangeStmt() ||
8203       Begin.get() != S->getBeginStmt() ||
8204       End.get() != S->getEndStmt() ||
8205       Cond.get() != S->getCond() ||
8206       Inc.get() != S->getInc() ||
8207       LoopVar.get() != S->getLoopVarStmt()) {
8208     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8209                                                   S->getCoawaitLoc(), Init.get(),
8210                                                   S->getColonLoc(), Range.get(),
8211                                                   Begin.get(), End.get(),
8212                                                   Cond.get(),
8213                                                   Inc.get(), LoopVar.get(),
8214                                                   S->getRParenLoc());
8215     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8216       // Might not have attached any initializer to the loop variable.
8217       getSema().ActOnInitializerError(
8218           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8219       return StmtError();
8220     }
8221   }
8222 
8223   StmtResult Body = getDerived().TransformStmt(S->getBody());
8224   if (Body.isInvalid())
8225     return StmtError();
8226 
8227   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8228   // it now so we have a new statement to attach the body to.
8229   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8230     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8231                                                   S->getCoawaitLoc(), Init.get(),
8232                                                   S->getColonLoc(), Range.get(),
8233                                                   Begin.get(), End.get(),
8234                                                   Cond.get(),
8235                                                   Inc.get(), LoopVar.get(),
8236                                                   S->getRParenLoc());
8237     if (NewStmt.isInvalid())
8238       return StmtError();
8239   }
8240 
8241   if (NewStmt.get() == S)
8242     return S;
8243 
8244   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8245 }
8246 
8247 template<typename Derived>
8248 StmtResult
8249 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8250                                                     MSDependentExistsStmt *S) {
8251   // Transform the nested-name-specifier, if any.
8252   NestedNameSpecifierLoc QualifierLoc;
8253   if (S->getQualifierLoc()) {
8254     QualifierLoc
8255       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8256     if (!QualifierLoc)
8257       return StmtError();
8258   }
8259 
8260   // Transform the declaration name.
8261   DeclarationNameInfo NameInfo = S->getNameInfo();
8262   if (NameInfo.getName()) {
8263     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8264     if (!NameInfo.getName())
8265       return StmtError();
8266   }
8267 
8268   // Check whether anything changed.
8269   if (!getDerived().AlwaysRebuild() &&
8270       QualifierLoc == S->getQualifierLoc() &&
8271       NameInfo.getName() == S->getNameInfo().getName())
8272     return S;
8273 
8274   // Determine whether this name exists, if we can.
8275   CXXScopeSpec SS;
8276   SS.Adopt(QualifierLoc);
8277   bool Dependent = false;
8278   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8279   case Sema::IER_Exists:
8280     if (S->isIfExists())
8281       break;
8282 
8283     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8284 
8285   case Sema::IER_DoesNotExist:
8286     if (S->isIfNotExists())
8287       break;
8288 
8289     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8290 
8291   case Sema::IER_Dependent:
8292     Dependent = true;
8293     break;
8294 
8295   case Sema::IER_Error:
8296     return StmtError();
8297   }
8298 
8299   // We need to continue with the instantiation, so do so now.
8300   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8301   if (SubStmt.isInvalid())
8302     return StmtError();
8303 
8304   // If we have resolved the name, just transform to the substatement.
8305   if (!Dependent)
8306     return SubStmt;
8307 
8308   // The name is still dependent, so build a dependent expression again.
8309   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8310                                                    S->isIfExists(),
8311                                                    QualifierLoc,
8312                                                    NameInfo,
8313                                                    SubStmt.get());
8314 }
8315 
8316 template<typename Derived>
8317 ExprResult
8318 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8319   NestedNameSpecifierLoc QualifierLoc;
8320   if (E->getQualifierLoc()) {
8321     QualifierLoc
8322     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8323     if (!QualifierLoc)
8324       return ExprError();
8325   }
8326 
8327   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8328     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8329   if (!PD)
8330     return ExprError();
8331 
8332   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8333   if (Base.isInvalid())
8334     return ExprError();
8335 
8336   return new (SemaRef.getASTContext())
8337       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8338                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8339                         QualifierLoc, E->getMemberLoc());
8340 }
8341 
8342 template <typename Derived>
8343 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8344     MSPropertySubscriptExpr *E) {
8345   auto BaseRes = getDerived().TransformExpr(E->getBase());
8346   if (BaseRes.isInvalid())
8347     return ExprError();
8348   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8349   if (IdxRes.isInvalid())
8350     return ExprError();
8351 
8352   if (!getDerived().AlwaysRebuild() &&
8353       BaseRes.get() == E->getBase() &&
8354       IdxRes.get() == E->getIdx())
8355     return E;
8356 
8357   return getDerived().RebuildArraySubscriptExpr(
8358       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8359 }
8360 
8361 template <typename Derived>
8362 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8363   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8364   if (TryBlock.isInvalid())
8365     return StmtError();
8366 
8367   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8368   if (Handler.isInvalid())
8369     return StmtError();
8370 
8371   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8372       Handler.get() == S->getHandler())
8373     return S;
8374 
8375   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8376                                         TryBlock.get(), Handler.get());
8377 }
8378 
8379 template <typename Derived>
8380 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8381   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8382   if (Block.isInvalid())
8383     return StmtError();
8384 
8385   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8386 }
8387 
8388 template <typename Derived>
8389 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8390   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8391   if (FilterExpr.isInvalid())
8392     return StmtError();
8393 
8394   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8395   if (Block.isInvalid())
8396     return StmtError();
8397 
8398   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8399                                            Block.get());
8400 }
8401 
8402 template <typename Derived>
8403 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8404   if (isa<SEHFinallyStmt>(Handler))
8405     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8406   else
8407     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8408 }
8409 
8410 template<typename Derived>
8411 StmtResult
8412 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8413   return S;
8414 }
8415 
8416 //===----------------------------------------------------------------------===//
8417 // OpenMP directive transformation
8418 //===----------------------------------------------------------------------===//
8419 
8420 template <typename Derived>
8421 StmtResult
8422 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8423   // OMPCanonicalLoops are eliminated during transformation, since they will be
8424   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8425   // after transformation.
8426   return getDerived().TransformStmt(L->getLoopStmt());
8427 }
8428 
8429 template <typename Derived>
8430 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8431     OMPExecutableDirective *D) {
8432 
8433   // Transform the clauses
8434   llvm::SmallVector<OMPClause *, 16> TClauses;
8435   ArrayRef<OMPClause *> Clauses = D->clauses();
8436   TClauses.reserve(Clauses.size());
8437   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8438        I != E; ++I) {
8439     if (*I) {
8440       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8441       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8442       getDerived().getSema().EndOpenMPClause();
8443       if (Clause)
8444         TClauses.push_back(Clause);
8445     } else {
8446       TClauses.push_back(nullptr);
8447     }
8448   }
8449   StmtResult AssociatedStmt;
8450   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8451     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8452                                                   /*CurScope=*/nullptr);
8453     StmtResult Body;
8454     {
8455       Sema::CompoundScopeRAII CompoundScope(getSema());
8456       Stmt *CS;
8457       if (D->getDirectiveKind() == OMPD_atomic ||
8458           D->getDirectiveKind() == OMPD_critical ||
8459           D->getDirectiveKind() == OMPD_section ||
8460           D->getDirectiveKind() == OMPD_master)
8461         CS = D->getAssociatedStmt();
8462       else
8463         CS = D->getRawStmt();
8464       Body = getDerived().TransformStmt(CS);
8465       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8466           getSema().getLangOpts().OpenMPIRBuilder)
8467         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8468     }
8469     AssociatedStmt =
8470         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8471     if (AssociatedStmt.isInvalid()) {
8472       return StmtError();
8473     }
8474   }
8475   if (TClauses.size() != Clauses.size()) {
8476     return StmtError();
8477   }
8478 
8479   // Transform directive name for 'omp critical' directive.
8480   DeclarationNameInfo DirName;
8481   if (D->getDirectiveKind() == OMPD_critical) {
8482     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8483     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8484   }
8485   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8486   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8487     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8488   } else if (D->getDirectiveKind() == OMPD_cancel) {
8489     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8490   }
8491 
8492   return getDerived().RebuildOMPExecutableDirective(
8493       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8494       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8495 }
8496 
8497 template <typename Derived>
8498 StmtResult
8499 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8500   DeclarationNameInfo DirName;
8501   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8502                                              D->getBeginLoc());
8503   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8504   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8505   return Res;
8506 }
8507 
8508 template <typename Derived>
8509 StmtResult
8510 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8511   DeclarationNameInfo DirName;
8512   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8513                                              D->getBeginLoc());
8514   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8515   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8516   return Res;
8517 }
8518 
8519 template <typename Derived>
8520 StmtResult
8521 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8522   DeclarationNameInfo DirName;
8523   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8524                                              nullptr, D->getBeginLoc());
8525   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8526   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8527   return Res;
8528 }
8529 
8530 template <typename Derived>
8531 StmtResult
8532 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8533   DeclarationNameInfo DirName;
8534   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8535                                              D->getBeginLoc());
8536   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8537   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8538   return Res;
8539 }
8540 
8541 template <typename Derived>
8542 StmtResult
8543 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8544   DeclarationNameInfo DirName;
8545   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8546                                              D->getBeginLoc());
8547   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8548   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8549   return Res;
8550 }
8551 
8552 template <typename Derived>
8553 StmtResult
8554 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8555   DeclarationNameInfo DirName;
8556   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8557                                              D->getBeginLoc());
8558   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8559   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8560   return Res;
8561 }
8562 
8563 template <typename Derived>
8564 StmtResult
8565 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8566   DeclarationNameInfo DirName;
8567   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8568                                              D->getBeginLoc());
8569   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8570   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8571   return Res;
8572 }
8573 
8574 template <typename Derived>
8575 StmtResult
8576 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8577   DeclarationNameInfo DirName;
8578   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8579                                              D->getBeginLoc());
8580   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8581   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8582   return Res;
8583 }
8584 
8585 template <typename Derived>
8586 StmtResult
8587 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8588   DeclarationNameInfo DirName;
8589   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8590                                              D->getBeginLoc());
8591   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8592   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8593   return Res;
8594 }
8595 
8596 template <typename Derived>
8597 StmtResult
8598 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8599   getDerived().getSema().StartOpenMPDSABlock(
8600       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8601   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8602   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8603   return Res;
8604 }
8605 
8606 template <typename Derived>
8607 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8608     OMPParallelForDirective *D) {
8609   DeclarationNameInfo DirName;
8610   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8611                                              nullptr, D->getBeginLoc());
8612   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8613   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8614   return Res;
8615 }
8616 
8617 template <typename Derived>
8618 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8619     OMPParallelForSimdDirective *D) {
8620   DeclarationNameInfo DirName;
8621   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8622                                              nullptr, D->getBeginLoc());
8623   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8624   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8625   return Res;
8626 }
8627 
8628 template <typename Derived>
8629 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8630     OMPParallelMasterDirective *D) {
8631   DeclarationNameInfo DirName;
8632   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8633                                              nullptr, D->getBeginLoc());
8634   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8635   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8636   return Res;
8637 }
8638 
8639 template <typename Derived>
8640 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8641     OMPParallelSectionsDirective *D) {
8642   DeclarationNameInfo DirName;
8643   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8644                                              nullptr, D->getBeginLoc());
8645   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8646   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8647   return Res;
8648 }
8649 
8650 template <typename Derived>
8651 StmtResult
8652 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8653   DeclarationNameInfo DirName;
8654   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8655                                              D->getBeginLoc());
8656   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8657   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8658   return Res;
8659 }
8660 
8661 template <typename Derived>
8662 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8663     OMPTaskyieldDirective *D) {
8664   DeclarationNameInfo DirName;
8665   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8666                                              D->getBeginLoc());
8667   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8668   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8669   return Res;
8670 }
8671 
8672 template <typename Derived>
8673 StmtResult
8674 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8675   DeclarationNameInfo DirName;
8676   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8677                                              D->getBeginLoc());
8678   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8679   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8680   return Res;
8681 }
8682 
8683 template <typename Derived>
8684 StmtResult
8685 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8686   DeclarationNameInfo DirName;
8687   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8688                                              D->getBeginLoc());
8689   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8690   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8691   return Res;
8692 }
8693 
8694 template <typename Derived>
8695 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8696     OMPTaskgroupDirective *D) {
8697   DeclarationNameInfo DirName;
8698   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8699                                              D->getBeginLoc());
8700   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8701   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8702   return Res;
8703 }
8704 
8705 template <typename Derived>
8706 StmtResult
8707 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8708   DeclarationNameInfo DirName;
8709   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8710                                              D->getBeginLoc());
8711   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8712   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8713   return Res;
8714 }
8715 
8716 template <typename Derived>
8717 StmtResult
8718 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8719   DeclarationNameInfo DirName;
8720   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8721                                              D->getBeginLoc());
8722   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8723   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8724   return Res;
8725 }
8726 
8727 template <typename Derived>
8728 StmtResult
8729 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8730   DeclarationNameInfo DirName;
8731   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8732                                              D->getBeginLoc());
8733   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8734   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8735   return Res;
8736 }
8737 
8738 template <typename Derived>
8739 StmtResult
8740 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8741   DeclarationNameInfo DirName;
8742   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8743                                              D->getBeginLoc());
8744   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8745   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8746   return Res;
8747 }
8748 
8749 template <typename Derived>
8750 StmtResult
8751 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8752   DeclarationNameInfo DirName;
8753   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8754                                              D->getBeginLoc());
8755   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8756   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8757   return Res;
8758 }
8759 
8760 template <typename Derived>
8761 StmtResult
8762 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8763   DeclarationNameInfo DirName;
8764   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8765                                              D->getBeginLoc());
8766   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8767   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8768   return Res;
8769 }
8770 
8771 template <typename Derived>
8772 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8773     OMPTargetDataDirective *D) {
8774   DeclarationNameInfo DirName;
8775   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8776                                              D->getBeginLoc());
8777   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8778   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8779   return Res;
8780 }
8781 
8782 template <typename Derived>
8783 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8784     OMPTargetEnterDataDirective *D) {
8785   DeclarationNameInfo DirName;
8786   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8787                                              nullptr, D->getBeginLoc());
8788   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8789   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8790   return Res;
8791 }
8792 
8793 template <typename Derived>
8794 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8795     OMPTargetExitDataDirective *D) {
8796   DeclarationNameInfo DirName;
8797   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8798                                              nullptr, D->getBeginLoc());
8799   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8800   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8801   return Res;
8802 }
8803 
8804 template <typename Derived>
8805 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8806     OMPTargetParallelDirective *D) {
8807   DeclarationNameInfo DirName;
8808   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8809                                              nullptr, D->getBeginLoc());
8810   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8811   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8812   return Res;
8813 }
8814 
8815 template <typename Derived>
8816 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8817     OMPTargetParallelForDirective *D) {
8818   DeclarationNameInfo DirName;
8819   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8820                                              nullptr, D->getBeginLoc());
8821   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8822   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8823   return Res;
8824 }
8825 
8826 template <typename Derived>
8827 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8828     OMPTargetUpdateDirective *D) {
8829   DeclarationNameInfo DirName;
8830   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8831                                              nullptr, D->getBeginLoc());
8832   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8833   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8834   return Res;
8835 }
8836 
8837 template <typename Derived>
8838 StmtResult
8839 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8840   DeclarationNameInfo DirName;
8841   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8842                                              D->getBeginLoc());
8843   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8844   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8845   return Res;
8846 }
8847 
8848 template <typename Derived>
8849 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8850     OMPCancellationPointDirective *D) {
8851   DeclarationNameInfo DirName;
8852   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8853                                              nullptr, D->getBeginLoc());
8854   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8855   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8856   return Res;
8857 }
8858 
8859 template <typename Derived>
8860 StmtResult
8861 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8862   DeclarationNameInfo DirName;
8863   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8864                                              D->getBeginLoc());
8865   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8866   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8867   return Res;
8868 }
8869 
8870 template <typename Derived>
8871 StmtResult
8872 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8873   DeclarationNameInfo DirName;
8874   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8875                                              D->getBeginLoc());
8876   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8877   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8878   return Res;
8879 }
8880 
8881 template <typename Derived>
8882 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8883     OMPTaskLoopSimdDirective *D) {
8884   DeclarationNameInfo DirName;
8885   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8886                                              nullptr, D->getBeginLoc());
8887   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8888   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8889   return Res;
8890 }
8891 
8892 template <typename Derived>
8893 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8894     OMPMasterTaskLoopDirective *D) {
8895   DeclarationNameInfo DirName;
8896   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8897                                              nullptr, D->getBeginLoc());
8898   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8899   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8900   return Res;
8901 }
8902 
8903 template <typename Derived>
8904 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8905     OMPMasterTaskLoopSimdDirective *D) {
8906   DeclarationNameInfo DirName;
8907   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8908                                              nullptr, D->getBeginLoc());
8909   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8910   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8911   return Res;
8912 }
8913 
8914 template <typename Derived>
8915 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8916     OMPParallelMasterTaskLoopDirective *D) {
8917   DeclarationNameInfo DirName;
8918   getDerived().getSema().StartOpenMPDSABlock(
8919       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8920   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8921   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8922   return Res;
8923 }
8924 
8925 template <typename Derived>
8926 StmtResult
8927 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8928     OMPParallelMasterTaskLoopSimdDirective *D) {
8929   DeclarationNameInfo DirName;
8930   getDerived().getSema().StartOpenMPDSABlock(
8931       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8932   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8933   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8934   return Res;
8935 }
8936 
8937 template <typename Derived>
8938 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8939     OMPDistributeDirective *D) {
8940   DeclarationNameInfo DirName;
8941   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8942                                              D->getBeginLoc());
8943   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8944   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8945   return Res;
8946 }
8947 
8948 template <typename Derived>
8949 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8950     OMPDistributeParallelForDirective *D) {
8951   DeclarationNameInfo DirName;
8952   getDerived().getSema().StartOpenMPDSABlock(
8953       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8954   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8955   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8956   return Res;
8957 }
8958 
8959 template <typename Derived>
8960 StmtResult
8961 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8962     OMPDistributeParallelForSimdDirective *D) {
8963   DeclarationNameInfo DirName;
8964   getDerived().getSema().StartOpenMPDSABlock(
8965       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8966   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8967   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8968   return Res;
8969 }
8970 
8971 template <typename Derived>
8972 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8973     OMPDistributeSimdDirective *D) {
8974   DeclarationNameInfo DirName;
8975   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8976                                              nullptr, D->getBeginLoc());
8977   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8978   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8979   return Res;
8980 }
8981 
8982 template <typename Derived>
8983 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8984     OMPTargetParallelForSimdDirective *D) {
8985   DeclarationNameInfo DirName;
8986   getDerived().getSema().StartOpenMPDSABlock(
8987       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8988   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8989   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8990   return Res;
8991 }
8992 
8993 template <typename Derived>
8994 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8995     OMPTargetSimdDirective *D) {
8996   DeclarationNameInfo DirName;
8997   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8998                                              D->getBeginLoc());
8999   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9000   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9001   return Res;
9002 }
9003 
9004 template <typename Derived>
9005 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
9006     OMPTeamsDistributeDirective *D) {
9007   DeclarationNameInfo DirName;
9008   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
9009                                              nullptr, D->getBeginLoc());
9010   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9011   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9012   return Res;
9013 }
9014 
9015 template <typename Derived>
9016 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
9017     OMPTeamsDistributeSimdDirective *D) {
9018   DeclarationNameInfo DirName;
9019   getDerived().getSema().StartOpenMPDSABlock(
9020       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9021   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9022   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9023   return Res;
9024 }
9025 
9026 template <typename Derived>
9027 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
9028     OMPTeamsDistributeParallelForSimdDirective *D) {
9029   DeclarationNameInfo DirName;
9030   getDerived().getSema().StartOpenMPDSABlock(
9031       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
9032       D->getBeginLoc());
9033   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9034   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9035   return Res;
9036 }
9037 
9038 template <typename Derived>
9039 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
9040     OMPTeamsDistributeParallelForDirective *D) {
9041   DeclarationNameInfo DirName;
9042   getDerived().getSema().StartOpenMPDSABlock(
9043       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
9044   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9045   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9046   return Res;
9047 }
9048 
9049 template <typename Derived>
9050 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9051     OMPTargetTeamsDirective *D) {
9052   DeclarationNameInfo DirName;
9053   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9054                                              nullptr, D->getBeginLoc());
9055   auto Res = getDerived().TransformOMPExecutableDirective(D);
9056   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9057   return Res;
9058 }
9059 
9060 template <typename Derived>
9061 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9062     OMPTargetTeamsDistributeDirective *D) {
9063   DeclarationNameInfo DirName;
9064   getDerived().getSema().StartOpenMPDSABlock(
9065       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9066   auto Res = getDerived().TransformOMPExecutableDirective(D);
9067   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9068   return Res;
9069 }
9070 
9071 template <typename Derived>
9072 StmtResult
9073 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9074     OMPTargetTeamsDistributeParallelForDirective *D) {
9075   DeclarationNameInfo DirName;
9076   getDerived().getSema().StartOpenMPDSABlock(
9077       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9078       D->getBeginLoc());
9079   auto Res = getDerived().TransformOMPExecutableDirective(D);
9080   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9081   return Res;
9082 }
9083 
9084 template <typename Derived>
9085 StmtResult TreeTransform<Derived>::
9086     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9087         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9088   DeclarationNameInfo DirName;
9089   getDerived().getSema().StartOpenMPDSABlock(
9090       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9091       D->getBeginLoc());
9092   auto Res = getDerived().TransformOMPExecutableDirective(D);
9093   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9094   return Res;
9095 }
9096 
9097 template <typename Derived>
9098 StmtResult
9099 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9100     OMPTargetTeamsDistributeSimdDirective *D) {
9101   DeclarationNameInfo DirName;
9102   getDerived().getSema().StartOpenMPDSABlock(
9103       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9104   auto Res = getDerived().TransformOMPExecutableDirective(D);
9105   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9106   return Res;
9107 }
9108 
9109 template <typename Derived>
9110 StmtResult
9111 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9112   DeclarationNameInfo DirName;
9113   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9114                                              D->getBeginLoc());
9115   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9116   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9117   return Res;
9118 }
9119 
9120 template <typename Derived>
9121 StmtResult
9122 TreeTransform<Derived>::TransformOMPDispatchDirective(OMPDispatchDirective *D) {
9123   DeclarationNameInfo DirName;
9124   getDerived().getSema().StartOpenMPDSABlock(OMPD_dispatch, DirName, nullptr,
9125                                              D->getBeginLoc());
9126   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9127   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9128   return Res;
9129 }
9130 
9131 template <typename Derived>
9132 StmtResult
9133 TreeTransform<Derived>::TransformOMPMaskedDirective(OMPMaskedDirective *D) {
9134   DeclarationNameInfo DirName;
9135   getDerived().getSema().StartOpenMPDSABlock(OMPD_masked, DirName, nullptr,
9136                                              D->getBeginLoc());
9137   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9138   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9139   return Res;
9140 }
9141 
9142 //===----------------------------------------------------------------------===//
9143 // OpenMP clause transformation
9144 //===----------------------------------------------------------------------===//
9145 template <typename Derived>
9146 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9147   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9148   if (Cond.isInvalid())
9149     return nullptr;
9150   return getDerived().RebuildOMPIfClause(
9151       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9152       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9153 }
9154 
9155 template <typename Derived>
9156 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9157   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9158   if (Cond.isInvalid())
9159     return nullptr;
9160   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9161                                             C->getLParenLoc(), C->getEndLoc());
9162 }
9163 
9164 template <typename Derived>
9165 OMPClause *
9166 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9167   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9168   if (NumThreads.isInvalid())
9169     return nullptr;
9170   return getDerived().RebuildOMPNumThreadsClause(
9171       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9172 }
9173 
9174 template <typename Derived>
9175 OMPClause *
9176 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9177   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9178   if (E.isInvalid())
9179     return nullptr;
9180   return getDerived().RebuildOMPSafelenClause(
9181       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9182 }
9183 
9184 template <typename Derived>
9185 OMPClause *
9186 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9187   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9188   if (E.isInvalid())
9189     return nullptr;
9190   return getDerived().RebuildOMPAllocatorClause(
9191       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9192 }
9193 
9194 template <typename Derived>
9195 OMPClause *
9196 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9197   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9198   if (E.isInvalid())
9199     return nullptr;
9200   return getDerived().RebuildOMPSimdlenClause(
9201       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9202 }
9203 
9204 template <typename Derived>
9205 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9206   SmallVector<Expr *, 4> TransformedSizes;
9207   TransformedSizes.reserve(C->getNumSizes());
9208   bool Changed = false;
9209   for (Expr *E : C->getSizesRefs()) {
9210     if (!E) {
9211       TransformedSizes.push_back(nullptr);
9212       continue;
9213     }
9214 
9215     ExprResult T = getDerived().TransformExpr(E);
9216     if (T.isInvalid())
9217       return nullptr;
9218     if (E != T.get())
9219       Changed = true;
9220     TransformedSizes.push_back(T.get());
9221   }
9222 
9223   if (!Changed && !getDerived().AlwaysRebuild())
9224     return C;
9225   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9226                                C->getLParenLoc(), C->getEndLoc());
9227 }
9228 
9229 template <typename Derived>
9230 OMPClause *
9231 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9232   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9233   if (E.isInvalid())
9234     return nullptr;
9235   return getDerived().RebuildOMPCollapseClause(
9236       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9237 }
9238 
9239 template <typename Derived>
9240 OMPClause *
9241 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9242   return getDerived().RebuildOMPDefaultClause(
9243       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9244       C->getLParenLoc(), C->getEndLoc());
9245 }
9246 
9247 template <typename Derived>
9248 OMPClause *
9249 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9250   return getDerived().RebuildOMPProcBindClause(
9251       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9252       C->getLParenLoc(), C->getEndLoc());
9253 }
9254 
9255 template <typename Derived>
9256 OMPClause *
9257 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9258   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9259   if (E.isInvalid())
9260     return nullptr;
9261   return getDerived().RebuildOMPScheduleClause(
9262       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9263       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9264       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9265       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9266 }
9267 
9268 template <typename Derived>
9269 OMPClause *
9270 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9271   ExprResult E;
9272   if (auto *Num = C->getNumForLoops()) {
9273     E = getDerived().TransformExpr(Num);
9274     if (E.isInvalid())
9275       return nullptr;
9276   }
9277   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9278                                               C->getLParenLoc(), E.get());
9279 }
9280 
9281 template <typename Derived>
9282 OMPClause *
9283 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9284   ExprResult E;
9285   if (Expr *Evt = C->getEventHandler()) {
9286     E = getDerived().TransformExpr(Evt);
9287     if (E.isInvalid())
9288       return nullptr;
9289   }
9290   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9291                                              C->getLParenLoc(), C->getEndLoc());
9292 }
9293 
9294 template <typename Derived>
9295 OMPClause *
9296 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9297   // No need to rebuild this clause, no template-dependent parameters.
9298   return C;
9299 }
9300 
9301 template <typename Derived>
9302 OMPClause *
9303 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9304   // No need to rebuild this clause, no template-dependent parameters.
9305   return C;
9306 }
9307 
9308 template <typename Derived>
9309 OMPClause *
9310 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9311   // No need to rebuild this clause, no template-dependent parameters.
9312   return C;
9313 }
9314 
9315 template <typename Derived>
9316 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9317   // No need to rebuild this clause, no template-dependent parameters.
9318   return C;
9319 }
9320 
9321 template <typename Derived>
9322 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9323   // No need to rebuild this clause, no template-dependent parameters.
9324   return C;
9325 }
9326 
9327 template <typename Derived>
9328 OMPClause *
9329 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9330   // No need to rebuild this clause, no template-dependent parameters.
9331   return C;
9332 }
9333 
9334 template <typename Derived>
9335 OMPClause *
9336 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9337   // No need to rebuild this clause, no template-dependent parameters.
9338   return C;
9339 }
9340 
9341 template <typename Derived>
9342 OMPClause *
9343 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9344   // No need to rebuild this clause, no template-dependent parameters.
9345   return C;
9346 }
9347 
9348 template <typename Derived>
9349 OMPClause *
9350 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9351   // No need to rebuild this clause, no template-dependent parameters.
9352   return C;
9353 }
9354 
9355 template <typename Derived>
9356 OMPClause *
9357 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9358   // No need to rebuild this clause, no template-dependent parameters.
9359   return C;
9360 }
9361 
9362 template <typename Derived>
9363 OMPClause *
9364 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9365   // No need to rebuild this clause, no template-dependent parameters.
9366   return C;
9367 }
9368 
9369 template <typename Derived>
9370 OMPClause *
9371 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9372   // No need to rebuild this clause, no template-dependent parameters.
9373   return C;
9374 }
9375 
9376 template <typename Derived>
9377 OMPClause *
9378 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9379   // No need to rebuild this clause, no template-dependent parameters.
9380   return C;
9381 }
9382 
9383 template <typename Derived>
9384 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9385   // No need to rebuild this clause, no template-dependent parameters.
9386   return C;
9387 }
9388 
9389 template <typename Derived>
9390 OMPClause *
9391 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9392   // No need to rebuild this clause, no template-dependent parameters.
9393   return C;
9394 }
9395 
9396 template <typename Derived>
9397 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9398   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9399   if (IVR.isInvalid())
9400     return nullptr;
9401 
9402   llvm::SmallVector<Expr *, 8> PrefExprs;
9403   PrefExprs.reserve(C->varlist_size() - 1);
9404   for (Expr *E : llvm::drop_begin(C->varlists())) {
9405     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9406     if (ER.isInvalid())
9407       return nullptr;
9408     PrefExprs.push_back(ER.get());
9409   }
9410   return getDerived().RebuildOMPInitClause(
9411       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9412       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9413 }
9414 
9415 template <typename Derived>
9416 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9417   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9418   if (ER.isInvalid())
9419     return nullptr;
9420   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9421                                           C->getLParenLoc(), C->getVarLoc(),
9422                                           C->getEndLoc());
9423 }
9424 
9425 template <typename Derived>
9426 OMPClause *
9427 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9428   ExprResult ER;
9429   if (Expr *IV = C->getInteropVar()) {
9430     ER = getDerived().TransformExpr(IV);
9431     if (ER.isInvalid())
9432       return nullptr;
9433   }
9434   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9435                                               C->getLParenLoc(), C->getVarLoc(),
9436                                               C->getEndLoc());
9437 }
9438 
9439 template <typename Derived>
9440 OMPClause *
9441 TreeTransform<Derived>::TransformOMPNovariantsClause(OMPNovariantsClause *C) {
9442   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9443   if (Cond.isInvalid())
9444     return nullptr;
9445   return getDerived().RebuildOMPNovariantsClause(
9446       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9447 }
9448 
9449 template <typename Derived>
9450 OMPClause *
9451 TreeTransform<Derived>::TransformOMPNocontextClause(OMPNocontextClause *C) {
9452   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9453   if (Cond.isInvalid())
9454     return nullptr;
9455   return getDerived().RebuildOMPNocontextClause(
9456       Cond.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9457 }
9458 
9459 template <typename Derived>
9460 OMPClause *
9461 TreeTransform<Derived>::TransformOMPFilterClause(OMPFilterClause *C) {
9462   ExprResult ThreadID = getDerived().TransformExpr(C->getThreadID());
9463   if (ThreadID.isInvalid())
9464     return nullptr;
9465   return getDerived().RebuildOMPFilterClause(ThreadID.get(), C->getBeginLoc(),
9466                                              C->getLParenLoc(), C->getEndLoc());
9467 }
9468 
9469 template <typename Derived>
9470 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9471     OMPUnifiedAddressClause *C) {
9472   llvm_unreachable("unified_address clause cannot appear in dependent context");
9473 }
9474 
9475 template <typename Derived>
9476 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9477     OMPUnifiedSharedMemoryClause *C) {
9478   llvm_unreachable(
9479       "unified_shared_memory clause cannot appear in dependent context");
9480 }
9481 
9482 template <typename Derived>
9483 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9484     OMPReverseOffloadClause *C) {
9485   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9486 }
9487 
9488 template <typename Derived>
9489 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9490     OMPDynamicAllocatorsClause *C) {
9491   llvm_unreachable(
9492       "dynamic_allocators clause cannot appear in dependent context");
9493 }
9494 
9495 template <typename Derived>
9496 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9497     OMPAtomicDefaultMemOrderClause *C) {
9498   llvm_unreachable(
9499       "atomic_default_mem_order clause cannot appear in dependent context");
9500 }
9501 
9502 template <typename Derived>
9503 OMPClause *
9504 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9505   llvm::SmallVector<Expr *, 16> Vars;
9506   Vars.reserve(C->varlist_size());
9507   for (auto *VE : C->varlists()) {
9508     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9509     if (EVar.isInvalid())
9510       return nullptr;
9511     Vars.push_back(EVar.get());
9512   }
9513   return getDerived().RebuildOMPPrivateClause(
9514       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9515 }
9516 
9517 template <typename Derived>
9518 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9519     OMPFirstprivateClause *C) {
9520   llvm::SmallVector<Expr *, 16> Vars;
9521   Vars.reserve(C->varlist_size());
9522   for (auto *VE : C->varlists()) {
9523     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9524     if (EVar.isInvalid())
9525       return nullptr;
9526     Vars.push_back(EVar.get());
9527   }
9528   return getDerived().RebuildOMPFirstprivateClause(
9529       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9530 }
9531 
9532 template <typename Derived>
9533 OMPClause *
9534 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9535   llvm::SmallVector<Expr *, 16> Vars;
9536   Vars.reserve(C->varlist_size());
9537   for (auto *VE : C->varlists()) {
9538     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9539     if (EVar.isInvalid())
9540       return nullptr;
9541     Vars.push_back(EVar.get());
9542   }
9543   return getDerived().RebuildOMPLastprivateClause(
9544       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9545       C->getLParenLoc(), C->getEndLoc());
9546 }
9547 
9548 template <typename Derived>
9549 OMPClause *
9550 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9551   llvm::SmallVector<Expr *, 16> Vars;
9552   Vars.reserve(C->varlist_size());
9553   for (auto *VE : C->varlists()) {
9554     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9555     if (EVar.isInvalid())
9556       return nullptr;
9557     Vars.push_back(EVar.get());
9558   }
9559   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9560                                              C->getLParenLoc(), C->getEndLoc());
9561 }
9562 
9563 template <typename Derived>
9564 OMPClause *
9565 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9566   llvm::SmallVector<Expr *, 16> Vars;
9567   Vars.reserve(C->varlist_size());
9568   for (auto *VE : C->varlists()) {
9569     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9570     if (EVar.isInvalid())
9571       return nullptr;
9572     Vars.push_back(EVar.get());
9573   }
9574   CXXScopeSpec ReductionIdScopeSpec;
9575   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9576 
9577   DeclarationNameInfo NameInfo = C->getNameInfo();
9578   if (NameInfo.getName()) {
9579     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9580     if (!NameInfo.getName())
9581       return nullptr;
9582   }
9583   // Build a list of all UDR decls with the same names ranged by the Scopes.
9584   // The Scope boundary is a duplication of the previous decl.
9585   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9586   for (auto *E : C->reduction_ops()) {
9587     // Transform all the decls.
9588     if (E) {
9589       auto *ULE = cast<UnresolvedLookupExpr>(E);
9590       UnresolvedSet<8> Decls;
9591       for (auto *D : ULE->decls()) {
9592         NamedDecl *InstD =
9593             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9594         Decls.addDecl(InstD, InstD->getAccess());
9595       }
9596       UnresolvedReductions.push_back(
9597        UnresolvedLookupExpr::Create(
9598           SemaRef.Context, /*NamingClass=*/nullptr,
9599           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9600           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9601           Decls.begin(), Decls.end()));
9602     } else
9603       UnresolvedReductions.push_back(nullptr);
9604   }
9605   return getDerived().RebuildOMPReductionClause(
9606       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9607       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9608       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9609 }
9610 
9611 template <typename Derived>
9612 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9613     OMPTaskReductionClause *C) {
9614   llvm::SmallVector<Expr *, 16> Vars;
9615   Vars.reserve(C->varlist_size());
9616   for (auto *VE : C->varlists()) {
9617     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9618     if (EVar.isInvalid())
9619       return nullptr;
9620     Vars.push_back(EVar.get());
9621   }
9622   CXXScopeSpec ReductionIdScopeSpec;
9623   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9624 
9625   DeclarationNameInfo NameInfo = C->getNameInfo();
9626   if (NameInfo.getName()) {
9627     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9628     if (!NameInfo.getName())
9629       return nullptr;
9630   }
9631   // Build a list of all UDR decls with the same names ranged by the Scopes.
9632   // The Scope boundary is a duplication of the previous decl.
9633   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9634   for (auto *E : C->reduction_ops()) {
9635     // Transform all the decls.
9636     if (E) {
9637       auto *ULE = cast<UnresolvedLookupExpr>(E);
9638       UnresolvedSet<8> Decls;
9639       for (auto *D : ULE->decls()) {
9640         NamedDecl *InstD =
9641             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9642         Decls.addDecl(InstD, InstD->getAccess());
9643       }
9644       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9645           SemaRef.Context, /*NamingClass=*/nullptr,
9646           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9647           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9648     } else
9649       UnresolvedReductions.push_back(nullptr);
9650   }
9651   return getDerived().RebuildOMPTaskReductionClause(
9652       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9653       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9654 }
9655 
9656 template <typename Derived>
9657 OMPClause *
9658 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9659   llvm::SmallVector<Expr *, 16> Vars;
9660   Vars.reserve(C->varlist_size());
9661   for (auto *VE : C->varlists()) {
9662     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9663     if (EVar.isInvalid())
9664       return nullptr;
9665     Vars.push_back(EVar.get());
9666   }
9667   CXXScopeSpec ReductionIdScopeSpec;
9668   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9669 
9670   DeclarationNameInfo NameInfo = C->getNameInfo();
9671   if (NameInfo.getName()) {
9672     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9673     if (!NameInfo.getName())
9674       return nullptr;
9675   }
9676   // Build a list of all UDR decls with the same names ranged by the Scopes.
9677   // The Scope boundary is a duplication of the previous decl.
9678   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9679   for (auto *E : C->reduction_ops()) {
9680     // Transform all the decls.
9681     if (E) {
9682       auto *ULE = cast<UnresolvedLookupExpr>(E);
9683       UnresolvedSet<8> Decls;
9684       for (auto *D : ULE->decls()) {
9685         NamedDecl *InstD =
9686             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9687         Decls.addDecl(InstD, InstD->getAccess());
9688       }
9689       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9690           SemaRef.Context, /*NamingClass=*/nullptr,
9691           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9692           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9693     } else
9694       UnresolvedReductions.push_back(nullptr);
9695   }
9696   return getDerived().RebuildOMPInReductionClause(
9697       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9698       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9699 }
9700 
9701 template <typename Derived>
9702 OMPClause *
9703 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9704   llvm::SmallVector<Expr *, 16> Vars;
9705   Vars.reserve(C->varlist_size());
9706   for (auto *VE : C->varlists()) {
9707     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9708     if (EVar.isInvalid())
9709       return nullptr;
9710     Vars.push_back(EVar.get());
9711   }
9712   ExprResult Step = getDerived().TransformExpr(C->getStep());
9713   if (Step.isInvalid())
9714     return nullptr;
9715   return getDerived().RebuildOMPLinearClause(
9716       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9717       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9718 }
9719 
9720 template <typename Derived>
9721 OMPClause *
9722 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9723   llvm::SmallVector<Expr *, 16> Vars;
9724   Vars.reserve(C->varlist_size());
9725   for (auto *VE : C->varlists()) {
9726     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9727     if (EVar.isInvalid())
9728       return nullptr;
9729     Vars.push_back(EVar.get());
9730   }
9731   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9732   if (Alignment.isInvalid())
9733     return nullptr;
9734   return getDerived().RebuildOMPAlignedClause(
9735       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9736       C->getColonLoc(), C->getEndLoc());
9737 }
9738 
9739 template <typename Derived>
9740 OMPClause *
9741 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9742   llvm::SmallVector<Expr *, 16> Vars;
9743   Vars.reserve(C->varlist_size());
9744   for (auto *VE : C->varlists()) {
9745     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9746     if (EVar.isInvalid())
9747       return nullptr;
9748     Vars.push_back(EVar.get());
9749   }
9750   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9751                                              C->getLParenLoc(), C->getEndLoc());
9752 }
9753 
9754 template <typename Derived>
9755 OMPClause *
9756 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9757   llvm::SmallVector<Expr *, 16> Vars;
9758   Vars.reserve(C->varlist_size());
9759   for (auto *VE : C->varlists()) {
9760     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9761     if (EVar.isInvalid())
9762       return nullptr;
9763     Vars.push_back(EVar.get());
9764   }
9765   return getDerived().RebuildOMPCopyprivateClause(
9766       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9767 }
9768 
9769 template <typename Derived>
9770 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9771   llvm::SmallVector<Expr *, 16> Vars;
9772   Vars.reserve(C->varlist_size());
9773   for (auto *VE : C->varlists()) {
9774     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9775     if (EVar.isInvalid())
9776       return nullptr;
9777     Vars.push_back(EVar.get());
9778   }
9779   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9780                                             C->getLParenLoc(), C->getEndLoc());
9781 }
9782 
9783 template <typename Derived>
9784 OMPClause *
9785 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9786   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9787   if (E.isInvalid())
9788     return nullptr;
9789   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9790                                              C->getLParenLoc(), C->getEndLoc());
9791 }
9792 
9793 template <typename Derived>
9794 OMPClause *
9795 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9796   llvm::SmallVector<Expr *, 16> Vars;
9797   Expr *DepModifier = C->getModifier();
9798   if (DepModifier) {
9799     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9800     if (DepModRes.isInvalid())
9801       return nullptr;
9802     DepModifier = DepModRes.get();
9803   }
9804   Vars.reserve(C->varlist_size());
9805   for (auto *VE : C->varlists()) {
9806     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9807     if (EVar.isInvalid())
9808       return nullptr;
9809     Vars.push_back(EVar.get());
9810   }
9811   return getDerived().RebuildOMPDependClause(
9812       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9813       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9814       C->getEndLoc());
9815 }
9816 
9817 template <typename Derived>
9818 OMPClause *
9819 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9820   ExprResult E = getDerived().TransformExpr(C->getDevice());
9821   if (E.isInvalid())
9822     return nullptr;
9823   return getDerived().RebuildOMPDeviceClause(
9824       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9825       C->getModifierLoc(), C->getEndLoc());
9826 }
9827 
9828 template <typename Derived, class T>
9829 bool transformOMPMappableExprListClause(
9830     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9831     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9832     DeclarationNameInfo &MapperIdInfo,
9833     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9834   // Transform expressions in the list.
9835   Vars.reserve(C->varlist_size());
9836   for (auto *VE : C->varlists()) {
9837     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9838     if (EVar.isInvalid())
9839       return true;
9840     Vars.push_back(EVar.get());
9841   }
9842   // Transform mapper scope specifier and identifier.
9843   NestedNameSpecifierLoc QualifierLoc;
9844   if (C->getMapperQualifierLoc()) {
9845     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9846         C->getMapperQualifierLoc());
9847     if (!QualifierLoc)
9848       return true;
9849   }
9850   MapperIdScopeSpec.Adopt(QualifierLoc);
9851   MapperIdInfo = C->getMapperIdInfo();
9852   if (MapperIdInfo.getName()) {
9853     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9854     if (!MapperIdInfo.getName())
9855       return true;
9856   }
9857   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9858   // the previous user-defined mapper lookup in dependent environment.
9859   for (auto *E : C->mapperlists()) {
9860     // Transform all the decls.
9861     if (E) {
9862       auto *ULE = cast<UnresolvedLookupExpr>(E);
9863       UnresolvedSet<8> Decls;
9864       for (auto *D : ULE->decls()) {
9865         NamedDecl *InstD =
9866             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9867         Decls.addDecl(InstD, InstD->getAccess());
9868       }
9869       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9870           TT.getSema().Context, /*NamingClass=*/nullptr,
9871           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9872           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9873           Decls.end()));
9874     } else {
9875       UnresolvedMappers.push_back(nullptr);
9876     }
9877   }
9878   return false;
9879 }
9880 
9881 template <typename Derived>
9882 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9883   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9884   llvm::SmallVector<Expr *, 16> Vars;
9885   CXXScopeSpec MapperIdScopeSpec;
9886   DeclarationNameInfo MapperIdInfo;
9887   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9888   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9889           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9890     return nullptr;
9891   return getDerived().RebuildOMPMapClause(
9892       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9893       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9894       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9895 }
9896 
9897 template <typename Derived>
9898 OMPClause *
9899 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9900   Expr *Allocator = C->getAllocator();
9901   if (Allocator) {
9902     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9903     if (AllocatorRes.isInvalid())
9904       return nullptr;
9905     Allocator = AllocatorRes.get();
9906   }
9907   llvm::SmallVector<Expr *, 16> Vars;
9908   Vars.reserve(C->varlist_size());
9909   for (auto *VE : C->varlists()) {
9910     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9911     if (EVar.isInvalid())
9912       return nullptr;
9913     Vars.push_back(EVar.get());
9914   }
9915   return getDerived().RebuildOMPAllocateClause(
9916       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9917       C->getEndLoc());
9918 }
9919 
9920 template <typename Derived>
9921 OMPClause *
9922 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9923   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9924   if (E.isInvalid())
9925     return nullptr;
9926   return getDerived().RebuildOMPNumTeamsClause(
9927       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9928 }
9929 
9930 template <typename Derived>
9931 OMPClause *
9932 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9933   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9934   if (E.isInvalid())
9935     return nullptr;
9936   return getDerived().RebuildOMPThreadLimitClause(
9937       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9938 }
9939 
9940 template <typename Derived>
9941 OMPClause *
9942 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9943   ExprResult E = getDerived().TransformExpr(C->getPriority());
9944   if (E.isInvalid())
9945     return nullptr;
9946   return getDerived().RebuildOMPPriorityClause(
9947       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9948 }
9949 
9950 template <typename Derived>
9951 OMPClause *
9952 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9953   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9954   if (E.isInvalid())
9955     return nullptr;
9956   return getDerived().RebuildOMPGrainsizeClause(
9957       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9958 }
9959 
9960 template <typename Derived>
9961 OMPClause *
9962 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9963   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9964   if (E.isInvalid())
9965     return nullptr;
9966   return getDerived().RebuildOMPNumTasksClause(
9967       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9968 }
9969 
9970 template <typename Derived>
9971 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9972   ExprResult E = getDerived().TransformExpr(C->getHint());
9973   if (E.isInvalid())
9974     return nullptr;
9975   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9976                                            C->getLParenLoc(), C->getEndLoc());
9977 }
9978 
9979 template <typename Derived>
9980 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9981     OMPDistScheduleClause *C) {
9982   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9983   if (E.isInvalid())
9984     return nullptr;
9985   return getDerived().RebuildOMPDistScheduleClause(
9986       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9987       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9988 }
9989 
9990 template <typename Derived>
9991 OMPClause *
9992 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9993   // Rebuild Defaultmap Clause since we need to invoke the checking of
9994   // defaultmap(none:variable-category) after template initialization.
9995   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9996                                                  C->getDefaultmapKind(),
9997                                                  C->getBeginLoc(),
9998                                                  C->getLParenLoc(),
9999                                                  C->getDefaultmapModifierLoc(),
10000                                                  C->getDefaultmapKindLoc(),
10001                                                  C->getEndLoc());
10002 }
10003 
10004 template <typename Derived>
10005 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
10006   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10007   llvm::SmallVector<Expr *, 16> Vars;
10008   CXXScopeSpec MapperIdScopeSpec;
10009   DeclarationNameInfo MapperIdInfo;
10010   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10011   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
10012           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10013     return nullptr;
10014   return getDerived().RebuildOMPToClause(
10015       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10016       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10017 }
10018 
10019 template <typename Derived>
10020 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
10021   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10022   llvm::SmallVector<Expr *, 16> Vars;
10023   CXXScopeSpec MapperIdScopeSpec;
10024   DeclarationNameInfo MapperIdInfo;
10025   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
10026   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
10027           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
10028     return nullptr;
10029   return getDerived().RebuildOMPFromClause(
10030       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
10031       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
10032 }
10033 
10034 template <typename Derived>
10035 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
10036     OMPUseDevicePtrClause *C) {
10037   llvm::SmallVector<Expr *, 16> Vars;
10038   Vars.reserve(C->varlist_size());
10039   for (auto *VE : C->varlists()) {
10040     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10041     if (EVar.isInvalid())
10042       return nullptr;
10043     Vars.push_back(EVar.get());
10044   }
10045   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10046   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
10047 }
10048 
10049 template <typename Derived>
10050 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
10051     OMPUseDeviceAddrClause *C) {
10052   llvm::SmallVector<Expr *, 16> Vars;
10053   Vars.reserve(C->varlist_size());
10054   for (auto *VE : C->varlists()) {
10055     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10056     if (EVar.isInvalid())
10057       return nullptr;
10058     Vars.push_back(EVar.get());
10059   }
10060   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10061   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
10062 }
10063 
10064 template <typename Derived>
10065 OMPClause *
10066 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
10067   llvm::SmallVector<Expr *, 16> Vars;
10068   Vars.reserve(C->varlist_size());
10069   for (auto *VE : C->varlists()) {
10070     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10071     if (EVar.isInvalid())
10072       return nullptr;
10073     Vars.push_back(EVar.get());
10074   }
10075   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10076   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
10077 }
10078 
10079 template <typename Derived>
10080 OMPClause *
10081 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
10082   llvm::SmallVector<Expr *, 16> Vars;
10083   Vars.reserve(C->varlist_size());
10084   for (auto *VE : C->varlists()) {
10085     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10086     if (EVar.isInvalid())
10087       return nullptr;
10088     Vars.push_back(EVar.get());
10089   }
10090   return getDerived().RebuildOMPNontemporalClause(
10091       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10092 }
10093 
10094 template <typename Derived>
10095 OMPClause *
10096 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
10097   llvm::SmallVector<Expr *, 16> Vars;
10098   Vars.reserve(C->varlist_size());
10099   for (auto *VE : C->varlists()) {
10100     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10101     if (EVar.isInvalid())
10102       return nullptr;
10103     Vars.push_back(EVar.get());
10104   }
10105   return getDerived().RebuildOMPInclusiveClause(
10106       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10107 }
10108 
10109 template <typename Derived>
10110 OMPClause *
10111 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10112   llvm::SmallVector<Expr *, 16> Vars;
10113   Vars.reserve(C->varlist_size());
10114   for (auto *VE : C->varlists()) {
10115     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10116     if (EVar.isInvalid())
10117       return nullptr;
10118     Vars.push_back(EVar.get());
10119   }
10120   return getDerived().RebuildOMPExclusiveClause(
10121       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10122 }
10123 
10124 template <typename Derived>
10125 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10126     OMPUsesAllocatorsClause *C) {
10127   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10128   Data.reserve(C->getNumberOfAllocators());
10129   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10130     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10131     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10132     if (Allocator.isInvalid())
10133       continue;
10134     ExprResult AllocatorTraits;
10135     if (Expr *AT = D.AllocatorTraits) {
10136       AllocatorTraits = getDerived().TransformExpr(AT);
10137       if (AllocatorTraits.isInvalid())
10138         continue;
10139     }
10140     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10141     NewD.Allocator = Allocator.get();
10142     NewD.AllocatorTraits = AllocatorTraits.get();
10143     NewD.LParenLoc = D.LParenLoc;
10144     NewD.RParenLoc = D.RParenLoc;
10145   }
10146   return getDerived().RebuildOMPUsesAllocatorsClause(
10147       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10148 }
10149 
10150 template <typename Derived>
10151 OMPClause *
10152 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10153   SmallVector<Expr *, 4> Locators;
10154   Locators.reserve(C->varlist_size());
10155   ExprResult ModifierRes;
10156   if (Expr *Modifier = C->getModifier()) {
10157     ModifierRes = getDerived().TransformExpr(Modifier);
10158     if (ModifierRes.isInvalid())
10159       return nullptr;
10160   }
10161   for (Expr *E : C->varlists()) {
10162     ExprResult Locator = getDerived().TransformExpr(E);
10163     if (Locator.isInvalid())
10164       continue;
10165     Locators.push_back(Locator.get());
10166   }
10167   return getDerived().RebuildOMPAffinityClause(
10168       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10169       ModifierRes.get(), Locators);
10170 }
10171 
10172 template <typename Derived>
10173 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10174   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10175                                             C->getBeginLoc(), C->getLParenLoc(),
10176                                             C->getEndLoc());
10177 }
10178 
10179 //===----------------------------------------------------------------------===//
10180 // Expression transformation
10181 //===----------------------------------------------------------------------===//
10182 template<typename Derived>
10183 ExprResult
10184 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10185   return TransformExpr(E->getSubExpr());
10186 }
10187 
10188 template <typename Derived>
10189 ExprResult TreeTransform<Derived>::TransformSYCLUniqueStableNameExpr(
10190     SYCLUniqueStableNameExpr *E) {
10191   if (!E->isTypeDependent())
10192     return E;
10193 
10194   TypeSourceInfo *NewT = getDerived().TransformType(E->getTypeSourceInfo());
10195 
10196   if (!NewT)
10197     return ExprError();
10198 
10199   if (!getDerived().AlwaysRebuild() && E->getTypeSourceInfo() == NewT)
10200     return E;
10201 
10202   return getDerived().RebuildSYCLUniqueStableNameExpr(
10203       E->getLocation(), E->getLParenLocation(), E->getRParenLocation(), NewT);
10204 }
10205 
10206 template<typename Derived>
10207 ExprResult
10208 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10209   if (!E->isTypeDependent())
10210     return E;
10211 
10212   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10213                                             E->getIdentKind());
10214 }
10215 
10216 template<typename Derived>
10217 ExprResult
10218 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10219   NestedNameSpecifierLoc QualifierLoc;
10220   if (E->getQualifierLoc()) {
10221     QualifierLoc
10222       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10223     if (!QualifierLoc)
10224       return ExprError();
10225   }
10226 
10227   ValueDecl *ND
10228     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10229                                                          E->getDecl()));
10230   if (!ND)
10231     return ExprError();
10232 
10233   NamedDecl *Found = ND;
10234   if (E->getFoundDecl() != E->getDecl()) {
10235     Found = cast_or_null<NamedDecl>(
10236         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10237     if (!Found)
10238       return ExprError();
10239   }
10240 
10241   DeclarationNameInfo NameInfo = E->getNameInfo();
10242   if (NameInfo.getName()) {
10243     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10244     if (!NameInfo.getName())
10245       return ExprError();
10246   }
10247 
10248   if (!getDerived().AlwaysRebuild() &&
10249       QualifierLoc == E->getQualifierLoc() &&
10250       ND == E->getDecl() &&
10251       Found == E->getFoundDecl() &&
10252       NameInfo.getName() == E->getDecl()->getDeclName() &&
10253       !E->hasExplicitTemplateArgs()) {
10254 
10255     // Mark it referenced in the new context regardless.
10256     // FIXME: this is a bit instantiation-specific.
10257     SemaRef.MarkDeclRefReferenced(E);
10258 
10259     return E;
10260   }
10261 
10262   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10263   if (E->hasExplicitTemplateArgs()) {
10264     TemplateArgs = &TransArgs;
10265     TransArgs.setLAngleLoc(E->getLAngleLoc());
10266     TransArgs.setRAngleLoc(E->getRAngleLoc());
10267     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10268                                                 E->getNumTemplateArgs(),
10269                                                 TransArgs))
10270       return ExprError();
10271   }
10272 
10273   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10274                                          Found, TemplateArgs);
10275 }
10276 
10277 template<typename Derived>
10278 ExprResult
10279 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10280   return E;
10281 }
10282 
10283 template <typename Derived>
10284 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10285     FixedPointLiteral *E) {
10286   return E;
10287 }
10288 
10289 template<typename Derived>
10290 ExprResult
10291 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10292   return E;
10293 }
10294 
10295 template<typename Derived>
10296 ExprResult
10297 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10298   return E;
10299 }
10300 
10301 template<typename Derived>
10302 ExprResult
10303 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10304   return E;
10305 }
10306 
10307 template<typename Derived>
10308 ExprResult
10309 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10310   return E;
10311 }
10312 
10313 template<typename Derived>
10314 ExprResult
10315 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10316   if (FunctionDecl *FD = E->getDirectCallee())
10317     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10318   return SemaRef.MaybeBindToTemporary(E);
10319 }
10320 
10321 template<typename Derived>
10322 ExprResult
10323 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10324   ExprResult ControllingExpr =
10325     getDerived().TransformExpr(E->getControllingExpr());
10326   if (ControllingExpr.isInvalid())
10327     return ExprError();
10328 
10329   SmallVector<Expr *, 4> AssocExprs;
10330   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10331   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10332     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10333     if (TSI) {
10334       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10335       if (!AssocType)
10336         return ExprError();
10337       AssocTypes.push_back(AssocType);
10338     } else {
10339       AssocTypes.push_back(nullptr);
10340     }
10341 
10342     ExprResult AssocExpr =
10343         getDerived().TransformExpr(Assoc.getAssociationExpr());
10344     if (AssocExpr.isInvalid())
10345       return ExprError();
10346     AssocExprs.push_back(AssocExpr.get());
10347   }
10348 
10349   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10350                                                   E->getDefaultLoc(),
10351                                                   E->getRParenLoc(),
10352                                                   ControllingExpr.get(),
10353                                                   AssocTypes,
10354                                                   AssocExprs);
10355 }
10356 
10357 template<typename Derived>
10358 ExprResult
10359 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10360   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10361   if (SubExpr.isInvalid())
10362     return ExprError();
10363 
10364   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10365     return E;
10366 
10367   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10368                                        E->getRParen());
10369 }
10370 
10371 /// The operand of a unary address-of operator has special rules: it's
10372 /// allowed to refer to a non-static member of a class even if there's no 'this'
10373 /// object available.
10374 template<typename Derived>
10375 ExprResult
10376 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10377   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10378     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10379   else
10380     return getDerived().TransformExpr(E);
10381 }
10382 
10383 template<typename Derived>
10384 ExprResult
10385 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10386   ExprResult SubExpr;
10387   if (E->getOpcode() == UO_AddrOf)
10388     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10389   else
10390     SubExpr = TransformExpr(E->getSubExpr());
10391   if (SubExpr.isInvalid())
10392     return ExprError();
10393 
10394   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10395     return E;
10396 
10397   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10398                                            E->getOpcode(),
10399                                            SubExpr.get());
10400 }
10401 
10402 template<typename Derived>
10403 ExprResult
10404 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10405   // Transform the type.
10406   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10407   if (!Type)
10408     return ExprError();
10409 
10410   // Transform all of the components into components similar to what the
10411   // parser uses.
10412   // FIXME: It would be slightly more efficient in the non-dependent case to
10413   // just map FieldDecls, rather than requiring the rebuilder to look for
10414   // the fields again. However, __builtin_offsetof is rare enough in
10415   // template code that we don't care.
10416   bool ExprChanged = false;
10417   typedef Sema::OffsetOfComponent Component;
10418   SmallVector<Component, 4> Components;
10419   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10420     const OffsetOfNode &ON = E->getComponent(I);
10421     Component Comp;
10422     Comp.isBrackets = true;
10423     Comp.LocStart = ON.getSourceRange().getBegin();
10424     Comp.LocEnd = ON.getSourceRange().getEnd();
10425     switch (ON.getKind()) {
10426     case OffsetOfNode::Array: {
10427       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10428       ExprResult Index = getDerived().TransformExpr(FromIndex);
10429       if (Index.isInvalid())
10430         return ExprError();
10431 
10432       ExprChanged = ExprChanged || Index.get() != FromIndex;
10433       Comp.isBrackets = true;
10434       Comp.U.E = Index.get();
10435       break;
10436     }
10437 
10438     case OffsetOfNode::Field:
10439     case OffsetOfNode::Identifier:
10440       Comp.isBrackets = false;
10441       Comp.U.IdentInfo = ON.getFieldName();
10442       if (!Comp.U.IdentInfo)
10443         continue;
10444 
10445       break;
10446 
10447     case OffsetOfNode::Base:
10448       // Will be recomputed during the rebuild.
10449       continue;
10450     }
10451 
10452     Components.push_back(Comp);
10453   }
10454 
10455   // If nothing changed, retain the existing expression.
10456   if (!getDerived().AlwaysRebuild() &&
10457       Type == E->getTypeSourceInfo() &&
10458       !ExprChanged)
10459     return E;
10460 
10461   // Build a new offsetof expression.
10462   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10463                                           Components, E->getRParenLoc());
10464 }
10465 
10466 template<typename Derived>
10467 ExprResult
10468 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10469   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10470          "opaque value expression requires transformation");
10471   return E;
10472 }
10473 
10474 template<typename Derived>
10475 ExprResult
10476 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10477   return E;
10478 }
10479 
10480 template <typename Derived>
10481 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10482   llvm::SmallVector<Expr *, 8> Children;
10483   bool Changed = false;
10484   for (Expr *C : E->subExpressions()) {
10485     ExprResult NewC = getDerived().TransformExpr(C);
10486     if (NewC.isInvalid())
10487       return ExprError();
10488     Children.push_back(NewC.get());
10489 
10490     Changed |= NewC.get() != C;
10491   }
10492   if (!getDerived().AlwaysRebuild() && !Changed)
10493     return E;
10494   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10495                                           Children, E->getType());
10496 }
10497 
10498 template<typename Derived>
10499 ExprResult
10500 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10501   // Rebuild the syntactic form.  The original syntactic form has
10502   // opaque-value expressions in it, so strip those away and rebuild
10503   // the result.  This is a really awful way of doing this, but the
10504   // better solution (rebuilding the semantic expressions and
10505   // rebinding OVEs as necessary) doesn't work; we'd need
10506   // TreeTransform to not strip away implicit conversions.
10507   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10508   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10509   if (result.isInvalid()) return ExprError();
10510 
10511   // If that gives us a pseudo-object result back, the pseudo-object
10512   // expression must have been an lvalue-to-rvalue conversion which we
10513   // should reapply.
10514   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10515     result = SemaRef.checkPseudoObjectRValue(result.get());
10516 
10517   return result;
10518 }
10519 
10520 template<typename Derived>
10521 ExprResult
10522 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10523                                                 UnaryExprOrTypeTraitExpr *E) {
10524   if (E->isArgumentType()) {
10525     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10526 
10527     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10528     if (!NewT)
10529       return ExprError();
10530 
10531     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10532       return E;
10533 
10534     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10535                                                     E->getKind(),
10536                                                     E->getSourceRange());
10537   }
10538 
10539   // C++0x [expr.sizeof]p1:
10540   //   The operand is either an expression, which is an unevaluated operand
10541   //   [...]
10542   EnterExpressionEvaluationContext Unevaluated(
10543       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10544       Sema::ReuseLambdaContextDecl);
10545 
10546   // Try to recover if we have something like sizeof(T::X) where X is a type.
10547   // Notably, there must be *exactly* one set of parens if X is a type.
10548   TypeSourceInfo *RecoveryTSI = nullptr;
10549   ExprResult SubExpr;
10550   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10551   if (auto *DRE =
10552           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10553     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10554         PE, DRE, false, &RecoveryTSI);
10555   else
10556     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10557 
10558   if (RecoveryTSI) {
10559     return getDerived().RebuildUnaryExprOrTypeTrait(
10560         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10561   } else if (SubExpr.isInvalid())
10562     return ExprError();
10563 
10564   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10565     return E;
10566 
10567   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10568                                                   E->getOperatorLoc(),
10569                                                   E->getKind(),
10570                                                   E->getSourceRange());
10571 }
10572 
10573 template<typename Derived>
10574 ExprResult
10575 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10576   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10577   if (LHS.isInvalid())
10578     return ExprError();
10579 
10580   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10581   if (RHS.isInvalid())
10582     return ExprError();
10583 
10584 
10585   if (!getDerived().AlwaysRebuild() &&
10586       LHS.get() == E->getLHS() &&
10587       RHS.get() == E->getRHS())
10588     return E;
10589 
10590   return getDerived().RebuildArraySubscriptExpr(
10591       LHS.get(),
10592       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10593 }
10594 
10595 template <typename Derived>
10596 ExprResult
10597 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10598   ExprResult Base = getDerived().TransformExpr(E->getBase());
10599   if (Base.isInvalid())
10600     return ExprError();
10601 
10602   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10603   if (RowIdx.isInvalid())
10604     return ExprError();
10605 
10606   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10607   if (ColumnIdx.isInvalid())
10608     return ExprError();
10609 
10610   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10611       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10612     return E;
10613 
10614   return getDerived().RebuildMatrixSubscriptExpr(
10615       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10616 }
10617 
10618 template <typename Derived>
10619 ExprResult
10620 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10621   ExprResult Base = getDerived().TransformExpr(E->getBase());
10622   if (Base.isInvalid())
10623     return ExprError();
10624 
10625   ExprResult LowerBound;
10626   if (E->getLowerBound()) {
10627     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10628     if (LowerBound.isInvalid())
10629       return ExprError();
10630   }
10631 
10632   ExprResult Length;
10633   if (E->getLength()) {
10634     Length = getDerived().TransformExpr(E->getLength());
10635     if (Length.isInvalid())
10636       return ExprError();
10637   }
10638 
10639   ExprResult Stride;
10640   if (Expr *Str = E->getStride()) {
10641     Stride = getDerived().TransformExpr(Str);
10642     if (Stride.isInvalid())
10643       return ExprError();
10644   }
10645 
10646   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10647       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10648     return E;
10649 
10650   return getDerived().RebuildOMPArraySectionExpr(
10651       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10652       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10653       E->getRBracketLoc());
10654 }
10655 
10656 template <typename Derived>
10657 ExprResult
10658 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10659   ExprResult Base = getDerived().TransformExpr(E->getBase());
10660   if (Base.isInvalid())
10661     return ExprError();
10662 
10663   SmallVector<Expr *, 4> Dims;
10664   bool ErrorFound = false;
10665   for (Expr *Dim : E->getDimensions()) {
10666     ExprResult DimRes = getDerived().TransformExpr(Dim);
10667     if (DimRes.isInvalid()) {
10668       ErrorFound = true;
10669       continue;
10670     }
10671     Dims.push_back(DimRes.get());
10672   }
10673 
10674   if (ErrorFound)
10675     return ExprError();
10676   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10677                                                  E->getRParenLoc(), Dims,
10678                                                  E->getBracketsRanges());
10679 }
10680 
10681 template <typename Derived>
10682 ExprResult
10683 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10684   unsigned NumIterators = E->numOfIterators();
10685   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10686 
10687   bool ErrorFound = false;
10688   bool NeedToRebuild = getDerived().AlwaysRebuild();
10689   for (unsigned I = 0; I < NumIterators; ++I) {
10690     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10691     Data[I].DeclIdent = D->getIdentifier();
10692     Data[I].DeclIdentLoc = D->getLocation();
10693     if (D->getLocation() == D->getBeginLoc()) {
10694       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10695              "Implicit type must be int.");
10696     } else {
10697       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10698       QualType DeclTy = getDerived().TransformType(D->getType());
10699       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10700     }
10701     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10702     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10703     ExprResult End = getDerived().TransformExpr(Range.End);
10704     ExprResult Step = getDerived().TransformExpr(Range.Step);
10705     ErrorFound = ErrorFound ||
10706                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10707                                                !Data[I].Type.get().isNull())) ||
10708                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10709     if (ErrorFound)
10710       continue;
10711     Data[I].Range.Begin = Begin.get();
10712     Data[I].Range.End = End.get();
10713     Data[I].Range.Step = Step.get();
10714     Data[I].AssignLoc = E->getAssignLoc(I);
10715     Data[I].ColonLoc = E->getColonLoc(I);
10716     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10717     NeedToRebuild =
10718         NeedToRebuild ||
10719         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10720                                        D->getType().getTypePtrOrNull()) ||
10721         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10722         Range.Step != Data[I].Range.Step;
10723   }
10724   if (ErrorFound)
10725     return ExprError();
10726   if (!NeedToRebuild)
10727     return E;
10728 
10729   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10730       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10731   if (!Res.isUsable())
10732     return Res;
10733   auto *IE = cast<OMPIteratorExpr>(Res.get());
10734   for (unsigned I = 0; I < NumIterators; ++I)
10735     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10736                                       IE->getIteratorDecl(I));
10737   return Res;
10738 }
10739 
10740 template<typename Derived>
10741 ExprResult
10742 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10743   // Transform the callee.
10744   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10745   if (Callee.isInvalid())
10746     return ExprError();
10747 
10748   // Transform arguments.
10749   bool ArgChanged = false;
10750   SmallVector<Expr*, 8> Args;
10751   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10752                                   &ArgChanged))
10753     return ExprError();
10754 
10755   if (!getDerived().AlwaysRebuild() &&
10756       Callee.get() == E->getCallee() &&
10757       !ArgChanged)
10758     return SemaRef.MaybeBindToTemporary(E);
10759 
10760   // FIXME: Wrong source location information for the '('.
10761   SourceLocation FakeLParenLoc
10762     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10763 
10764   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10765   if (E->hasStoredFPFeatures()) {
10766     FPOptionsOverride NewOverrides = E->getFPFeatures();
10767     getSema().CurFPFeatures =
10768         NewOverrides.applyOverrides(getSema().getLangOpts());
10769     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10770   }
10771 
10772   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10773                                       Args,
10774                                       E->getRParenLoc());
10775 }
10776 
10777 template<typename Derived>
10778 ExprResult
10779 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10780   ExprResult Base = getDerived().TransformExpr(E->getBase());
10781   if (Base.isInvalid())
10782     return ExprError();
10783 
10784   NestedNameSpecifierLoc QualifierLoc;
10785   if (E->hasQualifier()) {
10786     QualifierLoc
10787       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10788 
10789     if (!QualifierLoc)
10790       return ExprError();
10791   }
10792   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10793 
10794   ValueDecl *Member
10795     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10796                                                          E->getMemberDecl()));
10797   if (!Member)
10798     return ExprError();
10799 
10800   NamedDecl *FoundDecl = E->getFoundDecl();
10801   if (FoundDecl == E->getMemberDecl()) {
10802     FoundDecl = Member;
10803   } else {
10804     FoundDecl = cast_or_null<NamedDecl>(
10805                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10806     if (!FoundDecl)
10807       return ExprError();
10808   }
10809 
10810   if (!getDerived().AlwaysRebuild() &&
10811       Base.get() == E->getBase() &&
10812       QualifierLoc == E->getQualifierLoc() &&
10813       Member == E->getMemberDecl() &&
10814       FoundDecl == E->getFoundDecl() &&
10815       !E->hasExplicitTemplateArgs()) {
10816 
10817     // Mark it referenced in the new context regardless.
10818     // FIXME: this is a bit instantiation-specific.
10819     SemaRef.MarkMemberReferenced(E);
10820 
10821     return E;
10822   }
10823 
10824   TemplateArgumentListInfo TransArgs;
10825   if (E->hasExplicitTemplateArgs()) {
10826     TransArgs.setLAngleLoc(E->getLAngleLoc());
10827     TransArgs.setRAngleLoc(E->getRAngleLoc());
10828     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10829                                                 E->getNumTemplateArgs(),
10830                                                 TransArgs))
10831       return ExprError();
10832   }
10833 
10834   // FIXME: Bogus source location for the operator
10835   SourceLocation FakeOperatorLoc =
10836       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10837 
10838   // FIXME: to do this check properly, we will need to preserve the
10839   // first-qualifier-in-scope here, just in case we had a dependent
10840   // base (and therefore couldn't do the check) and a
10841   // nested-name-qualifier (and therefore could do the lookup).
10842   NamedDecl *FirstQualifierInScope = nullptr;
10843   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10844   if (MemberNameInfo.getName()) {
10845     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10846     if (!MemberNameInfo.getName())
10847       return ExprError();
10848   }
10849 
10850   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10851                                         E->isArrow(),
10852                                         QualifierLoc,
10853                                         TemplateKWLoc,
10854                                         MemberNameInfo,
10855                                         Member,
10856                                         FoundDecl,
10857                                         (E->hasExplicitTemplateArgs()
10858                                            ? &TransArgs : nullptr),
10859                                         FirstQualifierInScope);
10860 }
10861 
10862 template<typename Derived>
10863 ExprResult
10864 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10865   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10866   if (LHS.isInvalid())
10867     return ExprError();
10868 
10869   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10870   if (RHS.isInvalid())
10871     return ExprError();
10872 
10873   if (!getDerived().AlwaysRebuild() &&
10874       LHS.get() == E->getLHS() &&
10875       RHS.get() == E->getRHS())
10876     return E;
10877 
10878   if (E->isCompoundAssignmentOp())
10879     // FPFeatures has already been established from trailing storage
10880     return getDerived().RebuildBinaryOperator(
10881         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10882   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10883   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10884   getSema().CurFPFeatures =
10885       NewOverrides.applyOverrides(getSema().getLangOpts());
10886   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10887   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10888                                             LHS.get(), RHS.get());
10889 }
10890 
10891 template <typename Derived>
10892 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10893     CXXRewrittenBinaryOperator *E) {
10894   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10895 
10896   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10897   if (LHS.isInvalid())
10898     return ExprError();
10899 
10900   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10901   if (RHS.isInvalid())
10902     return ExprError();
10903 
10904   if (!getDerived().AlwaysRebuild() &&
10905       LHS.get() == Decomp.LHS &&
10906       RHS.get() == Decomp.RHS)
10907     return E;
10908 
10909   // Extract the already-resolved callee declarations so that we can restrict
10910   // ourselves to using them as the unqualified lookup results when rebuilding.
10911   UnresolvedSet<2> UnqualLookups;
10912   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10913                             const_cast<Expr *>(Decomp.InnerBinOp)};
10914   for (Expr *PossibleBinOp : PossibleBinOps) {
10915     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10916     if (!Op)
10917       continue;
10918     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10919     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10920       continue;
10921 
10922     // Transform the callee in case we built a call to a local extern
10923     // declaration.
10924     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10925         E->getOperatorLoc(), Callee->getFoundDecl()));
10926     if (!Found)
10927       return ExprError();
10928     UnqualLookups.addDecl(Found);
10929   }
10930 
10931   return getDerived().RebuildCXXRewrittenBinaryOperator(
10932       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10933 }
10934 
10935 template<typename Derived>
10936 ExprResult
10937 TreeTransform<Derived>::TransformCompoundAssignOperator(
10938                                                       CompoundAssignOperator *E) {
10939   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10940   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10941   getSema().CurFPFeatures =
10942       NewOverrides.applyOverrides(getSema().getLangOpts());
10943   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10944   return getDerived().TransformBinaryOperator(E);
10945 }
10946 
10947 template<typename Derived>
10948 ExprResult TreeTransform<Derived>::
10949 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10950   // Just rebuild the common and RHS expressions and see whether we
10951   // get any changes.
10952 
10953   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10954   if (commonExpr.isInvalid())
10955     return ExprError();
10956 
10957   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10958   if (rhs.isInvalid())
10959     return ExprError();
10960 
10961   if (!getDerived().AlwaysRebuild() &&
10962       commonExpr.get() == e->getCommon() &&
10963       rhs.get() == e->getFalseExpr())
10964     return e;
10965 
10966   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10967                                                  e->getQuestionLoc(),
10968                                                  nullptr,
10969                                                  e->getColonLoc(),
10970                                                  rhs.get());
10971 }
10972 
10973 template<typename Derived>
10974 ExprResult
10975 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10976   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10977   if (Cond.isInvalid())
10978     return ExprError();
10979 
10980   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10981   if (LHS.isInvalid())
10982     return ExprError();
10983 
10984   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10985   if (RHS.isInvalid())
10986     return ExprError();
10987 
10988   if (!getDerived().AlwaysRebuild() &&
10989       Cond.get() == E->getCond() &&
10990       LHS.get() == E->getLHS() &&
10991       RHS.get() == E->getRHS())
10992     return E;
10993 
10994   return getDerived().RebuildConditionalOperator(Cond.get(),
10995                                                  E->getQuestionLoc(),
10996                                                  LHS.get(),
10997                                                  E->getColonLoc(),
10998                                                  RHS.get());
10999 }
11000 
11001 template<typename Derived>
11002 ExprResult
11003 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
11004   // Implicit casts are eliminated during transformation, since they
11005   // will be recomputed by semantic analysis after transformation.
11006   return getDerived().TransformExpr(E->getSubExprAsWritten());
11007 }
11008 
11009 template<typename Derived>
11010 ExprResult
11011 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
11012   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11013   if (!Type)
11014     return ExprError();
11015 
11016   ExprResult SubExpr
11017     = getDerived().TransformExpr(E->getSubExprAsWritten());
11018   if (SubExpr.isInvalid())
11019     return ExprError();
11020 
11021   if (!getDerived().AlwaysRebuild() &&
11022       Type == E->getTypeInfoAsWritten() &&
11023       SubExpr.get() == E->getSubExpr())
11024     return E;
11025 
11026   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
11027                                             Type,
11028                                             E->getRParenLoc(),
11029                                             SubExpr.get());
11030 }
11031 
11032 template<typename Derived>
11033 ExprResult
11034 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
11035   TypeSourceInfo *OldT = E->getTypeSourceInfo();
11036   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
11037   if (!NewT)
11038     return ExprError();
11039 
11040   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
11041   if (Init.isInvalid())
11042     return ExprError();
11043 
11044   if (!getDerived().AlwaysRebuild() &&
11045       OldT == NewT &&
11046       Init.get() == E->getInitializer())
11047     return SemaRef.MaybeBindToTemporary(E);
11048 
11049   // Note: the expression type doesn't necessarily match the
11050   // type-as-written, but that's okay, because it should always be
11051   // derivable from the initializer.
11052 
11053   return getDerived().RebuildCompoundLiteralExpr(
11054       E->getLParenLoc(), NewT,
11055       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
11056 }
11057 
11058 template<typename Derived>
11059 ExprResult
11060 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
11061   ExprResult Base = getDerived().TransformExpr(E->getBase());
11062   if (Base.isInvalid())
11063     return ExprError();
11064 
11065   if (!getDerived().AlwaysRebuild() &&
11066       Base.get() == E->getBase())
11067     return E;
11068 
11069   // FIXME: Bad source location
11070   SourceLocation FakeOperatorLoc =
11071       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
11072   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
11073                                                   E->getAccessorLoc(),
11074                                                   E->getAccessor());
11075 }
11076 
11077 template<typename Derived>
11078 ExprResult
11079 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
11080   if (InitListExpr *Syntactic = E->getSyntacticForm())
11081     E = Syntactic;
11082 
11083   bool InitChanged = false;
11084 
11085   EnterExpressionEvaluationContext Context(
11086       getSema(), EnterExpressionEvaluationContext::InitList);
11087 
11088   SmallVector<Expr*, 4> Inits;
11089   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
11090                                   Inits, &InitChanged))
11091     return ExprError();
11092 
11093   if (!getDerived().AlwaysRebuild() && !InitChanged) {
11094     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
11095     // in some cases. We can't reuse it in general, because the syntactic and
11096     // semantic forms are linked, and we can't know that semantic form will
11097     // match even if the syntactic form does.
11098   }
11099 
11100   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
11101                                       E->getRBraceLoc());
11102 }
11103 
11104 template<typename Derived>
11105 ExprResult
11106 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
11107   Designation Desig;
11108 
11109   // transform the initializer value
11110   ExprResult Init = getDerived().TransformExpr(E->getInit());
11111   if (Init.isInvalid())
11112     return ExprError();
11113 
11114   // transform the designators.
11115   SmallVector<Expr*, 4> ArrayExprs;
11116   bool ExprChanged = false;
11117   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11118     if (D.isFieldDesignator()) {
11119       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11120                                                D.getDotLoc(),
11121                                                D.getFieldLoc()));
11122       if (D.getField()) {
11123         FieldDecl *Field = cast_or_null<FieldDecl>(
11124             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11125         if (Field != D.getField())
11126           // Rebuild the expression when the transformed FieldDecl is
11127           // different to the already assigned FieldDecl.
11128           ExprChanged = true;
11129       } else {
11130         // Ensure that the designator expression is rebuilt when there isn't
11131         // a resolved FieldDecl in the designator as we don't want to assign
11132         // a FieldDecl to a pattern designator that will be instantiated again.
11133         ExprChanged = true;
11134       }
11135       continue;
11136     }
11137 
11138     if (D.isArrayDesignator()) {
11139       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11140       if (Index.isInvalid())
11141         return ExprError();
11142 
11143       Desig.AddDesignator(
11144           Designator::getArray(Index.get(), D.getLBracketLoc()));
11145 
11146       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11147       ArrayExprs.push_back(Index.get());
11148       continue;
11149     }
11150 
11151     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11152     ExprResult Start
11153       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11154     if (Start.isInvalid())
11155       return ExprError();
11156 
11157     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11158     if (End.isInvalid())
11159       return ExprError();
11160 
11161     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11162                                                   End.get(),
11163                                                   D.getLBracketLoc(),
11164                                                   D.getEllipsisLoc()));
11165 
11166     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11167                   End.get() != E->getArrayRangeEnd(D);
11168 
11169     ArrayExprs.push_back(Start.get());
11170     ArrayExprs.push_back(End.get());
11171   }
11172 
11173   if (!getDerived().AlwaysRebuild() &&
11174       Init.get() == E->getInit() &&
11175       !ExprChanged)
11176     return E;
11177 
11178   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11179                                                 E->getEqualOrColonLoc(),
11180                                                 E->usesGNUSyntax(), Init.get());
11181 }
11182 
11183 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11184 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11185 template<typename Derived>
11186 ExprResult
11187 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11188     DesignatedInitUpdateExpr *E) {
11189   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11190                    "initializer");
11191   return ExprError();
11192 }
11193 
11194 template<typename Derived>
11195 ExprResult
11196 TreeTransform<Derived>::TransformNoInitExpr(
11197     NoInitExpr *E) {
11198   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11199   return ExprError();
11200 }
11201 
11202 template<typename Derived>
11203 ExprResult
11204 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11205   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11206   return ExprError();
11207 }
11208 
11209 template<typename Derived>
11210 ExprResult
11211 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11212   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11213   return ExprError();
11214 }
11215 
11216 template<typename Derived>
11217 ExprResult
11218 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11219                                                      ImplicitValueInitExpr *E) {
11220   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11221 
11222   // FIXME: Will we ever have proper type location here? Will we actually
11223   // need to transform the type?
11224   QualType T = getDerived().TransformType(E->getType());
11225   if (T.isNull())
11226     return ExprError();
11227 
11228   if (!getDerived().AlwaysRebuild() &&
11229       T == E->getType())
11230     return E;
11231 
11232   return getDerived().RebuildImplicitValueInitExpr(T);
11233 }
11234 
11235 template<typename Derived>
11236 ExprResult
11237 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11238   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11239   if (!TInfo)
11240     return ExprError();
11241 
11242   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11243   if (SubExpr.isInvalid())
11244     return ExprError();
11245 
11246   if (!getDerived().AlwaysRebuild() &&
11247       TInfo == E->getWrittenTypeInfo() &&
11248       SubExpr.get() == E->getSubExpr())
11249     return E;
11250 
11251   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11252                                        TInfo, E->getRParenLoc());
11253 }
11254 
11255 template<typename Derived>
11256 ExprResult
11257 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11258   bool ArgumentChanged = false;
11259   SmallVector<Expr*, 4> Inits;
11260   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11261                      &ArgumentChanged))
11262     return ExprError();
11263 
11264   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11265                                            Inits,
11266                                            E->getRParenLoc());
11267 }
11268 
11269 /// Transform an address-of-label expression.
11270 ///
11271 /// By default, the transformation of an address-of-label expression always
11272 /// rebuilds the expression, so that the label identifier can be resolved to
11273 /// the corresponding label statement by semantic analysis.
11274 template<typename Derived>
11275 ExprResult
11276 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11277   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11278                                         E->getLabel());
11279   if (!LD)
11280     return ExprError();
11281 
11282   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11283                                            cast<LabelDecl>(LD));
11284 }
11285 
11286 template<typename Derived>
11287 ExprResult
11288 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11289   SemaRef.ActOnStartStmtExpr();
11290   StmtResult SubStmt
11291     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11292   if (SubStmt.isInvalid()) {
11293     SemaRef.ActOnStmtExprError();
11294     return ExprError();
11295   }
11296 
11297   unsigned OldDepth = E->getTemplateDepth();
11298   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11299 
11300   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11301       SubStmt.get() == E->getSubStmt()) {
11302     // Calling this an 'error' is unintuitive, but it does the right thing.
11303     SemaRef.ActOnStmtExprError();
11304     return SemaRef.MaybeBindToTemporary(E);
11305   }
11306 
11307   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11308                                       E->getRParenLoc(), NewDepth);
11309 }
11310 
11311 template<typename Derived>
11312 ExprResult
11313 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11314   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11315   if (Cond.isInvalid())
11316     return ExprError();
11317 
11318   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11319   if (LHS.isInvalid())
11320     return ExprError();
11321 
11322   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11323   if (RHS.isInvalid())
11324     return ExprError();
11325 
11326   if (!getDerived().AlwaysRebuild() &&
11327       Cond.get() == E->getCond() &&
11328       LHS.get() == E->getLHS() &&
11329       RHS.get() == E->getRHS())
11330     return E;
11331 
11332   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11333                                         Cond.get(), LHS.get(), RHS.get(),
11334                                         E->getRParenLoc());
11335 }
11336 
11337 template<typename Derived>
11338 ExprResult
11339 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11340   return E;
11341 }
11342 
11343 template<typename Derived>
11344 ExprResult
11345 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11346   switch (E->getOperator()) {
11347   case OO_New:
11348   case OO_Delete:
11349   case OO_Array_New:
11350   case OO_Array_Delete:
11351     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11352 
11353   case OO_Call: {
11354     // This is a call to an object's operator().
11355     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11356 
11357     // Transform the object itself.
11358     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11359     if (Object.isInvalid())
11360       return ExprError();
11361 
11362     // FIXME: Poor location information
11363     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11364         static_cast<Expr *>(Object.get())->getEndLoc());
11365 
11366     // Transform the call arguments.
11367     SmallVector<Expr*, 8> Args;
11368     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11369                                     Args))
11370       return ExprError();
11371 
11372     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11373                                         E->getEndLoc());
11374   }
11375 
11376 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11377   case OO_##Name:
11378 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11379 #include "clang/Basic/OperatorKinds.def"
11380   case OO_Subscript:
11381     // Handled below.
11382     break;
11383 
11384   case OO_Conditional:
11385     llvm_unreachable("conditional operator is not actually overloadable");
11386 
11387   case OO_None:
11388   case NUM_OVERLOADED_OPERATORS:
11389     llvm_unreachable("not an overloaded operator?");
11390   }
11391 
11392   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11393   if (Callee.isInvalid())
11394     return ExprError();
11395 
11396   ExprResult First;
11397   if (E->getOperator() == OO_Amp)
11398     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11399   else
11400     First = getDerived().TransformExpr(E->getArg(0));
11401   if (First.isInvalid())
11402     return ExprError();
11403 
11404   ExprResult Second;
11405   if (E->getNumArgs() == 2) {
11406     Second = getDerived().TransformExpr(E->getArg(1));
11407     if (Second.isInvalid())
11408       return ExprError();
11409   }
11410 
11411   if (!getDerived().AlwaysRebuild() &&
11412       Callee.get() == E->getCallee() &&
11413       First.get() == E->getArg(0) &&
11414       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11415     return SemaRef.MaybeBindToTemporary(E);
11416 
11417   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11418   FPOptionsOverride NewOverrides(E->getFPFeatures());
11419   getSema().CurFPFeatures =
11420       NewOverrides.applyOverrides(getSema().getLangOpts());
11421   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11422 
11423   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11424                                                  E->getOperatorLoc(),
11425                                                  Callee.get(),
11426                                                  First.get(),
11427                                                  Second.get());
11428 }
11429 
11430 template<typename Derived>
11431 ExprResult
11432 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11433   return getDerived().TransformCallExpr(E);
11434 }
11435 
11436 template <typename Derived>
11437 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11438   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11439                          getSema().CurContext != E->getParentContext();
11440 
11441   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11442     return E;
11443 
11444   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11445                                            E->getEndLoc(),
11446                                            getSema().CurContext);
11447 }
11448 
11449 template<typename Derived>
11450 ExprResult
11451 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11452   // Transform the callee.
11453   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11454   if (Callee.isInvalid())
11455     return ExprError();
11456 
11457   // Transform exec config.
11458   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11459   if (EC.isInvalid())
11460     return ExprError();
11461 
11462   // Transform arguments.
11463   bool ArgChanged = false;
11464   SmallVector<Expr*, 8> Args;
11465   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11466                                   &ArgChanged))
11467     return ExprError();
11468 
11469   if (!getDerived().AlwaysRebuild() &&
11470       Callee.get() == E->getCallee() &&
11471       !ArgChanged)
11472     return SemaRef.MaybeBindToTemporary(E);
11473 
11474   // FIXME: Wrong source location information for the '('.
11475   SourceLocation FakeLParenLoc
11476     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11477   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11478                                       Args,
11479                                       E->getRParenLoc(), EC.get());
11480 }
11481 
11482 template<typename Derived>
11483 ExprResult
11484 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11485   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11486   if (!Type)
11487     return ExprError();
11488 
11489   ExprResult SubExpr
11490     = getDerived().TransformExpr(E->getSubExprAsWritten());
11491   if (SubExpr.isInvalid())
11492     return ExprError();
11493 
11494   if (!getDerived().AlwaysRebuild() &&
11495       Type == E->getTypeInfoAsWritten() &&
11496       SubExpr.get() == E->getSubExpr())
11497     return E;
11498   return getDerived().RebuildCXXNamedCastExpr(
11499       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11500       Type, E->getAngleBrackets().getEnd(),
11501       // FIXME. this should be '(' location
11502       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11503 }
11504 
11505 template<typename Derived>
11506 ExprResult
11507 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11508   TypeSourceInfo *TSI =
11509       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11510   if (!TSI)
11511     return ExprError();
11512 
11513   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11514   if (Sub.isInvalid())
11515     return ExprError();
11516 
11517   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11518                                                 Sub.get(), BCE->getEndLoc());
11519 }
11520 
11521 template<typename Derived>
11522 ExprResult
11523 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11524   return getDerived().TransformCXXNamedCastExpr(E);
11525 }
11526 
11527 template<typename Derived>
11528 ExprResult
11529 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11530   return getDerived().TransformCXXNamedCastExpr(E);
11531 }
11532 
11533 template<typename Derived>
11534 ExprResult
11535 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11536                                                       CXXReinterpretCastExpr *E) {
11537   return getDerived().TransformCXXNamedCastExpr(E);
11538 }
11539 
11540 template<typename Derived>
11541 ExprResult
11542 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11543   return getDerived().TransformCXXNamedCastExpr(E);
11544 }
11545 
11546 template<typename Derived>
11547 ExprResult
11548 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11549   return getDerived().TransformCXXNamedCastExpr(E);
11550 }
11551 
11552 template<typename Derived>
11553 ExprResult
11554 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11555                                                      CXXFunctionalCastExpr *E) {
11556   TypeSourceInfo *Type =
11557       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11558   if (!Type)
11559     return ExprError();
11560 
11561   ExprResult SubExpr
11562     = getDerived().TransformExpr(E->getSubExprAsWritten());
11563   if (SubExpr.isInvalid())
11564     return ExprError();
11565 
11566   if (!getDerived().AlwaysRebuild() &&
11567       Type == E->getTypeInfoAsWritten() &&
11568       SubExpr.get() == E->getSubExpr())
11569     return E;
11570 
11571   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11572                                                    E->getLParenLoc(),
11573                                                    SubExpr.get(),
11574                                                    E->getRParenLoc(),
11575                                                    E->isListInitialization());
11576 }
11577 
11578 template<typename Derived>
11579 ExprResult
11580 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11581   if (E->isTypeOperand()) {
11582     TypeSourceInfo *TInfo
11583       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11584     if (!TInfo)
11585       return ExprError();
11586 
11587     if (!getDerived().AlwaysRebuild() &&
11588         TInfo == E->getTypeOperandSourceInfo())
11589       return E;
11590 
11591     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11592                                              TInfo, E->getEndLoc());
11593   }
11594 
11595   // We don't know whether the subexpression is potentially evaluated until
11596   // after we perform semantic analysis.  We speculatively assume it is
11597   // unevaluated; it will get fixed later if the subexpression is in fact
11598   // potentially evaluated.
11599   EnterExpressionEvaluationContext Unevaluated(
11600       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11601       Sema::ReuseLambdaContextDecl);
11602 
11603   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11604   if (SubExpr.isInvalid())
11605     return ExprError();
11606 
11607   if (!getDerived().AlwaysRebuild() &&
11608       SubExpr.get() == E->getExprOperand())
11609     return E;
11610 
11611   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11612                                            SubExpr.get(), E->getEndLoc());
11613 }
11614 
11615 template<typename Derived>
11616 ExprResult
11617 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11618   if (E->isTypeOperand()) {
11619     TypeSourceInfo *TInfo
11620       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11621     if (!TInfo)
11622       return ExprError();
11623 
11624     if (!getDerived().AlwaysRebuild() &&
11625         TInfo == E->getTypeOperandSourceInfo())
11626       return E;
11627 
11628     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11629                                              TInfo, E->getEndLoc());
11630   }
11631 
11632   EnterExpressionEvaluationContext Unevaluated(
11633       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11634 
11635   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11636   if (SubExpr.isInvalid())
11637     return ExprError();
11638 
11639   if (!getDerived().AlwaysRebuild() &&
11640       SubExpr.get() == E->getExprOperand())
11641     return E;
11642 
11643   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11644                                            SubExpr.get(), E->getEndLoc());
11645 }
11646 
11647 template<typename Derived>
11648 ExprResult
11649 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11650   return E;
11651 }
11652 
11653 template<typename Derived>
11654 ExprResult
11655 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11656                                                      CXXNullPtrLiteralExpr *E) {
11657   return E;
11658 }
11659 
11660 template<typename Derived>
11661 ExprResult
11662 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11663   QualType T = getSema().getCurrentThisType();
11664 
11665   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11666     // Mark it referenced in the new context regardless.
11667     // FIXME: this is a bit instantiation-specific.
11668     getSema().MarkThisReferenced(E);
11669     return E;
11670   }
11671 
11672   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11673 }
11674 
11675 template<typename Derived>
11676 ExprResult
11677 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11678   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11679   if (SubExpr.isInvalid())
11680     return ExprError();
11681 
11682   if (!getDerived().AlwaysRebuild() &&
11683       SubExpr.get() == E->getSubExpr())
11684     return E;
11685 
11686   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11687                                           E->isThrownVariableInScope());
11688 }
11689 
11690 template<typename Derived>
11691 ExprResult
11692 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11693   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11694       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11695   if (!Param)
11696     return ExprError();
11697 
11698   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11699       E->getUsedContext() == SemaRef.CurContext)
11700     return E;
11701 
11702   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11703 }
11704 
11705 template<typename Derived>
11706 ExprResult
11707 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11708   FieldDecl *Field = cast_or_null<FieldDecl>(
11709       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11710   if (!Field)
11711     return ExprError();
11712 
11713   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11714       E->getUsedContext() == SemaRef.CurContext)
11715     return E;
11716 
11717   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11718 }
11719 
11720 template<typename Derived>
11721 ExprResult
11722 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11723                                                     CXXScalarValueInitExpr *E) {
11724   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11725   if (!T)
11726     return ExprError();
11727 
11728   if (!getDerived().AlwaysRebuild() &&
11729       T == E->getTypeSourceInfo())
11730     return E;
11731 
11732   return getDerived().RebuildCXXScalarValueInitExpr(T,
11733                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11734                                                     E->getRParenLoc());
11735 }
11736 
11737 template<typename Derived>
11738 ExprResult
11739 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11740   // Transform the type that we're allocating
11741   TypeSourceInfo *AllocTypeInfo =
11742       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11743   if (!AllocTypeInfo)
11744     return ExprError();
11745 
11746   // Transform the size of the array we're allocating (if any).
11747   Optional<Expr *> ArraySize;
11748   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11749     ExprResult NewArraySize;
11750     if (*OldArraySize) {
11751       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11752       if (NewArraySize.isInvalid())
11753         return ExprError();
11754     }
11755     ArraySize = NewArraySize.get();
11756   }
11757 
11758   // Transform the placement arguments (if any).
11759   bool ArgumentChanged = false;
11760   SmallVector<Expr*, 8> PlacementArgs;
11761   if (getDerived().TransformExprs(E->getPlacementArgs(),
11762                                   E->getNumPlacementArgs(), true,
11763                                   PlacementArgs, &ArgumentChanged))
11764     return ExprError();
11765 
11766   // Transform the initializer (if any).
11767   Expr *OldInit = E->getInitializer();
11768   ExprResult NewInit;
11769   if (OldInit)
11770     NewInit = getDerived().TransformInitializer(OldInit, true);
11771   if (NewInit.isInvalid())
11772     return ExprError();
11773 
11774   // Transform new operator and delete operator.
11775   FunctionDecl *OperatorNew = nullptr;
11776   if (E->getOperatorNew()) {
11777     OperatorNew = cast_or_null<FunctionDecl>(
11778         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11779     if (!OperatorNew)
11780       return ExprError();
11781   }
11782 
11783   FunctionDecl *OperatorDelete = nullptr;
11784   if (E->getOperatorDelete()) {
11785     OperatorDelete = cast_or_null<FunctionDecl>(
11786         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11787     if (!OperatorDelete)
11788       return ExprError();
11789   }
11790 
11791   if (!getDerived().AlwaysRebuild() &&
11792       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11793       ArraySize == E->getArraySize() &&
11794       NewInit.get() == OldInit &&
11795       OperatorNew == E->getOperatorNew() &&
11796       OperatorDelete == E->getOperatorDelete() &&
11797       !ArgumentChanged) {
11798     // Mark any declarations we need as referenced.
11799     // FIXME: instantiation-specific.
11800     if (OperatorNew)
11801       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11802     if (OperatorDelete)
11803       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11804 
11805     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11806       QualType ElementType
11807         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11808       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11809         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11810         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11811           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11812         }
11813       }
11814     }
11815 
11816     return E;
11817   }
11818 
11819   QualType AllocType = AllocTypeInfo->getType();
11820   if (!ArraySize) {
11821     // If no array size was specified, but the new expression was
11822     // instantiated with an array type (e.g., "new T" where T is
11823     // instantiated with "int[4]"), extract the outer bound from the
11824     // array type as our array size. We do this with constant and
11825     // dependently-sized array types.
11826     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11827     if (!ArrayT) {
11828       // Do nothing
11829     } else if (const ConstantArrayType *ConsArrayT
11830                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11831       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11832                                          SemaRef.Context.getSizeType(),
11833                                          /*FIXME:*/ E->getBeginLoc());
11834       AllocType = ConsArrayT->getElementType();
11835     } else if (const DependentSizedArrayType *DepArrayT
11836                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11837       if (DepArrayT->getSizeExpr()) {
11838         ArraySize = DepArrayT->getSizeExpr();
11839         AllocType = DepArrayT->getElementType();
11840       }
11841     }
11842   }
11843 
11844   return getDerived().RebuildCXXNewExpr(
11845       E->getBeginLoc(), E->isGlobalNew(),
11846       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11847       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11848       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11849 }
11850 
11851 template<typename Derived>
11852 ExprResult
11853 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11854   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11855   if (Operand.isInvalid())
11856     return ExprError();
11857 
11858   // Transform the delete operator, if known.
11859   FunctionDecl *OperatorDelete = nullptr;
11860   if (E->getOperatorDelete()) {
11861     OperatorDelete = cast_or_null<FunctionDecl>(
11862         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11863     if (!OperatorDelete)
11864       return ExprError();
11865   }
11866 
11867   if (!getDerived().AlwaysRebuild() &&
11868       Operand.get() == E->getArgument() &&
11869       OperatorDelete == E->getOperatorDelete()) {
11870     // Mark any declarations we need as referenced.
11871     // FIXME: instantiation-specific.
11872     if (OperatorDelete)
11873       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11874 
11875     if (!E->getArgument()->isTypeDependent()) {
11876       QualType Destroyed = SemaRef.Context.getBaseElementType(
11877                                                          E->getDestroyedType());
11878       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11879         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11880         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11881                                        SemaRef.LookupDestructor(Record));
11882       }
11883     }
11884 
11885     return E;
11886   }
11887 
11888   return getDerived().RebuildCXXDeleteExpr(
11889       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11890 }
11891 
11892 template<typename Derived>
11893 ExprResult
11894 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11895                                                      CXXPseudoDestructorExpr *E) {
11896   ExprResult Base = getDerived().TransformExpr(E->getBase());
11897   if (Base.isInvalid())
11898     return ExprError();
11899 
11900   ParsedType ObjectTypePtr;
11901   bool MayBePseudoDestructor = false;
11902   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11903                                               E->getOperatorLoc(),
11904                                         E->isArrow()? tok::arrow : tok::period,
11905                                               ObjectTypePtr,
11906                                               MayBePseudoDestructor);
11907   if (Base.isInvalid())
11908     return ExprError();
11909 
11910   QualType ObjectType = ObjectTypePtr.get();
11911   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11912   if (QualifierLoc) {
11913     QualifierLoc
11914       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11915     if (!QualifierLoc)
11916       return ExprError();
11917   }
11918   CXXScopeSpec SS;
11919   SS.Adopt(QualifierLoc);
11920 
11921   PseudoDestructorTypeStorage Destroyed;
11922   if (E->getDestroyedTypeInfo()) {
11923     TypeSourceInfo *DestroyedTypeInfo
11924       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11925                                                 ObjectType, nullptr, SS);
11926     if (!DestroyedTypeInfo)
11927       return ExprError();
11928     Destroyed = DestroyedTypeInfo;
11929   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11930     // We aren't likely to be able to resolve the identifier down to a type
11931     // now anyway, so just retain the identifier.
11932     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11933                                             E->getDestroyedTypeLoc());
11934   } else {
11935     // Look for a destructor known with the given name.
11936     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11937                                               *E->getDestroyedTypeIdentifier(),
11938                                                 E->getDestroyedTypeLoc(),
11939                                                 /*Scope=*/nullptr,
11940                                                 SS, ObjectTypePtr,
11941                                                 false);
11942     if (!T)
11943       return ExprError();
11944 
11945     Destroyed
11946       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11947                                                  E->getDestroyedTypeLoc());
11948   }
11949 
11950   TypeSourceInfo *ScopeTypeInfo = nullptr;
11951   if (E->getScopeTypeInfo()) {
11952     CXXScopeSpec EmptySS;
11953     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11954                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11955     if (!ScopeTypeInfo)
11956       return ExprError();
11957   }
11958 
11959   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11960                                                      E->getOperatorLoc(),
11961                                                      E->isArrow(),
11962                                                      SS,
11963                                                      ScopeTypeInfo,
11964                                                      E->getColonColonLoc(),
11965                                                      E->getTildeLoc(),
11966                                                      Destroyed);
11967 }
11968 
11969 template <typename Derived>
11970 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11971                                                         bool RequiresADL,
11972                                                         LookupResult &R) {
11973   // Transform all the decls.
11974   bool AllEmptyPacks = true;
11975   for (auto *OldD : Old->decls()) {
11976     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11977     if (!InstD) {
11978       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11979       // This can happen because of dependent hiding.
11980       if (isa<UsingShadowDecl>(OldD))
11981         continue;
11982       else {
11983         R.clear();
11984         return true;
11985       }
11986     }
11987 
11988     // Expand using pack declarations.
11989     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11990     ArrayRef<NamedDecl*> Decls = SingleDecl;
11991     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11992       Decls = UPD->expansions();
11993 
11994     // Expand using declarations.
11995     for (auto *D : Decls) {
11996       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11997         for (auto *SD : UD->shadows())
11998           R.addDecl(SD);
11999       } else {
12000         R.addDecl(D);
12001       }
12002     }
12003 
12004     AllEmptyPacks &= Decls.empty();
12005   };
12006 
12007   // C++ [temp.res]/8.4.2:
12008   //   The program is ill-formed, no diagnostic required, if [...] lookup for
12009   //   a name in the template definition found a using-declaration, but the
12010   //   lookup in the corresponding scope in the instantiation odoes not find
12011   //   any declarations because the using-declaration was a pack expansion and
12012   //   the corresponding pack is empty
12013   if (AllEmptyPacks && !RequiresADL) {
12014     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
12015         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
12016     return true;
12017   }
12018 
12019   // Resolve a kind, but don't do any further analysis.  If it's
12020   // ambiguous, the callee needs to deal with it.
12021   R.resolveKind();
12022   return false;
12023 }
12024 
12025 template<typename Derived>
12026 ExprResult
12027 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
12028                                                   UnresolvedLookupExpr *Old) {
12029   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
12030                  Sema::LookupOrdinaryName);
12031 
12032   // Transform the declaration set.
12033   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
12034     return ExprError();
12035 
12036   // Rebuild the nested-name qualifier, if present.
12037   CXXScopeSpec SS;
12038   if (Old->getQualifierLoc()) {
12039     NestedNameSpecifierLoc QualifierLoc
12040       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12041     if (!QualifierLoc)
12042       return ExprError();
12043 
12044     SS.Adopt(QualifierLoc);
12045   }
12046 
12047   if (Old->getNamingClass()) {
12048     CXXRecordDecl *NamingClass
12049       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12050                                                             Old->getNameLoc(),
12051                                                         Old->getNamingClass()));
12052     if (!NamingClass) {
12053       R.clear();
12054       return ExprError();
12055     }
12056 
12057     R.setNamingClass(NamingClass);
12058   }
12059 
12060   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12061 
12062   // If we have neither explicit template arguments, nor the template keyword,
12063   // it's a normal declaration name or member reference.
12064   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
12065     NamedDecl *D = R.getAsSingle<NamedDecl>();
12066     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
12067     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
12068     // give a good diagnostic.
12069     if (D && D->isCXXInstanceMember()) {
12070       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
12071                                                      /*TemplateArgs=*/nullptr,
12072                                                      /*Scope=*/nullptr);
12073     }
12074 
12075     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
12076   }
12077 
12078   // If we have template arguments, rebuild them, then rebuild the
12079   // templateid expression.
12080   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
12081   if (Old->hasExplicitTemplateArgs() &&
12082       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12083                                               Old->getNumTemplateArgs(),
12084                                               TransArgs)) {
12085     R.clear();
12086     return ExprError();
12087   }
12088 
12089   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
12090                                             Old->requiresADL(), &TransArgs);
12091 }
12092 
12093 template<typename Derived>
12094 ExprResult
12095 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
12096   bool ArgChanged = false;
12097   SmallVector<TypeSourceInfo *, 4> Args;
12098   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
12099     TypeSourceInfo *From = E->getArg(I);
12100     TypeLoc FromTL = From->getTypeLoc();
12101     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
12102       TypeLocBuilder TLB;
12103       TLB.reserve(FromTL.getFullDataSize());
12104       QualType To = getDerived().TransformType(TLB, FromTL);
12105       if (To.isNull())
12106         return ExprError();
12107 
12108       if (To == From->getType())
12109         Args.push_back(From);
12110       else {
12111         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12112         ArgChanged = true;
12113       }
12114       continue;
12115     }
12116 
12117     ArgChanged = true;
12118 
12119     // We have a pack expansion. Instantiate it.
12120     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12121     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12122     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12123     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12124 
12125     // Determine whether the set of unexpanded parameter packs can and should
12126     // be expanded.
12127     bool Expand = true;
12128     bool RetainExpansion = false;
12129     Optional<unsigned> OrigNumExpansions =
12130         ExpansionTL.getTypePtr()->getNumExpansions();
12131     Optional<unsigned> NumExpansions = OrigNumExpansions;
12132     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12133                                              PatternTL.getSourceRange(),
12134                                              Unexpanded,
12135                                              Expand, RetainExpansion,
12136                                              NumExpansions))
12137       return ExprError();
12138 
12139     if (!Expand) {
12140       // The transform has determined that we should perform a simple
12141       // transformation on the pack expansion, producing another pack
12142       // expansion.
12143       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12144 
12145       TypeLocBuilder TLB;
12146       TLB.reserve(From->getTypeLoc().getFullDataSize());
12147 
12148       QualType To = getDerived().TransformType(TLB, PatternTL);
12149       if (To.isNull())
12150         return ExprError();
12151 
12152       To = getDerived().RebuildPackExpansionType(To,
12153                                                  PatternTL.getSourceRange(),
12154                                                  ExpansionTL.getEllipsisLoc(),
12155                                                  NumExpansions);
12156       if (To.isNull())
12157         return ExprError();
12158 
12159       PackExpansionTypeLoc ToExpansionTL
12160         = TLB.push<PackExpansionTypeLoc>(To);
12161       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12162       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12163       continue;
12164     }
12165 
12166     // Expand the pack expansion by substituting for each argument in the
12167     // pack(s).
12168     for (unsigned I = 0; I != *NumExpansions; ++I) {
12169       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12170       TypeLocBuilder TLB;
12171       TLB.reserve(PatternTL.getFullDataSize());
12172       QualType To = getDerived().TransformType(TLB, PatternTL);
12173       if (To.isNull())
12174         return ExprError();
12175 
12176       if (To->containsUnexpandedParameterPack()) {
12177         To = getDerived().RebuildPackExpansionType(To,
12178                                                    PatternTL.getSourceRange(),
12179                                                    ExpansionTL.getEllipsisLoc(),
12180                                                    NumExpansions);
12181         if (To.isNull())
12182           return ExprError();
12183 
12184         PackExpansionTypeLoc ToExpansionTL
12185           = TLB.push<PackExpansionTypeLoc>(To);
12186         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12187       }
12188 
12189       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12190     }
12191 
12192     if (!RetainExpansion)
12193       continue;
12194 
12195     // If we're supposed to retain a pack expansion, do so by temporarily
12196     // forgetting the partially-substituted parameter pack.
12197     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12198 
12199     TypeLocBuilder TLB;
12200     TLB.reserve(From->getTypeLoc().getFullDataSize());
12201 
12202     QualType To = getDerived().TransformType(TLB, PatternTL);
12203     if (To.isNull())
12204       return ExprError();
12205 
12206     To = getDerived().RebuildPackExpansionType(To,
12207                                                PatternTL.getSourceRange(),
12208                                                ExpansionTL.getEllipsisLoc(),
12209                                                NumExpansions);
12210     if (To.isNull())
12211       return ExprError();
12212 
12213     PackExpansionTypeLoc ToExpansionTL
12214       = TLB.push<PackExpansionTypeLoc>(To);
12215     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12216     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12217   }
12218 
12219   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12220     return E;
12221 
12222   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12223                                        E->getEndLoc());
12224 }
12225 
12226 template<typename Derived>
12227 ExprResult
12228 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12229                                                  ConceptSpecializationExpr *E) {
12230   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12231   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12232   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12233                                               Old->NumTemplateArgs, TransArgs))
12234     return ExprError();
12235 
12236   return getDerived().RebuildConceptSpecializationExpr(
12237       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12238       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12239       &TransArgs);
12240 }
12241 
12242 template<typename Derived>
12243 ExprResult
12244 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12245   SmallVector<ParmVarDecl*, 4> TransParams;
12246   SmallVector<QualType, 4> TransParamTypes;
12247   Sema::ExtParameterInfoBuilder ExtParamInfos;
12248 
12249   // C++2a [expr.prim.req]p2
12250   // Expressions appearing within a requirement-body are unevaluated operands.
12251   EnterExpressionEvaluationContext Ctx(
12252       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12253 
12254   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12255       getSema().Context, getSema().CurContext,
12256       E->getBody()->getBeginLoc());
12257 
12258   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12259 
12260   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12261                                                E->getLocalParameters(),
12262                                                /*ParamTypes=*/nullptr,
12263                                                /*ParamInfos=*/nullptr,
12264                                                TransParamTypes, &TransParams,
12265                                                ExtParamInfos))
12266     return ExprError();
12267 
12268   for (ParmVarDecl *Param : TransParams)
12269     Param->setDeclContext(Body);
12270 
12271   SmallVector<concepts::Requirement *, 4> TransReqs;
12272   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12273                                                      TransReqs))
12274     return ExprError();
12275 
12276   for (concepts::Requirement *Req : TransReqs) {
12277     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12278       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12279         ER->getReturnTypeRequirement()
12280                 .getTypeConstraintTemplateParameterList()->getParam(0)
12281                 ->setDeclContext(Body);
12282       }
12283     }
12284   }
12285 
12286   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12287                                           TransParams, TransReqs,
12288                                           E->getRBraceLoc());
12289 }
12290 
12291 template<typename Derived>
12292 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12293     ArrayRef<concepts::Requirement *> Reqs,
12294     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12295   for (concepts::Requirement *Req : Reqs) {
12296     concepts::Requirement *TransReq = nullptr;
12297     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12298       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12299     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12300       TransReq = getDerived().TransformExprRequirement(ExprReq);
12301     else
12302       TransReq = getDerived().TransformNestedRequirement(
12303                      cast<concepts::NestedRequirement>(Req));
12304     if (!TransReq)
12305       return true;
12306     Transformed.push_back(TransReq);
12307   }
12308   return false;
12309 }
12310 
12311 template<typename Derived>
12312 concepts::TypeRequirement *
12313 TreeTransform<Derived>::TransformTypeRequirement(
12314     concepts::TypeRequirement *Req) {
12315   if (Req->isSubstitutionFailure()) {
12316     if (getDerived().AlwaysRebuild())
12317       return getDerived().RebuildTypeRequirement(
12318               Req->getSubstitutionDiagnostic());
12319     return Req;
12320   }
12321   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12322   if (!TransType)
12323     return nullptr;
12324   return getDerived().RebuildTypeRequirement(TransType);
12325 }
12326 
12327 template<typename Derived>
12328 concepts::ExprRequirement *
12329 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12330   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12331   if (Req->isExprSubstitutionFailure())
12332     TransExpr = Req->getExprSubstitutionDiagnostic();
12333   else {
12334     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12335     if (TransExprRes.isInvalid())
12336       return nullptr;
12337     TransExpr = TransExprRes.get();
12338   }
12339 
12340   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12341   const auto &RetReq = Req->getReturnTypeRequirement();
12342   if (RetReq.isEmpty())
12343     TransRetReq.emplace();
12344   else if (RetReq.isSubstitutionFailure())
12345     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12346   else if (RetReq.isTypeConstraint()) {
12347     TemplateParameterList *OrigTPL =
12348         RetReq.getTypeConstraintTemplateParameterList();
12349     TemplateParameterList *TPL =
12350         getDerived().TransformTemplateParameterList(OrigTPL);
12351     if (!TPL)
12352       return nullptr;
12353     TransRetReq.emplace(TPL);
12354   }
12355   assert(TransRetReq.hasValue() &&
12356          "All code paths leading here must set TransRetReq");
12357   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12358     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12359                                                Req->getNoexceptLoc(),
12360                                                std::move(*TransRetReq));
12361   return getDerived().RebuildExprRequirement(
12362       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12363       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12364 }
12365 
12366 template<typename Derived>
12367 concepts::NestedRequirement *
12368 TreeTransform<Derived>::TransformNestedRequirement(
12369     concepts::NestedRequirement *Req) {
12370   if (Req->isSubstitutionFailure()) {
12371     if (getDerived().AlwaysRebuild())
12372       return getDerived().RebuildNestedRequirement(
12373           Req->getSubstitutionDiagnostic());
12374     return Req;
12375   }
12376   ExprResult TransConstraint =
12377       getDerived().TransformExpr(Req->getConstraintExpr());
12378   if (TransConstraint.isInvalid())
12379     return nullptr;
12380   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12381 }
12382 
12383 template<typename Derived>
12384 ExprResult
12385 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12386   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12387   if (!T)
12388     return ExprError();
12389 
12390   if (!getDerived().AlwaysRebuild() &&
12391       T == E->getQueriedTypeSourceInfo())
12392     return E;
12393 
12394   ExprResult SubExpr;
12395   {
12396     EnterExpressionEvaluationContext Unevaluated(
12397         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12398     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12399     if (SubExpr.isInvalid())
12400       return ExprError();
12401 
12402     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12403       return E;
12404   }
12405 
12406   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12407                                             SubExpr.get(), E->getEndLoc());
12408 }
12409 
12410 template<typename Derived>
12411 ExprResult
12412 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12413   ExprResult SubExpr;
12414   {
12415     EnterExpressionEvaluationContext Unevaluated(
12416         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12417     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12418     if (SubExpr.isInvalid())
12419       return ExprError();
12420 
12421     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12422       return E;
12423   }
12424 
12425   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12426                                              SubExpr.get(), E->getEndLoc());
12427 }
12428 
12429 template <typename Derived>
12430 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12431     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12432     TypeSourceInfo **RecoveryTSI) {
12433   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12434       DRE, AddrTaken, RecoveryTSI);
12435 
12436   // Propagate both errors and recovered types, which return ExprEmpty.
12437   if (!NewDRE.isUsable())
12438     return NewDRE;
12439 
12440   // We got an expr, wrap it up in parens.
12441   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12442     return PE;
12443   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12444                                        PE->getRParen());
12445 }
12446 
12447 template <typename Derived>
12448 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12449     DependentScopeDeclRefExpr *E) {
12450   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12451                                             nullptr);
12452 }
12453 
12454 template<typename Derived>
12455 ExprResult
12456 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12457                                                DependentScopeDeclRefExpr *E,
12458                                                bool IsAddressOfOperand,
12459                                                TypeSourceInfo **RecoveryTSI) {
12460   assert(E->getQualifierLoc());
12461   NestedNameSpecifierLoc QualifierLoc
12462   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12463   if (!QualifierLoc)
12464     return ExprError();
12465   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12466 
12467   // TODO: If this is a conversion-function-id, verify that the
12468   // destination type name (if present) resolves the same way after
12469   // instantiation as it did in the local scope.
12470 
12471   DeclarationNameInfo NameInfo
12472     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12473   if (!NameInfo.getName())
12474     return ExprError();
12475 
12476   if (!E->hasExplicitTemplateArgs()) {
12477     if (!getDerived().AlwaysRebuild() &&
12478         QualifierLoc == E->getQualifierLoc() &&
12479         // Note: it is sufficient to compare the Name component of NameInfo:
12480         // if name has not changed, DNLoc has not changed either.
12481         NameInfo.getName() == E->getDeclName())
12482       return E;
12483 
12484     return getDerived().RebuildDependentScopeDeclRefExpr(
12485         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12486         IsAddressOfOperand, RecoveryTSI);
12487   }
12488 
12489   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12490   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12491                                               E->getNumTemplateArgs(),
12492                                               TransArgs))
12493     return ExprError();
12494 
12495   return getDerived().RebuildDependentScopeDeclRefExpr(
12496       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12497       RecoveryTSI);
12498 }
12499 
12500 template<typename Derived>
12501 ExprResult
12502 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12503   // CXXConstructExprs other than for list-initialization and
12504   // CXXTemporaryObjectExpr are always implicit, so when we have
12505   // a 1-argument construction we just transform that argument.
12506   if (getDerived().AllowSkippingCXXConstructExpr() &&
12507       ((E->getNumArgs() == 1 ||
12508         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12509        (!getDerived().DropCallArgument(E->getArg(0))) &&
12510        !E->isListInitialization()))
12511     return getDerived().TransformInitializer(E->getArg(0),
12512                                              /*DirectInit*/ false);
12513 
12514   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12515 
12516   QualType T = getDerived().TransformType(E->getType());
12517   if (T.isNull())
12518     return ExprError();
12519 
12520   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12521       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12522   if (!Constructor)
12523     return ExprError();
12524 
12525   bool ArgumentChanged = false;
12526   SmallVector<Expr*, 8> Args;
12527   {
12528     EnterExpressionEvaluationContext Context(
12529         getSema(), EnterExpressionEvaluationContext::InitList,
12530         E->isListInitialization());
12531     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12532                                     &ArgumentChanged))
12533       return ExprError();
12534   }
12535 
12536   if (!getDerived().AlwaysRebuild() &&
12537       T == E->getType() &&
12538       Constructor == E->getConstructor() &&
12539       !ArgumentChanged) {
12540     // Mark the constructor as referenced.
12541     // FIXME: Instantiation-specific
12542     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12543     return E;
12544   }
12545 
12546   return getDerived().RebuildCXXConstructExpr(
12547       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12548       E->hadMultipleCandidates(), E->isListInitialization(),
12549       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12550       E->getConstructionKind(), E->getParenOrBraceRange());
12551 }
12552 
12553 template<typename Derived>
12554 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12555     CXXInheritedCtorInitExpr *E) {
12556   QualType T = getDerived().TransformType(E->getType());
12557   if (T.isNull())
12558     return ExprError();
12559 
12560   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12561       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12562   if (!Constructor)
12563     return ExprError();
12564 
12565   if (!getDerived().AlwaysRebuild() &&
12566       T == E->getType() &&
12567       Constructor == E->getConstructor()) {
12568     // Mark the constructor as referenced.
12569     // FIXME: Instantiation-specific
12570     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12571     return E;
12572   }
12573 
12574   return getDerived().RebuildCXXInheritedCtorInitExpr(
12575       T, E->getLocation(), Constructor,
12576       E->constructsVBase(), E->inheritedFromVBase());
12577 }
12578 
12579 /// Transform a C++ temporary-binding expression.
12580 ///
12581 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12582 /// transform the subexpression and return that.
12583 template<typename Derived>
12584 ExprResult
12585 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12586   return getDerived().TransformExpr(E->getSubExpr());
12587 }
12588 
12589 /// Transform a C++ expression that contains cleanups that should
12590 /// be run after the expression is evaluated.
12591 ///
12592 /// Since ExprWithCleanups nodes are implicitly generated, we
12593 /// just transform the subexpression and return that.
12594 template<typename Derived>
12595 ExprResult
12596 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12597   return getDerived().TransformExpr(E->getSubExpr());
12598 }
12599 
12600 template<typename Derived>
12601 ExprResult
12602 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12603                                                     CXXTemporaryObjectExpr *E) {
12604   TypeSourceInfo *T =
12605       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12606   if (!T)
12607     return ExprError();
12608 
12609   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12610       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12611   if (!Constructor)
12612     return ExprError();
12613 
12614   bool ArgumentChanged = false;
12615   SmallVector<Expr*, 8> Args;
12616   Args.reserve(E->getNumArgs());
12617   {
12618     EnterExpressionEvaluationContext Context(
12619         getSema(), EnterExpressionEvaluationContext::InitList,
12620         E->isListInitialization());
12621     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12622                        &ArgumentChanged))
12623       return ExprError();
12624   }
12625 
12626   if (!getDerived().AlwaysRebuild() &&
12627       T == E->getTypeSourceInfo() &&
12628       Constructor == E->getConstructor() &&
12629       !ArgumentChanged) {
12630     // FIXME: Instantiation-specific
12631     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12632     return SemaRef.MaybeBindToTemporary(E);
12633   }
12634 
12635   // FIXME: We should just pass E->isListInitialization(), but we're not
12636   // prepared to handle list-initialization without a child InitListExpr.
12637   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12638   return getDerived().RebuildCXXTemporaryObjectExpr(
12639       T, LParenLoc, Args, E->getEndLoc(),
12640       /*ListInitialization=*/LParenLoc.isInvalid());
12641 }
12642 
12643 template<typename Derived>
12644 ExprResult
12645 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12646   // Transform any init-capture expressions before entering the scope of the
12647   // lambda body, because they are not semantically within that scope.
12648   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12649   struct TransformedInitCapture {
12650     // The location of the ... if the result is retaining a pack expansion.
12651     SourceLocation EllipsisLoc;
12652     // Zero or more expansions of the init-capture.
12653     SmallVector<InitCaptureInfoTy, 4> Expansions;
12654   };
12655   SmallVector<TransformedInitCapture, 4> InitCaptures;
12656   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12657   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12658                                     CEnd = E->capture_end();
12659        C != CEnd; ++C) {
12660     if (!E->isInitCapture(C))
12661       continue;
12662 
12663     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12664     VarDecl *OldVD = C->getCapturedVar();
12665 
12666     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12667                                 Optional<unsigned> NumExpansions) {
12668       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12669           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12670 
12671       if (NewExprInitResult.isInvalid()) {
12672         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12673         return;
12674       }
12675       Expr *NewExprInit = NewExprInitResult.get();
12676 
12677       QualType NewInitCaptureType =
12678           getSema().buildLambdaInitCaptureInitialization(
12679               C->getLocation(), OldVD->getType()->isReferenceType(),
12680               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12681               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12682               NewExprInit);
12683       Result.Expansions.push_back(
12684           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12685     };
12686 
12687     // If this is an init-capture pack, consider expanding the pack now.
12688     if (OldVD->isParameterPack()) {
12689       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12690                                              ->getTypeLoc()
12691                                              .castAs<PackExpansionTypeLoc>();
12692       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12693       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12694 
12695       // Determine whether the set of unexpanded parameter packs can and should
12696       // be expanded.
12697       bool Expand = true;
12698       bool RetainExpansion = false;
12699       Optional<unsigned> OrigNumExpansions =
12700           ExpansionTL.getTypePtr()->getNumExpansions();
12701       Optional<unsigned> NumExpansions = OrigNumExpansions;
12702       if (getDerived().TryExpandParameterPacks(
12703               ExpansionTL.getEllipsisLoc(),
12704               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12705               RetainExpansion, NumExpansions))
12706         return ExprError();
12707       if (Expand) {
12708         for (unsigned I = 0; I != *NumExpansions; ++I) {
12709           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12710           SubstInitCapture(SourceLocation(), None);
12711         }
12712       }
12713       if (!Expand || RetainExpansion) {
12714         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12715         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12716         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12717       }
12718     } else {
12719       SubstInitCapture(SourceLocation(), None);
12720     }
12721   }
12722 
12723   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12724   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12725 
12726   // Transform the template parameters, and add them to the current
12727   // instantiation scope. The null case is handled correctly.
12728   auto TPL = getDerived().TransformTemplateParameterList(
12729       E->getTemplateParameterList());
12730   LSI->GLTemplateParameterList = TPL;
12731 
12732   // Transform the type of the original lambda's call operator.
12733   // The transformation MUST be done in the CurrentInstantiationScope since
12734   // it introduces a mapping of the original to the newly created
12735   // transformed parameters.
12736   TypeSourceInfo *NewCallOpTSI = nullptr;
12737   {
12738     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12739     FunctionProtoTypeLoc OldCallOpFPTL =
12740         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12741 
12742     TypeLocBuilder NewCallOpTLBuilder;
12743     SmallVector<QualType, 4> ExceptionStorage;
12744     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12745     QualType NewCallOpType = TransformFunctionProtoType(
12746         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12747         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12748           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12749                                               ExceptionStorage, Changed);
12750         });
12751     if (NewCallOpType.isNull())
12752       return ExprError();
12753     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12754                                                         NewCallOpType);
12755   }
12756 
12757   // Transform the trailing requires clause
12758   ExprResult NewTrailingRequiresClause;
12759   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12760     // FIXME: Concepts: Substitution into requires clause should only happen
12761     //                  when checking satisfaction.
12762     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12763 
12764   // Create the local class that will describe the lambda.
12765   // FIXME: KnownDependent below is wrong when substituting inside a templated
12766   // context that isn't a DeclContext (such as a variable template).
12767   CXXRecordDecl *OldClass = E->getLambdaClass();
12768   CXXRecordDecl *Class
12769     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12770                                         NewCallOpTSI,
12771                                         /*KnownDependent=*/false,
12772                                         E->getCaptureDefault());
12773   getDerived().transformedLocalDecl(OldClass, {Class});
12774 
12775   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12776   if (getDerived().ReplacingOriginal())
12777     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12778                                OldClass->getLambdaManglingNumber(),
12779                                OldClass->getDeviceLambdaManglingNumber(),
12780                                OldClass->getLambdaContextDecl());
12781 
12782   // Build the call operator.
12783   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12784       Class, E->getIntroducerRange(), NewCallOpTSI,
12785       E->getCallOperator()->getEndLoc(),
12786       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12787       E->getCallOperator()->getConstexprKind(),
12788       NewTrailingRequiresClause.get());
12789 
12790   LSI->CallOperator = NewCallOperator;
12791 
12792   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12793   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12794 
12795   // Number the lambda for linkage purposes if necessary.
12796   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12797 
12798   // Introduce the context of the call operator.
12799   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12800                                  /*NewThisContext*/false);
12801 
12802   // Enter the scope of the lambda.
12803   getSema().buildLambdaScope(LSI, NewCallOperator,
12804                              E->getIntroducerRange(),
12805                              E->getCaptureDefault(),
12806                              E->getCaptureDefaultLoc(),
12807                              E->hasExplicitParameters(),
12808                              E->hasExplicitResultType(),
12809                              E->isMutable());
12810 
12811   bool Invalid = false;
12812 
12813   // Transform captures.
12814   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12815                                  CEnd = E->capture_end();
12816        C != CEnd; ++C) {
12817     // When we hit the first implicit capture, tell Sema that we've finished
12818     // the list of explicit captures.
12819     if (C->isImplicit())
12820       break;
12821 
12822     // Capturing 'this' is trivial.
12823     if (C->capturesThis()) {
12824       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12825                                     /*BuildAndDiagnose*/ true, nullptr,
12826                                     C->getCaptureKind() == LCK_StarThis);
12827       continue;
12828     }
12829     // Captured expression will be recaptured during captured variables
12830     // rebuilding.
12831     if (C->capturesVLAType())
12832       continue;
12833 
12834     // Rebuild init-captures, including the implied field declaration.
12835     if (E->isInitCapture(C)) {
12836       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12837 
12838       VarDecl *OldVD = C->getCapturedVar();
12839       llvm::SmallVector<Decl*, 4> NewVDs;
12840 
12841       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12842         ExprResult Init = Info.first;
12843         QualType InitQualType = Info.second;
12844         if (Init.isInvalid() || InitQualType.isNull()) {
12845           Invalid = true;
12846           break;
12847         }
12848         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12849             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12850             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12851         if (!NewVD) {
12852           Invalid = true;
12853           break;
12854         }
12855         NewVDs.push_back(NewVD);
12856         getSema().addInitCapture(LSI, NewVD);
12857       }
12858 
12859       if (Invalid)
12860         break;
12861 
12862       getDerived().transformedLocalDecl(OldVD, NewVDs);
12863       continue;
12864     }
12865 
12866     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12867 
12868     // Determine the capture kind for Sema.
12869     Sema::TryCaptureKind Kind
12870       = C->isImplicit()? Sema::TryCapture_Implicit
12871                        : C->getCaptureKind() == LCK_ByCopy
12872                            ? Sema::TryCapture_ExplicitByVal
12873                            : Sema::TryCapture_ExplicitByRef;
12874     SourceLocation EllipsisLoc;
12875     if (C->isPackExpansion()) {
12876       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12877       bool ShouldExpand = false;
12878       bool RetainExpansion = false;
12879       Optional<unsigned> NumExpansions;
12880       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12881                                                C->getLocation(),
12882                                                Unexpanded,
12883                                                ShouldExpand, RetainExpansion,
12884                                                NumExpansions)) {
12885         Invalid = true;
12886         continue;
12887       }
12888 
12889       if (ShouldExpand) {
12890         // The transform has determined that we should perform an expansion;
12891         // transform and capture each of the arguments.
12892         // expansion of the pattern. Do so.
12893         VarDecl *Pack = C->getCapturedVar();
12894         for (unsigned I = 0; I != *NumExpansions; ++I) {
12895           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12896           VarDecl *CapturedVar
12897             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12898                                                                Pack));
12899           if (!CapturedVar) {
12900             Invalid = true;
12901             continue;
12902           }
12903 
12904           // Capture the transformed variable.
12905           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12906         }
12907 
12908         // FIXME: Retain a pack expansion if RetainExpansion is true.
12909 
12910         continue;
12911       }
12912 
12913       EllipsisLoc = C->getEllipsisLoc();
12914     }
12915 
12916     // Transform the captured variable.
12917     VarDecl *CapturedVar
12918       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12919                                                          C->getCapturedVar()));
12920     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12921       Invalid = true;
12922       continue;
12923     }
12924 
12925     // Capture the transformed variable.
12926     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12927                                  EllipsisLoc);
12928   }
12929   getSema().finishLambdaExplicitCaptures(LSI);
12930 
12931   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12932   // evaluation context even if we're not transforming the function body.
12933   getSema().PushExpressionEvaluationContext(
12934       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12935 
12936   // Instantiate the body of the lambda expression.
12937   StmtResult Body =
12938       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12939 
12940   // ActOnLambda* will pop the function scope for us.
12941   FuncScopeCleanup.disable();
12942 
12943   if (Body.isInvalid()) {
12944     SavedContext.pop();
12945     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12946                                /*IsInstantiation=*/true);
12947     return ExprError();
12948   }
12949 
12950   // Copy the LSI before ActOnFinishFunctionBody removes it.
12951   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12952   // the call operator.
12953   auto LSICopy = *LSI;
12954   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12955                                     /*IsInstantiation*/ true);
12956   SavedContext.pop();
12957 
12958   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12959                                    &LSICopy);
12960 }
12961 
12962 template<typename Derived>
12963 StmtResult
12964 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12965   return TransformStmt(S);
12966 }
12967 
12968 template<typename Derived>
12969 StmtResult
12970 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12971   // Transform captures.
12972   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12973                                  CEnd = E->capture_end();
12974        C != CEnd; ++C) {
12975     // When we hit the first implicit capture, tell Sema that we've finished
12976     // the list of explicit captures.
12977     if (!C->isImplicit())
12978       continue;
12979 
12980     // Capturing 'this' is trivial.
12981     if (C->capturesThis()) {
12982       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12983                                     /*BuildAndDiagnose*/ true, nullptr,
12984                                     C->getCaptureKind() == LCK_StarThis);
12985       continue;
12986     }
12987     // Captured expression will be recaptured during captured variables
12988     // rebuilding.
12989     if (C->capturesVLAType())
12990       continue;
12991 
12992     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12993     assert(!E->isInitCapture(C) && "implicit init-capture?");
12994 
12995     // Transform the captured variable.
12996     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12997         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12998     if (!CapturedVar || CapturedVar->isInvalidDecl())
12999       return StmtError();
13000 
13001     // Capture the transformed variable.
13002     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
13003   }
13004 
13005   return S;
13006 }
13007 
13008 template<typename Derived>
13009 ExprResult
13010 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
13011                                                   CXXUnresolvedConstructExpr *E) {
13012   TypeSourceInfo *T =
13013       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
13014   if (!T)
13015     return ExprError();
13016 
13017   bool ArgumentChanged = false;
13018   SmallVector<Expr*, 8> Args;
13019   Args.reserve(E->getNumArgs());
13020   {
13021     EnterExpressionEvaluationContext Context(
13022         getSema(), EnterExpressionEvaluationContext::InitList,
13023         E->isListInitialization());
13024     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
13025                                     &ArgumentChanged))
13026       return ExprError();
13027   }
13028 
13029   if (!getDerived().AlwaysRebuild() &&
13030       T == E->getTypeSourceInfo() &&
13031       !ArgumentChanged)
13032     return E;
13033 
13034   // FIXME: we're faking the locations of the commas
13035   return getDerived().RebuildCXXUnresolvedConstructExpr(
13036       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
13037 }
13038 
13039 template<typename Derived>
13040 ExprResult
13041 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
13042                                              CXXDependentScopeMemberExpr *E) {
13043   // Transform the base of the expression.
13044   ExprResult Base((Expr*) nullptr);
13045   Expr *OldBase;
13046   QualType BaseType;
13047   QualType ObjectType;
13048   if (!E->isImplicitAccess()) {
13049     OldBase = E->getBase();
13050     Base = getDerived().TransformExpr(OldBase);
13051     if (Base.isInvalid())
13052       return ExprError();
13053 
13054     // Start the member reference and compute the object's type.
13055     ParsedType ObjectTy;
13056     bool MayBePseudoDestructor = false;
13057     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
13058                                                 E->getOperatorLoc(),
13059                                       E->isArrow()? tok::arrow : tok::period,
13060                                                 ObjectTy,
13061                                                 MayBePseudoDestructor);
13062     if (Base.isInvalid())
13063       return ExprError();
13064 
13065     ObjectType = ObjectTy.get();
13066     BaseType = ((Expr*) Base.get())->getType();
13067   } else {
13068     OldBase = nullptr;
13069     BaseType = getDerived().TransformType(E->getBaseType());
13070     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
13071   }
13072 
13073   // Transform the first part of the nested-name-specifier that qualifies
13074   // the member name.
13075   NamedDecl *FirstQualifierInScope
13076     = getDerived().TransformFirstQualifierInScope(
13077                                             E->getFirstQualifierFoundInScope(),
13078                                             E->getQualifierLoc().getBeginLoc());
13079 
13080   NestedNameSpecifierLoc QualifierLoc;
13081   if (E->getQualifier()) {
13082     QualifierLoc
13083       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
13084                                                      ObjectType,
13085                                                      FirstQualifierInScope);
13086     if (!QualifierLoc)
13087       return ExprError();
13088   }
13089 
13090   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
13091 
13092   // TODO: If this is a conversion-function-id, verify that the
13093   // destination type name (if present) resolves the same way after
13094   // instantiation as it did in the local scope.
13095 
13096   DeclarationNameInfo NameInfo
13097     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
13098   if (!NameInfo.getName())
13099     return ExprError();
13100 
13101   if (!E->hasExplicitTemplateArgs()) {
13102     // This is a reference to a member without an explicitly-specified
13103     // template argument list. Optimize for this common case.
13104     if (!getDerived().AlwaysRebuild() &&
13105         Base.get() == OldBase &&
13106         BaseType == E->getBaseType() &&
13107         QualifierLoc == E->getQualifierLoc() &&
13108         NameInfo.getName() == E->getMember() &&
13109         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
13110       return E;
13111 
13112     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13113                                                        BaseType,
13114                                                        E->isArrow(),
13115                                                        E->getOperatorLoc(),
13116                                                        QualifierLoc,
13117                                                        TemplateKWLoc,
13118                                                        FirstQualifierInScope,
13119                                                        NameInfo,
13120                                                        /*TemplateArgs*/nullptr);
13121   }
13122 
13123   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13124   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13125                                               E->getNumTemplateArgs(),
13126                                               TransArgs))
13127     return ExprError();
13128 
13129   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13130                                                      BaseType,
13131                                                      E->isArrow(),
13132                                                      E->getOperatorLoc(),
13133                                                      QualifierLoc,
13134                                                      TemplateKWLoc,
13135                                                      FirstQualifierInScope,
13136                                                      NameInfo,
13137                                                      &TransArgs);
13138 }
13139 
13140 template<typename Derived>
13141 ExprResult
13142 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
13143   // Transform the base of the expression.
13144   ExprResult Base((Expr*) nullptr);
13145   QualType BaseType;
13146   if (!Old->isImplicitAccess()) {
13147     Base = getDerived().TransformExpr(Old->getBase());
13148     if (Base.isInvalid())
13149       return ExprError();
13150     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
13151                                                      Old->isArrow());
13152     if (Base.isInvalid())
13153       return ExprError();
13154     BaseType = Base.get()->getType();
13155   } else {
13156     BaseType = getDerived().TransformType(Old->getBaseType());
13157   }
13158 
13159   NestedNameSpecifierLoc QualifierLoc;
13160   if (Old->getQualifierLoc()) {
13161     QualifierLoc
13162     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13163     if (!QualifierLoc)
13164       return ExprError();
13165   }
13166 
13167   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13168 
13169   LookupResult R(SemaRef, Old->getMemberNameInfo(),
13170                  Sema::LookupOrdinaryName);
13171 
13172   // Transform the declaration set.
13173   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
13174     return ExprError();
13175 
13176   // Determine the naming class.
13177   if (Old->getNamingClass()) {
13178     CXXRecordDecl *NamingClass
13179       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
13180                                                           Old->getMemberLoc(),
13181                                                         Old->getNamingClass()));
13182     if (!NamingClass)
13183       return ExprError();
13184 
13185     R.setNamingClass(NamingClass);
13186   }
13187 
13188   TemplateArgumentListInfo TransArgs;
13189   if (Old->hasExplicitTemplateArgs()) {
13190     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13191     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13192     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
13193                                                 Old->getNumTemplateArgs(),
13194                                                 TransArgs))
13195       return ExprError();
13196   }
13197 
13198   // FIXME: to do this check properly, we will need to preserve the
13199   // first-qualifier-in-scope here, just in case we had a dependent
13200   // base (and therefore couldn't do the check) and a
13201   // nested-name-qualifier (and therefore could do the lookup).
13202   NamedDecl *FirstQualifierInScope = nullptr;
13203 
13204   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
13205                                                   BaseType,
13206                                                   Old->getOperatorLoc(),
13207                                                   Old->isArrow(),
13208                                                   QualifierLoc,
13209                                                   TemplateKWLoc,
13210                                                   FirstQualifierInScope,
13211                                                   R,
13212                                               (Old->hasExplicitTemplateArgs()
13213                                                   ? &TransArgs : nullptr));
13214 }
13215 
13216 template<typename Derived>
13217 ExprResult
13218 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13219   EnterExpressionEvaluationContext Unevaluated(
13220       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13221   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13222   if (SubExpr.isInvalid())
13223     return ExprError();
13224 
13225   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13226     return E;
13227 
13228   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13229 }
13230 
13231 template<typename Derived>
13232 ExprResult
13233 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13234   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13235   if (Pattern.isInvalid())
13236     return ExprError();
13237 
13238   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13239     return E;
13240 
13241   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13242                                            E->getNumExpansions());
13243 }
13244 
13245 template<typename Derived>
13246 ExprResult
13247 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13248   // If E is not value-dependent, then nothing will change when we transform it.
13249   // Note: This is an instantiation-centric view.
13250   if (!E->isValueDependent())
13251     return E;
13252 
13253   EnterExpressionEvaluationContext Unevaluated(
13254       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13255 
13256   ArrayRef<TemplateArgument> PackArgs;
13257   TemplateArgument ArgStorage;
13258 
13259   // Find the argument list to transform.
13260   if (E->isPartiallySubstituted()) {
13261     PackArgs = E->getPartialArguments();
13262   } else if (E->isValueDependent()) {
13263     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13264     bool ShouldExpand = false;
13265     bool RetainExpansion = false;
13266     Optional<unsigned> NumExpansions;
13267     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13268                                              Unexpanded,
13269                                              ShouldExpand, RetainExpansion,
13270                                              NumExpansions))
13271       return ExprError();
13272 
13273     // If we need to expand the pack, build a template argument from it and
13274     // expand that.
13275     if (ShouldExpand) {
13276       auto *Pack = E->getPack();
13277       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13278         ArgStorage = getSema().Context.getPackExpansionType(
13279             getSema().Context.getTypeDeclType(TTPD), None);
13280       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13281         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13282       } else {
13283         auto *VD = cast<ValueDecl>(Pack);
13284         ExprResult DRE = getSema().BuildDeclRefExpr(
13285             VD, VD->getType().getNonLValueExprType(getSema().Context),
13286             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13287             E->getPackLoc());
13288         if (DRE.isInvalid())
13289           return ExprError();
13290         ArgStorage = new (getSema().Context) PackExpansionExpr(
13291             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13292       }
13293       PackArgs = ArgStorage;
13294     }
13295   }
13296 
13297   // If we're not expanding the pack, just transform the decl.
13298   if (!PackArgs.size()) {
13299     auto *Pack = cast_or_null<NamedDecl>(
13300         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13301     if (!Pack)
13302       return ExprError();
13303     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13304                                               E->getPackLoc(),
13305                                               E->getRParenLoc(), None, None);
13306   }
13307 
13308   // Try to compute the result without performing a partial substitution.
13309   Optional<unsigned> Result = 0;
13310   for (const TemplateArgument &Arg : PackArgs) {
13311     if (!Arg.isPackExpansion()) {
13312       Result = *Result + 1;
13313       continue;
13314     }
13315 
13316     TemplateArgumentLoc ArgLoc;
13317     InventTemplateArgumentLoc(Arg, ArgLoc);
13318 
13319     // Find the pattern of the pack expansion.
13320     SourceLocation Ellipsis;
13321     Optional<unsigned> OrigNumExpansions;
13322     TemplateArgumentLoc Pattern =
13323         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13324                                                           OrigNumExpansions);
13325 
13326     // Substitute under the pack expansion. Do not expand the pack (yet).
13327     TemplateArgumentLoc OutPattern;
13328     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13329     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13330                                                /*Uneval*/ true))
13331       return true;
13332 
13333     // See if we can determine the number of arguments from the result.
13334     Optional<unsigned> NumExpansions =
13335         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13336     if (!NumExpansions) {
13337       // No: we must be in an alias template expansion, and we're going to need
13338       // to actually expand the packs.
13339       Result = None;
13340       break;
13341     }
13342 
13343     Result = *Result + *NumExpansions;
13344   }
13345 
13346   // Common case: we could determine the number of expansions without
13347   // substituting.
13348   if (Result)
13349     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13350                                               E->getPackLoc(),
13351                                               E->getRParenLoc(), *Result, None);
13352 
13353   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13354                                                E->getPackLoc());
13355   {
13356     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13357     typedef TemplateArgumentLocInventIterator<
13358         Derived, const TemplateArgument*> PackLocIterator;
13359     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13360                                    PackLocIterator(*this, PackArgs.end()),
13361                                    TransformedPackArgs, /*Uneval*/true))
13362       return ExprError();
13363   }
13364 
13365   // Check whether we managed to fully-expand the pack.
13366   // FIXME: Is it possible for us to do so and not hit the early exit path?
13367   SmallVector<TemplateArgument, 8> Args;
13368   bool PartialSubstitution = false;
13369   for (auto &Loc : TransformedPackArgs.arguments()) {
13370     Args.push_back(Loc.getArgument());
13371     if (Loc.getArgument().isPackExpansion())
13372       PartialSubstitution = true;
13373   }
13374 
13375   if (PartialSubstitution)
13376     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13377                                               E->getPackLoc(),
13378                                               E->getRParenLoc(), None, Args);
13379 
13380   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13381                                             E->getPackLoc(), E->getRParenLoc(),
13382                                             Args.size(), None);
13383 }
13384 
13385 template<typename Derived>
13386 ExprResult
13387 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13388                                           SubstNonTypeTemplateParmPackExpr *E) {
13389   // Default behavior is to do nothing with this transformation.
13390   return E;
13391 }
13392 
13393 template<typename Derived>
13394 ExprResult
13395 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13396                                           SubstNonTypeTemplateParmExpr *E) {
13397   // Default behavior is to do nothing with this transformation.
13398   return E;
13399 }
13400 
13401 template<typename Derived>
13402 ExprResult
13403 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13404   // Default behavior is to do nothing with this transformation.
13405   return E;
13406 }
13407 
13408 template<typename Derived>
13409 ExprResult
13410 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13411                                                   MaterializeTemporaryExpr *E) {
13412   return getDerived().TransformExpr(E->getSubExpr());
13413 }
13414 
13415 template<typename Derived>
13416 ExprResult
13417 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13418   UnresolvedLookupExpr *Callee = nullptr;
13419   if (Expr *OldCallee = E->getCallee()) {
13420     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13421     if (CalleeResult.isInvalid())
13422       return ExprError();
13423     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13424   }
13425 
13426   Expr *Pattern = E->getPattern();
13427 
13428   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13429   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13430   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13431 
13432   // Determine whether the set of unexpanded parameter packs can and should
13433   // be expanded.
13434   bool Expand = true;
13435   bool RetainExpansion = false;
13436   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13437                      NumExpansions = OrigNumExpansions;
13438   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13439                                            Pattern->getSourceRange(),
13440                                            Unexpanded,
13441                                            Expand, RetainExpansion,
13442                                            NumExpansions))
13443     return true;
13444 
13445   if (!Expand) {
13446     // Do not expand any packs here, just transform and rebuild a fold
13447     // expression.
13448     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13449 
13450     ExprResult LHS =
13451         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13452     if (LHS.isInvalid())
13453       return true;
13454 
13455     ExprResult RHS =
13456         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13457     if (RHS.isInvalid())
13458       return true;
13459 
13460     if (!getDerived().AlwaysRebuild() &&
13461         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13462       return E;
13463 
13464     return getDerived().RebuildCXXFoldExpr(
13465         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13466         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13467   }
13468 
13469   // Formally a fold expression expands to nested parenthesized expressions.
13470   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13471   // them.
13472   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13473     SemaRef.Diag(E->getEllipsisLoc(),
13474                  clang::diag::err_fold_expression_limit_exceeded)
13475         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13476         << E->getSourceRange();
13477     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13478     return ExprError();
13479   }
13480 
13481   // The transform has determined that we should perform an elementwise
13482   // expansion of the pattern. Do so.
13483   ExprResult Result = getDerived().TransformExpr(E->getInit());
13484   if (Result.isInvalid())
13485     return true;
13486   bool LeftFold = E->isLeftFold();
13487 
13488   // If we're retaining an expansion for a right fold, it is the innermost
13489   // component and takes the init (if any).
13490   if (!LeftFold && RetainExpansion) {
13491     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13492 
13493     ExprResult Out = getDerived().TransformExpr(Pattern);
13494     if (Out.isInvalid())
13495       return true;
13496 
13497     Result = getDerived().RebuildCXXFoldExpr(
13498         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13499         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13500     if (Result.isInvalid())
13501       return true;
13502   }
13503 
13504   for (unsigned I = 0; I != *NumExpansions; ++I) {
13505     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13506         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13507     ExprResult Out = getDerived().TransformExpr(Pattern);
13508     if (Out.isInvalid())
13509       return true;
13510 
13511     if (Out.get()->containsUnexpandedParameterPack()) {
13512       // We still have a pack; retain a pack expansion for this slice.
13513       Result = getDerived().RebuildCXXFoldExpr(
13514           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13515           E->getOperator(), E->getEllipsisLoc(),
13516           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13517           OrigNumExpansions);
13518     } else if (Result.isUsable()) {
13519       // We've got down to a single element; build a binary operator.
13520       Expr *LHS = LeftFold ? Result.get() : Out.get();
13521       Expr *RHS = LeftFold ? Out.get() : Result.get();
13522       if (Callee)
13523         Result = getDerived().RebuildCXXOperatorCallExpr(
13524             BinaryOperator::getOverloadedOperator(E->getOperator()),
13525             E->getEllipsisLoc(), Callee, LHS, RHS);
13526       else
13527         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13528                                                     E->getOperator(), LHS, RHS);
13529     } else
13530       Result = Out;
13531 
13532     if (Result.isInvalid())
13533       return true;
13534   }
13535 
13536   // If we're retaining an expansion for a left fold, it is the outermost
13537   // component and takes the complete expansion so far as its init (if any).
13538   if (LeftFold && RetainExpansion) {
13539     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13540 
13541     ExprResult Out = getDerived().TransformExpr(Pattern);
13542     if (Out.isInvalid())
13543       return true;
13544 
13545     Result = getDerived().RebuildCXXFoldExpr(
13546         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13547         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13548     if (Result.isInvalid())
13549       return true;
13550   }
13551 
13552   // If we had no init and an empty pack, and we're not retaining an expansion,
13553   // then produce a fallback value or error.
13554   if (Result.isUnset())
13555     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13556                                                 E->getOperator());
13557 
13558   return Result;
13559 }
13560 
13561 template<typename Derived>
13562 ExprResult
13563 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13564     CXXStdInitializerListExpr *E) {
13565   return getDerived().TransformExpr(E->getSubExpr());
13566 }
13567 
13568 template<typename Derived>
13569 ExprResult
13570 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13571   return SemaRef.MaybeBindToTemporary(E);
13572 }
13573 
13574 template<typename Derived>
13575 ExprResult
13576 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13577   return E;
13578 }
13579 
13580 template<typename Derived>
13581 ExprResult
13582 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13583   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13584   if (SubExpr.isInvalid())
13585     return ExprError();
13586 
13587   if (!getDerived().AlwaysRebuild() &&
13588       SubExpr.get() == E->getSubExpr())
13589     return E;
13590 
13591   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13592 }
13593 
13594 template<typename Derived>
13595 ExprResult
13596 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13597   // Transform each of the elements.
13598   SmallVector<Expr *, 8> Elements;
13599   bool ArgChanged = false;
13600   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13601                                   /*IsCall=*/false, Elements, &ArgChanged))
13602     return ExprError();
13603 
13604   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13605     return SemaRef.MaybeBindToTemporary(E);
13606 
13607   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13608                                               Elements.data(),
13609                                               Elements.size());
13610 }
13611 
13612 template<typename Derived>
13613 ExprResult
13614 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13615                                                     ObjCDictionaryLiteral *E) {
13616   // Transform each of the elements.
13617   SmallVector<ObjCDictionaryElement, 8> Elements;
13618   bool ArgChanged = false;
13619   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13620     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13621 
13622     if (OrigElement.isPackExpansion()) {
13623       // This key/value element is a pack expansion.
13624       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13625       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13626       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13627       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13628 
13629       // Determine whether the set of unexpanded parameter packs can
13630       // and should be expanded.
13631       bool Expand = true;
13632       bool RetainExpansion = false;
13633       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13634       Optional<unsigned> NumExpansions = OrigNumExpansions;
13635       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13636                                OrigElement.Value->getEndLoc());
13637       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13638                                                PatternRange, Unexpanded, Expand,
13639                                                RetainExpansion, NumExpansions))
13640         return ExprError();
13641 
13642       if (!Expand) {
13643         // The transform has determined that we should perform a simple
13644         // transformation on the pack expansion, producing another pack
13645         // expansion.
13646         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13647         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13648         if (Key.isInvalid())
13649           return ExprError();
13650 
13651         if (Key.get() != OrigElement.Key)
13652           ArgChanged = true;
13653 
13654         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13655         if (Value.isInvalid())
13656           return ExprError();
13657 
13658         if (Value.get() != OrigElement.Value)
13659           ArgChanged = true;
13660 
13661         ObjCDictionaryElement Expansion = {
13662           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13663         };
13664         Elements.push_back(Expansion);
13665         continue;
13666       }
13667 
13668       // Record right away that the argument was changed.  This needs
13669       // to happen even if the array expands to nothing.
13670       ArgChanged = true;
13671 
13672       // The transform has determined that we should perform an elementwise
13673       // expansion of the pattern. Do so.
13674       for (unsigned I = 0; I != *NumExpansions; ++I) {
13675         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13676         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13677         if (Key.isInvalid())
13678           return ExprError();
13679 
13680         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13681         if (Value.isInvalid())
13682           return ExprError();
13683 
13684         ObjCDictionaryElement Element = {
13685           Key.get(), Value.get(), SourceLocation(), NumExpansions
13686         };
13687 
13688         // If any unexpanded parameter packs remain, we still have a
13689         // pack expansion.
13690         // FIXME: Can this really happen?
13691         if (Key.get()->containsUnexpandedParameterPack() ||
13692             Value.get()->containsUnexpandedParameterPack())
13693           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13694 
13695         Elements.push_back(Element);
13696       }
13697 
13698       // FIXME: Retain a pack expansion if RetainExpansion is true.
13699 
13700       // We've finished with this pack expansion.
13701       continue;
13702     }
13703 
13704     // Transform and check key.
13705     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13706     if (Key.isInvalid())
13707       return ExprError();
13708 
13709     if (Key.get() != OrigElement.Key)
13710       ArgChanged = true;
13711 
13712     // Transform and check value.
13713     ExprResult Value
13714       = getDerived().TransformExpr(OrigElement.Value);
13715     if (Value.isInvalid())
13716       return ExprError();
13717 
13718     if (Value.get() != OrigElement.Value)
13719       ArgChanged = true;
13720 
13721     ObjCDictionaryElement Element = {
13722       Key.get(), Value.get(), SourceLocation(), None
13723     };
13724     Elements.push_back(Element);
13725   }
13726 
13727   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13728     return SemaRef.MaybeBindToTemporary(E);
13729 
13730   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13731                                                    Elements);
13732 }
13733 
13734 template<typename Derived>
13735 ExprResult
13736 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13737   TypeSourceInfo *EncodedTypeInfo
13738     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13739   if (!EncodedTypeInfo)
13740     return ExprError();
13741 
13742   if (!getDerived().AlwaysRebuild() &&
13743       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13744     return E;
13745 
13746   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13747                                             EncodedTypeInfo,
13748                                             E->getRParenLoc());
13749 }
13750 
13751 template<typename Derived>
13752 ExprResult TreeTransform<Derived>::
13753 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13754   // This is a kind of implicit conversion, and it needs to get dropped
13755   // and recomputed for the same general reasons that ImplicitCastExprs
13756   // do, as well a more specific one: this expression is only valid when
13757   // it appears *immediately* as an argument expression.
13758   return getDerived().TransformExpr(E->getSubExpr());
13759 }
13760 
13761 template<typename Derived>
13762 ExprResult TreeTransform<Derived>::
13763 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13764   TypeSourceInfo *TSInfo
13765     = getDerived().TransformType(E->getTypeInfoAsWritten());
13766   if (!TSInfo)
13767     return ExprError();
13768 
13769   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13770   if (Result.isInvalid())
13771     return ExprError();
13772 
13773   if (!getDerived().AlwaysRebuild() &&
13774       TSInfo == E->getTypeInfoAsWritten() &&
13775       Result.get() == E->getSubExpr())
13776     return E;
13777 
13778   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13779                                       E->getBridgeKeywordLoc(), TSInfo,
13780                                       Result.get());
13781 }
13782 
13783 template <typename Derived>
13784 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13785     ObjCAvailabilityCheckExpr *E) {
13786   return E;
13787 }
13788 
13789 template<typename Derived>
13790 ExprResult
13791 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13792   // Transform arguments.
13793   bool ArgChanged = false;
13794   SmallVector<Expr*, 8> Args;
13795   Args.reserve(E->getNumArgs());
13796   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13797                                   &ArgChanged))
13798     return ExprError();
13799 
13800   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13801     // Class message: transform the receiver type.
13802     TypeSourceInfo *ReceiverTypeInfo
13803       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13804     if (!ReceiverTypeInfo)
13805       return ExprError();
13806 
13807     // If nothing changed, just retain the existing message send.
13808     if (!getDerived().AlwaysRebuild() &&
13809         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13810       return SemaRef.MaybeBindToTemporary(E);
13811 
13812     // Build a new class message send.
13813     SmallVector<SourceLocation, 16> SelLocs;
13814     E->getSelectorLocs(SelLocs);
13815     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13816                                                E->getSelector(),
13817                                                SelLocs,
13818                                                E->getMethodDecl(),
13819                                                E->getLeftLoc(),
13820                                                Args,
13821                                                E->getRightLoc());
13822   }
13823   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13824            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13825     if (!E->getMethodDecl())
13826       return ExprError();
13827 
13828     // Build a new class message send to 'super'.
13829     SmallVector<SourceLocation, 16> SelLocs;
13830     E->getSelectorLocs(SelLocs);
13831     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13832                                                E->getSelector(),
13833                                                SelLocs,
13834                                                E->getReceiverType(),
13835                                                E->getMethodDecl(),
13836                                                E->getLeftLoc(),
13837                                                Args,
13838                                                E->getRightLoc());
13839   }
13840 
13841   // Instance message: transform the receiver
13842   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13843          "Only class and instance messages may be instantiated");
13844   ExprResult Receiver
13845     = getDerived().TransformExpr(E->getInstanceReceiver());
13846   if (Receiver.isInvalid())
13847     return ExprError();
13848 
13849   // If nothing changed, just retain the existing message send.
13850   if (!getDerived().AlwaysRebuild() &&
13851       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13852     return SemaRef.MaybeBindToTemporary(E);
13853 
13854   // Build a new instance message send.
13855   SmallVector<SourceLocation, 16> SelLocs;
13856   E->getSelectorLocs(SelLocs);
13857   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13858                                              E->getSelector(),
13859                                              SelLocs,
13860                                              E->getMethodDecl(),
13861                                              E->getLeftLoc(),
13862                                              Args,
13863                                              E->getRightLoc());
13864 }
13865 
13866 template<typename Derived>
13867 ExprResult
13868 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13869   return E;
13870 }
13871 
13872 template<typename Derived>
13873 ExprResult
13874 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13875   return E;
13876 }
13877 
13878 template<typename Derived>
13879 ExprResult
13880 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13881   // Transform the base expression.
13882   ExprResult Base = getDerived().TransformExpr(E->getBase());
13883   if (Base.isInvalid())
13884     return ExprError();
13885 
13886   // We don't need to transform the ivar; it will never change.
13887 
13888   // If nothing changed, just retain the existing expression.
13889   if (!getDerived().AlwaysRebuild() &&
13890       Base.get() == E->getBase())
13891     return E;
13892 
13893   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13894                                              E->getLocation(),
13895                                              E->isArrow(), E->isFreeIvar());
13896 }
13897 
13898 template<typename Derived>
13899 ExprResult
13900 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13901   // 'super' and types never change. Property never changes. Just
13902   // retain the existing expression.
13903   if (!E->isObjectReceiver())
13904     return E;
13905 
13906   // Transform the base expression.
13907   ExprResult Base = getDerived().TransformExpr(E->getBase());
13908   if (Base.isInvalid())
13909     return ExprError();
13910 
13911   // We don't need to transform the property; it will never change.
13912 
13913   // If nothing changed, just retain the existing expression.
13914   if (!getDerived().AlwaysRebuild() &&
13915       Base.get() == E->getBase())
13916     return E;
13917 
13918   if (E->isExplicitProperty())
13919     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13920                                                    E->getExplicitProperty(),
13921                                                    E->getLocation());
13922 
13923   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13924                                                  SemaRef.Context.PseudoObjectTy,
13925                                                  E->getImplicitPropertyGetter(),
13926                                                  E->getImplicitPropertySetter(),
13927                                                  E->getLocation());
13928 }
13929 
13930 template<typename Derived>
13931 ExprResult
13932 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13933   // Transform the base expression.
13934   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13935   if (Base.isInvalid())
13936     return ExprError();
13937 
13938   // Transform the key expression.
13939   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13940   if (Key.isInvalid())
13941     return ExprError();
13942 
13943   // If nothing changed, just retain the existing expression.
13944   if (!getDerived().AlwaysRebuild() &&
13945       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13946     return E;
13947 
13948   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13949                                                   Base.get(), Key.get(),
13950                                                   E->getAtIndexMethodDecl(),
13951                                                   E->setAtIndexMethodDecl());
13952 }
13953 
13954 template<typename Derived>
13955 ExprResult
13956 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13957   // Transform the base expression.
13958   ExprResult Base = getDerived().TransformExpr(E->getBase());
13959   if (Base.isInvalid())
13960     return ExprError();
13961 
13962   // If nothing changed, just retain the existing expression.
13963   if (!getDerived().AlwaysRebuild() &&
13964       Base.get() == E->getBase())
13965     return E;
13966 
13967   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13968                                          E->getOpLoc(),
13969                                          E->isArrow());
13970 }
13971 
13972 template<typename Derived>
13973 ExprResult
13974 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13975   bool ArgumentChanged = false;
13976   SmallVector<Expr*, 8> SubExprs;
13977   SubExprs.reserve(E->getNumSubExprs());
13978   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13979                                   SubExprs, &ArgumentChanged))
13980     return ExprError();
13981 
13982   if (!getDerived().AlwaysRebuild() &&
13983       !ArgumentChanged)
13984     return E;
13985 
13986   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13987                                                SubExprs,
13988                                                E->getRParenLoc());
13989 }
13990 
13991 template<typename Derived>
13992 ExprResult
13993 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13994   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13995   if (SrcExpr.isInvalid())
13996     return ExprError();
13997 
13998   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13999   if (!Type)
14000     return ExprError();
14001 
14002   if (!getDerived().AlwaysRebuild() &&
14003       Type == E->getTypeSourceInfo() &&
14004       SrcExpr.get() == E->getSrcExpr())
14005     return E;
14006 
14007   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
14008                                                SrcExpr.get(), Type,
14009                                                E->getRParenLoc());
14010 }
14011 
14012 template<typename Derived>
14013 ExprResult
14014 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
14015   BlockDecl *oldBlock = E->getBlockDecl();
14016 
14017   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
14018   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
14019 
14020   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
14021   blockScope->TheDecl->setBlockMissingReturnType(
14022                          oldBlock->blockMissingReturnType());
14023 
14024   SmallVector<ParmVarDecl*, 4> params;
14025   SmallVector<QualType, 4> paramTypes;
14026 
14027   const FunctionProtoType *exprFunctionType = E->getFunctionType();
14028 
14029   // Parameter substitution.
14030   Sema::ExtParameterInfoBuilder extParamInfos;
14031   if (getDerived().TransformFunctionTypeParams(
14032           E->getCaretLocation(), oldBlock->parameters(), nullptr,
14033           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
14034           extParamInfos)) {
14035     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14036     return ExprError();
14037   }
14038 
14039   QualType exprResultType =
14040       getDerived().TransformType(exprFunctionType->getReturnType());
14041 
14042   auto epi = exprFunctionType->getExtProtoInfo();
14043   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
14044 
14045   QualType functionType =
14046     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
14047   blockScope->FunctionType = functionType;
14048 
14049   // Set the parameters on the block decl.
14050   if (!params.empty())
14051     blockScope->TheDecl->setParams(params);
14052 
14053   if (!oldBlock->blockMissingReturnType()) {
14054     blockScope->HasImplicitReturnType = false;
14055     blockScope->ReturnType = exprResultType;
14056   }
14057 
14058   // Transform the body
14059   StmtResult body = getDerived().TransformStmt(E->getBody());
14060   if (body.isInvalid()) {
14061     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
14062     return ExprError();
14063   }
14064 
14065 #ifndef NDEBUG
14066   // In builds with assertions, make sure that we captured everything we
14067   // captured before.
14068   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
14069     for (const auto &I : oldBlock->captures()) {
14070       VarDecl *oldCapture = I.getVariable();
14071 
14072       // Ignore parameter packs.
14073       if (oldCapture->isParameterPack())
14074         continue;
14075 
14076       VarDecl *newCapture =
14077         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
14078                                                  oldCapture));
14079       assert(blockScope->CaptureMap.count(newCapture));
14080     }
14081     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
14082   }
14083 #endif
14084 
14085   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
14086                                     /*Scope=*/nullptr);
14087 }
14088 
14089 template<typename Derived>
14090 ExprResult
14091 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
14092   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
14093   if (SrcExpr.isInvalid())
14094     return ExprError();
14095 
14096   QualType Type = getDerived().TransformType(E->getType());
14097 
14098   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
14099                                  E->getRParenLoc());
14100 }
14101 
14102 template<typename Derived>
14103 ExprResult
14104 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
14105   bool ArgumentChanged = false;
14106   SmallVector<Expr*, 8> SubExprs;
14107   SubExprs.reserve(E->getNumSubExprs());
14108   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
14109                                   SubExprs, &ArgumentChanged))
14110     return ExprError();
14111 
14112   if (!getDerived().AlwaysRebuild() &&
14113       !ArgumentChanged)
14114     return E;
14115 
14116   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
14117                                         E->getOp(), E->getRParenLoc());
14118 }
14119 
14120 //===----------------------------------------------------------------------===//
14121 // Type reconstruction
14122 //===----------------------------------------------------------------------===//
14123 
14124 template<typename Derived>
14125 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14126                                                     SourceLocation Star) {
14127   return SemaRef.BuildPointerType(PointeeType, Star,
14128                                   getDerived().getBaseEntity());
14129 }
14130 
14131 template<typename Derived>
14132 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14133                                                          SourceLocation Star) {
14134   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14135                                        getDerived().getBaseEntity());
14136 }
14137 
14138 template<typename Derived>
14139 QualType
14140 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14141                                              bool WrittenAsLValue,
14142                                              SourceLocation Sigil) {
14143   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14144                                     Sigil, getDerived().getBaseEntity());
14145 }
14146 
14147 template<typename Derived>
14148 QualType
14149 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14150                                                  QualType ClassType,
14151                                                  SourceLocation Sigil) {
14152   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14153                                         getDerived().getBaseEntity());
14154 }
14155 
14156 template<typename Derived>
14157 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14158            const ObjCTypeParamDecl *Decl,
14159            SourceLocation ProtocolLAngleLoc,
14160            ArrayRef<ObjCProtocolDecl *> Protocols,
14161            ArrayRef<SourceLocation> ProtocolLocs,
14162            SourceLocation ProtocolRAngleLoc) {
14163   return SemaRef.BuildObjCTypeParamType(Decl,
14164                                         ProtocolLAngleLoc, Protocols,
14165                                         ProtocolLocs, ProtocolRAngleLoc,
14166                                         /*FailOnError=*/true);
14167 }
14168 
14169 template<typename Derived>
14170 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14171            QualType BaseType,
14172            SourceLocation Loc,
14173            SourceLocation TypeArgsLAngleLoc,
14174            ArrayRef<TypeSourceInfo *> TypeArgs,
14175            SourceLocation TypeArgsRAngleLoc,
14176            SourceLocation ProtocolLAngleLoc,
14177            ArrayRef<ObjCProtocolDecl *> Protocols,
14178            ArrayRef<SourceLocation> ProtocolLocs,
14179            SourceLocation ProtocolRAngleLoc) {
14180   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14181                                      TypeArgs, TypeArgsRAngleLoc,
14182                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14183                                      ProtocolRAngleLoc,
14184                                      /*FailOnError=*/true);
14185 }
14186 
14187 template<typename Derived>
14188 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14189            QualType PointeeType,
14190            SourceLocation Star) {
14191   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14192 }
14193 
14194 template<typename Derived>
14195 QualType
14196 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14197                                          ArrayType::ArraySizeModifier SizeMod,
14198                                          const llvm::APInt *Size,
14199                                          Expr *SizeExpr,
14200                                          unsigned IndexTypeQuals,
14201                                          SourceRange BracketsRange) {
14202   if (SizeExpr || !Size)
14203     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14204                                   IndexTypeQuals, BracketsRange,
14205                                   getDerived().getBaseEntity());
14206 
14207   QualType Types[] = {
14208     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14209     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14210     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14211   };
14212   const unsigned NumTypes = llvm::array_lengthof(Types);
14213   QualType SizeType;
14214   for (unsigned I = 0; I != NumTypes; ++I)
14215     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14216       SizeType = Types[I];
14217       break;
14218     }
14219 
14220   // Note that we can return a VariableArrayType here in the case where
14221   // the element type was a dependent VariableArrayType.
14222   IntegerLiteral *ArraySize
14223       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14224                                /*FIXME*/BracketsRange.getBegin());
14225   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14226                                 IndexTypeQuals, BracketsRange,
14227                                 getDerived().getBaseEntity());
14228 }
14229 
14230 template<typename Derived>
14231 QualType
14232 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14233                                                  ArrayType::ArraySizeModifier SizeMod,
14234                                                  const llvm::APInt &Size,
14235                                                  Expr *SizeExpr,
14236                                                  unsigned IndexTypeQuals,
14237                                                  SourceRange BracketsRange) {
14238   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14239                                         IndexTypeQuals, BracketsRange);
14240 }
14241 
14242 template<typename Derived>
14243 QualType
14244 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14245                                           ArrayType::ArraySizeModifier SizeMod,
14246                                                  unsigned IndexTypeQuals,
14247                                                    SourceRange BracketsRange) {
14248   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14249                                        IndexTypeQuals, BracketsRange);
14250 }
14251 
14252 template<typename Derived>
14253 QualType
14254 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14255                                           ArrayType::ArraySizeModifier SizeMod,
14256                                                  Expr *SizeExpr,
14257                                                  unsigned IndexTypeQuals,
14258                                                  SourceRange BracketsRange) {
14259   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14260                                        SizeExpr,
14261                                        IndexTypeQuals, BracketsRange);
14262 }
14263 
14264 template<typename Derived>
14265 QualType
14266 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14267                                           ArrayType::ArraySizeModifier SizeMod,
14268                                                        Expr *SizeExpr,
14269                                                        unsigned IndexTypeQuals,
14270                                                    SourceRange BracketsRange) {
14271   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14272                                        SizeExpr,
14273                                        IndexTypeQuals, BracketsRange);
14274 }
14275 
14276 template <typename Derived>
14277 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14278     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14279   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14280                                           AttributeLoc);
14281 }
14282 
14283 template <typename Derived>
14284 QualType
14285 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14286                                           unsigned NumElements,
14287                                           VectorType::VectorKind VecKind) {
14288   // FIXME: semantic checking!
14289   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14290 }
14291 
14292 template <typename Derived>
14293 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14294     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14295     VectorType::VectorKind VecKind) {
14296   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14297 }
14298 
14299 template<typename Derived>
14300 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14301                                                       unsigned NumElements,
14302                                                  SourceLocation AttributeLoc) {
14303   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14304                           NumElements, true);
14305   IntegerLiteral *VectorSize
14306     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14307                              AttributeLoc);
14308   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14309 }
14310 
14311 template<typename Derived>
14312 QualType
14313 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14314                                                            Expr *SizeExpr,
14315                                                   SourceLocation AttributeLoc) {
14316   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14317 }
14318 
14319 template <typename Derived>
14320 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14321     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14322   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14323                                                NumColumns);
14324 }
14325 
14326 template <typename Derived>
14327 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14328     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14329     SourceLocation AttributeLoc) {
14330   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14331                                  AttributeLoc);
14332 }
14333 
14334 template<typename Derived>
14335 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14336     QualType T,
14337     MutableArrayRef<QualType> ParamTypes,
14338     const FunctionProtoType::ExtProtoInfo &EPI) {
14339   return SemaRef.BuildFunctionType(T, ParamTypes,
14340                                    getDerived().getBaseLocation(),
14341                                    getDerived().getBaseEntity(),
14342                                    EPI);
14343 }
14344 
14345 template<typename Derived>
14346 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14347   return SemaRef.Context.getFunctionNoProtoType(T);
14348 }
14349 
14350 template<typename Derived>
14351 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14352                                                             Decl *D) {
14353   assert(D && "no decl found");
14354   if (D->isInvalidDecl()) return QualType();
14355 
14356   // FIXME: Doesn't account for ObjCInterfaceDecl!
14357   TypeDecl *Ty;
14358   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14359     // A valid resolved using typename pack expansion decl can have multiple
14360     // UsingDecls, but they must each have exactly one type, and it must be
14361     // the same type in every case. But we must have at least one expansion!
14362     if (UPD->expansions().empty()) {
14363       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14364           << UPD->isCXXClassMember() << UPD;
14365       return QualType();
14366     }
14367 
14368     // We might still have some unresolved types. Try to pick a resolved type
14369     // if we can. The final instantiation will check that the remaining
14370     // unresolved types instantiate to the type we pick.
14371     QualType FallbackT;
14372     QualType T;
14373     for (auto *E : UPD->expansions()) {
14374       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14375       if (ThisT.isNull())
14376         continue;
14377       else if (ThisT->getAs<UnresolvedUsingType>())
14378         FallbackT = ThisT;
14379       else if (T.isNull())
14380         T = ThisT;
14381       else
14382         assert(getSema().Context.hasSameType(ThisT, T) &&
14383                "mismatched resolved types in using pack expansion");
14384     }
14385     return T.isNull() ? FallbackT : T;
14386   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14387     assert(Using->hasTypename() &&
14388            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14389 
14390     // A valid resolved using typename decl points to exactly one type decl.
14391     assert(++Using->shadow_begin() == Using->shadow_end());
14392     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14393   } else {
14394     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14395            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14396     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14397   }
14398 
14399   return SemaRef.Context.getTypeDeclType(Ty);
14400 }
14401 
14402 template<typename Derived>
14403 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14404                                                        SourceLocation Loc) {
14405   return SemaRef.BuildTypeofExprType(E, Loc);
14406 }
14407 
14408 template<typename Derived>
14409 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14410   return SemaRef.Context.getTypeOfType(Underlying);
14411 }
14412 
14413 template<typename Derived>
14414 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14415                                                      SourceLocation Loc) {
14416   return SemaRef.BuildDecltypeType(E, Loc);
14417 }
14418 
14419 template<typename Derived>
14420 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14421                                             UnaryTransformType::UTTKind UKind,
14422                                             SourceLocation Loc) {
14423   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14424 }
14425 
14426 template<typename Derived>
14427 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14428                                                       TemplateName Template,
14429                                              SourceLocation TemplateNameLoc,
14430                                      TemplateArgumentListInfo &TemplateArgs) {
14431   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14432 }
14433 
14434 template<typename Derived>
14435 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14436                                                    SourceLocation KWLoc) {
14437   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14438 }
14439 
14440 template<typename Derived>
14441 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14442                                                  SourceLocation KWLoc,
14443                                                  bool isReadPipe) {
14444   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14445                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14446 }
14447 
14448 template <typename Derived>
14449 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14450                                                    unsigned NumBits,
14451                                                    SourceLocation Loc) {
14452   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14453                         NumBits, true);
14454   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14455                                                 SemaRef.Context.IntTy, Loc);
14456   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14457 }
14458 
14459 template <typename Derived>
14460 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14461     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14462   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14463 }
14464 
14465 template<typename Derived>
14466 TemplateName
14467 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14468                                             bool TemplateKW,
14469                                             TemplateDecl *Template) {
14470   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14471                                                   Template);
14472 }
14473 
14474 template<typename Derived>
14475 TemplateName
14476 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14477                                             SourceLocation TemplateKWLoc,
14478                                             const IdentifierInfo &Name,
14479                                             SourceLocation NameLoc,
14480                                             QualType ObjectType,
14481                                             NamedDecl *FirstQualifierInScope,
14482                                             bool AllowInjectedClassName) {
14483   UnqualifiedId TemplateName;
14484   TemplateName.setIdentifier(&Name, NameLoc);
14485   Sema::TemplateTy Template;
14486   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14487                               TemplateName, ParsedType::make(ObjectType),
14488                               /*EnteringContext=*/false, Template,
14489                               AllowInjectedClassName);
14490   return Template.get();
14491 }
14492 
14493 template<typename Derived>
14494 TemplateName
14495 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14496                                             SourceLocation TemplateKWLoc,
14497                                             OverloadedOperatorKind Operator,
14498                                             SourceLocation NameLoc,
14499                                             QualType ObjectType,
14500                                             bool AllowInjectedClassName) {
14501   UnqualifiedId Name;
14502   // FIXME: Bogus location information.
14503   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14504   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14505   Sema::TemplateTy Template;
14506   getSema().ActOnTemplateName(
14507       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14508       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14509   return Template.get();
14510 }
14511 
14512 template<typename Derived>
14513 ExprResult
14514 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14515                                                    SourceLocation OpLoc,
14516                                                    Expr *OrigCallee,
14517                                                    Expr *First,
14518                                                    Expr *Second) {
14519   Expr *Callee = OrigCallee->IgnoreParenCasts();
14520   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14521 
14522   if (First->getObjectKind() == OK_ObjCProperty) {
14523     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14524     if (BinaryOperator::isAssignmentOp(Opc))
14525       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14526                                                  First, Second);
14527     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14528     if (Result.isInvalid())
14529       return ExprError();
14530     First = Result.get();
14531   }
14532 
14533   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14534     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14535     if (Result.isInvalid())
14536       return ExprError();
14537     Second = Result.get();
14538   }
14539 
14540   // Determine whether this should be a builtin operation.
14541   if (Op == OO_Subscript) {
14542     if (!First->getType()->isOverloadableType() &&
14543         !Second->getType()->isOverloadableType())
14544       return getSema().CreateBuiltinArraySubscriptExpr(
14545           First, Callee->getBeginLoc(), Second, OpLoc);
14546   } else if (Op == OO_Arrow) {
14547     // -> is never a builtin operation.
14548     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14549   } else if (Second == nullptr || isPostIncDec) {
14550     if (!First->getType()->isOverloadableType() ||
14551         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14552       // The argument is not of overloadable type, or this is an expression
14553       // of the form &Class::member, so try to create a built-in unary
14554       // operation.
14555       UnaryOperatorKind Opc
14556         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14557 
14558       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14559     }
14560   } else {
14561     if (!First->getType()->isOverloadableType() &&
14562         !Second->getType()->isOverloadableType()) {
14563       // Neither of the arguments is an overloadable type, so try to
14564       // create a built-in binary operation.
14565       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14566       ExprResult Result
14567         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14568       if (Result.isInvalid())
14569         return ExprError();
14570 
14571       return Result;
14572     }
14573   }
14574 
14575   // Compute the transformed set of functions (and function templates) to be
14576   // used during overload resolution.
14577   UnresolvedSet<16> Functions;
14578   bool RequiresADL;
14579 
14580   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14581     Functions.append(ULE->decls_begin(), ULE->decls_end());
14582     // If the overload could not be resolved in the template definition
14583     // (because we had a dependent argument), ADL is performed as part of
14584     // template instantiation.
14585     RequiresADL = ULE->requiresADL();
14586   } else {
14587     // If we've resolved this to a particular non-member function, just call
14588     // that function. If we resolved it to a member function,
14589     // CreateOverloaded* will find that function for us.
14590     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14591     if (!isa<CXXMethodDecl>(ND))
14592       Functions.addDecl(ND);
14593     RequiresADL = false;
14594   }
14595 
14596   // Add any functions found via argument-dependent lookup.
14597   Expr *Args[2] = { First, Second };
14598   unsigned NumArgs = 1 + (Second != nullptr);
14599 
14600   // Create the overloaded operator invocation for unary operators.
14601   if (NumArgs == 1 || isPostIncDec) {
14602     UnaryOperatorKind Opc
14603       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14604     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14605                                            RequiresADL);
14606   }
14607 
14608   if (Op == OO_Subscript) {
14609     SourceLocation LBrace;
14610     SourceLocation RBrace;
14611 
14612     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14613       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14614       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14615       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14616     } else {
14617       LBrace = Callee->getBeginLoc();
14618       RBrace = OpLoc;
14619     }
14620 
14621     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14622                                                       First, Second);
14623   }
14624 
14625   // Create the overloaded operator invocation for binary operators.
14626   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14627   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14628       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14629   if (Result.isInvalid())
14630     return ExprError();
14631 
14632   return Result;
14633 }
14634 
14635 template<typename Derived>
14636 ExprResult
14637 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14638                                                      SourceLocation OperatorLoc,
14639                                                        bool isArrow,
14640                                                        CXXScopeSpec &SS,
14641                                                      TypeSourceInfo *ScopeType,
14642                                                        SourceLocation CCLoc,
14643                                                        SourceLocation TildeLoc,
14644                                         PseudoDestructorTypeStorage Destroyed) {
14645   QualType BaseType = Base->getType();
14646   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14647       (!isArrow && !BaseType->getAs<RecordType>()) ||
14648       (isArrow && BaseType->getAs<PointerType>() &&
14649        !BaseType->castAs<PointerType>()->getPointeeType()
14650                                               ->template getAs<RecordType>())){
14651     // This pseudo-destructor expression is still a pseudo-destructor.
14652     return SemaRef.BuildPseudoDestructorExpr(
14653         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14654         CCLoc, TildeLoc, Destroyed);
14655   }
14656 
14657   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14658   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14659                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14660   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14661   NameInfo.setNamedTypeInfo(DestroyedType);
14662 
14663   // The scope type is now known to be a valid nested name specifier
14664   // component. Tack it on to the end of the nested name specifier.
14665   if (ScopeType) {
14666     if (!ScopeType->getType()->getAs<TagType>()) {
14667       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14668                      diag::err_expected_class_or_namespace)
14669           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14670       return ExprError();
14671     }
14672     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14673               CCLoc);
14674   }
14675 
14676   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14677   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14678                                             OperatorLoc, isArrow,
14679                                             SS, TemplateKWLoc,
14680                                             /*FIXME: FirstQualifier*/ nullptr,
14681                                             NameInfo,
14682                                             /*TemplateArgs*/ nullptr,
14683                                             /*S*/nullptr);
14684 }
14685 
14686 template<typename Derived>
14687 StmtResult
14688 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14689   SourceLocation Loc = S->getBeginLoc();
14690   CapturedDecl *CD = S->getCapturedDecl();
14691   unsigned NumParams = CD->getNumParams();
14692   unsigned ContextParamPos = CD->getContextParamPosition();
14693   SmallVector<Sema::CapturedParamNameType, 4> Params;
14694   for (unsigned I = 0; I < NumParams; ++I) {
14695     if (I != ContextParamPos) {
14696       Params.push_back(
14697              std::make_pair(
14698                   CD->getParam(I)->getName(),
14699                   getDerived().TransformType(CD->getParam(I)->getType())));
14700     } else {
14701       Params.push_back(std::make_pair(StringRef(), QualType()));
14702     }
14703   }
14704   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14705                                      S->getCapturedRegionKind(), Params);
14706   StmtResult Body;
14707   {
14708     Sema::CompoundScopeRAII CompoundScope(getSema());
14709     Body = getDerived().TransformStmt(S->getCapturedStmt());
14710   }
14711 
14712   if (Body.isInvalid()) {
14713     getSema().ActOnCapturedRegionError();
14714     return StmtError();
14715   }
14716 
14717   return getSema().ActOnCapturedRegionEnd(Body.get());
14718 }
14719 
14720 } // end namespace clang
14721 
14722 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14723