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.ActOnAttributedStmt(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   /// Rebuild the operand to an Objective-C \@synchronized statement.
2212   ///
2213   /// By default, performs semantic analysis to build the new statement.
2214   /// Subclasses may override this routine to provide different behavior.
2215   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2216                                               Expr *object) {
2217     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2218   }
2219 
2220   /// Build a new Objective-C \@synchronized statement.
2221   ///
2222   /// By default, performs semantic analysis to build the new statement.
2223   /// Subclasses may override this routine to provide different behavior.
2224   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2225                                            Expr *Object, Stmt *Body) {
2226     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2227   }
2228 
2229   /// Build a new Objective-C \@autoreleasepool statement.
2230   ///
2231   /// By default, performs semantic analysis to build the new statement.
2232   /// Subclasses may override this routine to provide different behavior.
2233   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2234                                             Stmt *Body) {
2235     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2236   }
2237 
2238   /// Build a new Objective-C fast enumeration statement.
2239   ///
2240   /// By default, performs semantic analysis to build the new statement.
2241   /// Subclasses may override this routine to provide different behavior.
2242   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2243                                           Stmt *Element,
2244                                           Expr *Collection,
2245                                           SourceLocation RParenLoc,
2246                                           Stmt *Body) {
2247     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2248                                                 Element,
2249                                                 Collection,
2250                                                 RParenLoc);
2251     if (ForEachStmt.isInvalid())
2252       return StmtError();
2253 
2254     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2255   }
2256 
2257   /// Build a new C++ exception declaration.
2258   ///
2259   /// By default, performs semantic analysis to build the new decaration.
2260   /// Subclasses may override this routine to provide different behavior.
2261   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2262                                 TypeSourceInfo *Declarator,
2263                                 SourceLocation StartLoc,
2264                                 SourceLocation IdLoc,
2265                                 IdentifierInfo *Id) {
2266     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2267                                                        StartLoc, IdLoc, Id);
2268     if (Var)
2269       getSema().CurContext->addDecl(Var);
2270     return Var;
2271   }
2272 
2273   /// Build a new C++ catch statement.
2274   ///
2275   /// By default, performs semantic analysis to build the new statement.
2276   /// Subclasses may override this routine to provide different behavior.
2277   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2278                                  VarDecl *ExceptionDecl,
2279                                  Stmt *Handler) {
2280     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2281                                                       Handler));
2282   }
2283 
2284   /// Build a new C++ try statement.
2285   ///
2286   /// By default, performs semantic analysis to build the new statement.
2287   /// Subclasses may override this routine to provide different behavior.
2288   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2289                                ArrayRef<Stmt *> Handlers) {
2290     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2291   }
2292 
2293   /// Build a new C++0x range-based for statement.
2294   ///
2295   /// By default, performs semantic analysis to build the new statement.
2296   /// Subclasses may override this routine to provide different behavior.
2297   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2298                                     SourceLocation CoawaitLoc, Stmt *Init,
2299                                     SourceLocation ColonLoc, Stmt *Range,
2300                                     Stmt *Begin, Stmt *End, Expr *Cond,
2301                                     Expr *Inc, Stmt *LoopVar,
2302                                     SourceLocation RParenLoc) {
2303     // If we've just learned that the range is actually an Objective-C
2304     // collection, treat this as an Objective-C fast enumeration loop.
2305     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2306       if (RangeStmt->isSingleDecl()) {
2307         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2308           if (RangeVar->isInvalidDecl())
2309             return StmtError();
2310 
2311           Expr *RangeExpr = RangeVar->getInit();
2312           if (!RangeExpr->isTypeDependent() &&
2313               RangeExpr->getType()->isObjCObjectPointerType()) {
2314             // FIXME: Support init-statements in Objective-C++20 ranged for
2315             // statement.
2316             if (Init) {
2317               return SemaRef.Diag(Init->getBeginLoc(),
2318                                   diag::err_objc_for_range_init_stmt)
2319                          << Init->getSourceRange();
2320             }
2321             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2322                                                         RangeExpr, RParenLoc);
2323           }
2324         }
2325       }
2326     }
2327 
2328     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2329                                           Range, Begin, End, Cond, Inc, LoopVar,
2330                                           RParenLoc, Sema::BFRK_Rebuild);
2331   }
2332 
2333   /// Build a new C++0x range-based for statement.
2334   ///
2335   /// By default, performs semantic analysis to build the new statement.
2336   /// Subclasses may override this routine to provide different behavior.
2337   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2338                                           bool IsIfExists,
2339                                           NestedNameSpecifierLoc QualifierLoc,
2340                                           DeclarationNameInfo NameInfo,
2341                                           Stmt *Nested) {
2342     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2343                                                 QualifierLoc, NameInfo, Nested);
2344   }
2345 
2346   /// Attach body to a C++0x range-based for statement.
2347   ///
2348   /// By default, performs semantic analysis to finish the new statement.
2349   /// Subclasses may override this routine to provide different behavior.
2350   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2351     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2352   }
2353 
2354   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2355                                Stmt *TryBlock, Stmt *Handler) {
2356     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2357   }
2358 
2359   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2360                                   Stmt *Block) {
2361     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2362   }
2363 
2364   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2365     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2366   }
2367 
2368   /// Build a new predefined expression.
2369   ///
2370   /// By default, performs semantic analysis to build the new expression.
2371   /// Subclasses may override this routine to provide different behavior.
2372   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2373                                    PredefinedExpr::IdentKind IK) {
2374     return getSema().BuildPredefinedExpr(Loc, IK);
2375   }
2376 
2377   /// Build a new expression that references a declaration.
2378   ///
2379   /// By default, performs semantic analysis to build the new expression.
2380   /// Subclasses may override this routine to provide different behavior.
2381   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2382                                         LookupResult &R,
2383                                         bool RequiresADL) {
2384     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2385   }
2386 
2387 
2388   /// Build a new expression that references a declaration.
2389   ///
2390   /// By default, performs semantic analysis to build the new expression.
2391   /// Subclasses may override this routine to provide different behavior.
2392   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2393                                 ValueDecl *VD,
2394                                 const DeclarationNameInfo &NameInfo,
2395                                 NamedDecl *Found,
2396                                 TemplateArgumentListInfo *TemplateArgs) {
2397     CXXScopeSpec SS;
2398     SS.Adopt(QualifierLoc);
2399     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2400                                               TemplateArgs);
2401   }
2402 
2403   /// Build a new expression in parentheses.
2404   ///
2405   /// By default, performs semantic analysis to build the new expression.
2406   /// Subclasses may override this routine to provide different behavior.
2407   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2408                                     SourceLocation RParen) {
2409     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2410   }
2411 
2412   /// Build a new pseudo-destructor expression.
2413   ///
2414   /// By default, performs semantic analysis to build the new expression.
2415   /// Subclasses may override this routine to provide different behavior.
2416   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2417                                             SourceLocation OperatorLoc,
2418                                             bool isArrow,
2419                                             CXXScopeSpec &SS,
2420                                             TypeSourceInfo *ScopeType,
2421                                             SourceLocation CCLoc,
2422                                             SourceLocation TildeLoc,
2423                                         PseudoDestructorTypeStorage Destroyed);
2424 
2425   /// Build a new unary operator expression.
2426   ///
2427   /// By default, performs semantic analysis to build the new expression.
2428   /// Subclasses may override this routine to provide different behavior.
2429   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2430                                         UnaryOperatorKind Opc,
2431                                         Expr *SubExpr) {
2432     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2433   }
2434 
2435   /// Build a new builtin offsetof expression.
2436   ///
2437   /// By default, performs semantic analysis to build the new expression.
2438   /// Subclasses may override this routine to provide different behavior.
2439   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2440                                  TypeSourceInfo *Type,
2441                                  ArrayRef<Sema::OffsetOfComponent> Components,
2442                                  SourceLocation RParenLoc) {
2443     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2444                                           RParenLoc);
2445   }
2446 
2447   /// Build a new sizeof, alignof or vec_step expression with a
2448   /// type argument.
2449   ///
2450   /// By default, performs semantic analysis to build the new expression.
2451   /// Subclasses may override this routine to provide different behavior.
2452   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2453                                          SourceLocation OpLoc,
2454                                          UnaryExprOrTypeTrait ExprKind,
2455                                          SourceRange R) {
2456     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2457   }
2458 
2459   /// Build a new sizeof, alignof or vec step expression with an
2460   /// expression argument.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2465                                          UnaryExprOrTypeTrait ExprKind,
2466                                          SourceRange R) {
2467     ExprResult Result
2468       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2469     if (Result.isInvalid())
2470       return ExprError();
2471 
2472     return Result;
2473   }
2474 
2475   /// Build a new array subscript expression.
2476   ///
2477   /// By default, performs semantic analysis to build the new expression.
2478   /// Subclasses may override this routine to provide different behavior.
2479   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2480                                              SourceLocation LBracketLoc,
2481                                              Expr *RHS,
2482                                              SourceLocation RBracketLoc) {
2483     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2484                                              LBracketLoc, RHS,
2485                                              RBracketLoc);
2486   }
2487 
2488   /// Build a new matrix subscript expression.
2489   ///
2490   /// By default, performs semantic analysis to build the new expression.
2491   /// Subclasses may override this routine to provide different behavior.
2492   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2493                                         Expr *ColumnIdx,
2494                                         SourceLocation RBracketLoc) {
2495     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2496                                                       RBracketLoc);
2497   }
2498 
2499   /// Build a new array section expression.
2500   ///
2501   /// By default, performs semantic analysis to build the new expression.
2502   /// Subclasses may override this routine to provide different behavior.
2503   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2504                                         Expr *LowerBound,
2505                                         SourceLocation ColonLocFirst,
2506                                         SourceLocation ColonLocSecond,
2507                                         Expr *Length, Expr *Stride,
2508                                         SourceLocation RBracketLoc) {
2509     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2510                                               ColonLocFirst, ColonLocSecond,
2511                                               Length, Stride, RBracketLoc);
2512   }
2513 
2514   /// Build a new array shaping expression.
2515   ///
2516   /// By default, performs semantic analysis to build the new expression.
2517   /// Subclasses may override this routine to provide different behavior.
2518   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2519                                         SourceLocation RParenLoc,
2520                                         ArrayRef<Expr *> Dims,
2521                                         ArrayRef<SourceRange> BracketsRanges) {
2522     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2523                                               BracketsRanges);
2524   }
2525 
2526   /// Build a new iterator expression.
2527   ///
2528   /// By default, performs semantic analysis to build the new expression.
2529   /// Subclasses may override this routine to provide different behavior.
2530   ExprResult RebuildOMPIteratorExpr(
2531       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2532       ArrayRef<Sema::OMPIteratorData> Data) {
2533     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2534                                           LLoc, RLoc, Data);
2535   }
2536 
2537   /// Build a new call expression.
2538   ///
2539   /// By default, performs semantic analysis to build the new expression.
2540   /// Subclasses may override this routine to provide different behavior.
2541   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2542                                    MultiExprArg Args,
2543                                    SourceLocation RParenLoc,
2544                                    Expr *ExecConfig = nullptr) {
2545     return getSema().ActOnCallExpr(
2546         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2547   }
2548 
2549   /// Build a new member access expression.
2550   ///
2551   /// By default, performs semantic analysis to build the new expression.
2552   /// Subclasses may override this routine to provide different behavior.
2553   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2554                                bool isArrow,
2555                                NestedNameSpecifierLoc QualifierLoc,
2556                                SourceLocation TemplateKWLoc,
2557                                const DeclarationNameInfo &MemberNameInfo,
2558                                ValueDecl *Member,
2559                                NamedDecl *FoundDecl,
2560                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2561                                NamedDecl *FirstQualifierInScope) {
2562     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2563                                                                       isArrow);
2564     if (!Member->getDeclName()) {
2565       // We have a reference to an unnamed field.  This is always the
2566       // base of an anonymous struct/union member access, i.e. the
2567       // field is always of record type.
2568       assert(Member->getType()->isRecordType() &&
2569              "unnamed member not of record type?");
2570 
2571       BaseResult =
2572         getSema().PerformObjectMemberConversion(BaseResult.get(),
2573                                                 QualifierLoc.getNestedNameSpecifier(),
2574                                                 FoundDecl, Member);
2575       if (BaseResult.isInvalid())
2576         return ExprError();
2577       Base = BaseResult.get();
2578 
2579       CXXScopeSpec EmptySS;
2580       return getSema().BuildFieldReferenceExpr(
2581           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2582           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2583     }
2584 
2585     CXXScopeSpec SS;
2586     SS.Adopt(QualifierLoc);
2587 
2588     Base = BaseResult.get();
2589     QualType BaseType = Base->getType();
2590 
2591     if (isArrow && !BaseType->isPointerType())
2592       return ExprError();
2593 
2594     // FIXME: this involves duplicating earlier analysis in a lot of
2595     // cases; we should avoid this when possible.
2596     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2597     R.addDecl(FoundDecl);
2598     R.resolveKind();
2599 
2600     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2601                                               SS, TemplateKWLoc,
2602                                               FirstQualifierInScope,
2603                                               R, ExplicitTemplateArgs,
2604                                               /*S*/nullptr);
2605   }
2606 
2607   /// Build a new binary operator expression.
2608   ///
2609   /// By default, performs semantic analysis to build the new expression.
2610   /// Subclasses may override this routine to provide different behavior.
2611   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2612                                          BinaryOperatorKind Opc,
2613                                          Expr *LHS, Expr *RHS) {
2614     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2615   }
2616 
2617   /// Build a new rewritten operator expression.
2618   ///
2619   /// By default, performs semantic analysis to build the new expression.
2620   /// Subclasses may override this routine to provide different behavior.
2621   ExprResult RebuildCXXRewrittenBinaryOperator(
2622       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2623       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2624     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2625                                            RHS, /*RequiresADL*/false);
2626   }
2627 
2628   /// Build a new conditional operator expression.
2629   ///
2630   /// By default, performs semantic analysis to build the new expression.
2631   /// Subclasses may override this routine to provide different behavior.
2632   ExprResult RebuildConditionalOperator(Expr *Cond,
2633                                         SourceLocation QuestionLoc,
2634                                         Expr *LHS,
2635                                         SourceLocation ColonLoc,
2636                                         Expr *RHS) {
2637     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2638                                         LHS, RHS);
2639   }
2640 
2641   /// Build a new C-style cast expression.
2642   ///
2643   /// By default, performs semantic analysis to build the new expression.
2644   /// Subclasses may override this routine to provide different behavior.
2645   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2646                                          TypeSourceInfo *TInfo,
2647                                          SourceLocation RParenLoc,
2648                                          Expr *SubExpr) {
2649     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2650                                          SubExpr);
2651   }
2652 
2653   /// Build a new compound literal expression.
2654   ///
2655   /// By default, performs semantic analysis to build the new expression.
2656   /// Subclasses may override this routine to provide different behavior.
2657   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2658                                               TypeSourceInfo *TInfo,
2659                                               SourceLocation RParenLoc,
2660                                               Expr *Init) {
2661     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2662                                               Init);
2663   }
2664 
2665   /// Build a new extended vector element access expression.
2666   ///
2667   /// By default, performs semantic analysis to build the new expression.
2668   /// Subclasses may override this routine to provide different behavior.
2669   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2670                                                SourceLocation OpLoc,
2671                                                SourceLocation AccessorLoc,
2672                                                IdentifierInfo &Accessor) {
2673 
2674     CXXScopeSpec SS;
2675     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2676     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2677                                               OpLoc, /*IsArrow*/ false,
2678                                               SS, SourceLocation(),
2679                                               /*FirstQualifierInScope*/ nullptr,
2680                                               NameInfo,
2681                                               /* TemplateArgs */ nullptr,
2682                                               /*S*/ nullptr);
2683   }
2684 
2685   /// Build a new initializer list expression.
2686   ///
2687   /// By default, performs semantic analysis to build the new expression.
2688   /// Subclasses may override this routine to provide different behavior.
2689   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2690                              MultiExprArg Inits,
2691                              SourceLocation RBraceLoc) {
2692     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2693   }
2694 
2695   /// Build a new designated initializer expression.
2696   ///
2697   /// By default, performs semantic analysis to build the new expression.
2698   /// Subclasses may override this routine to provide different behavior.
2699   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2700                                              MultiExprArg ArrayExprs,
2701                                              SourceLocation EqualOrColonLoc,
2702                                              bool GNUSyntax,
2703                                              Expr *Init) {
2704     ExprResult Result
2705       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2706                                            Init);
2707     if (Result.isInvalid())
2708       return ExprError();
2709 
2710     return Result;
2711   }
2712 
2713   /// Build a new value-initialized expression.
2714   ///
2715   /// By default, builds the implicit value initialization without performing
2716   /// any semantic analysis. Subclasses may override this routine to provide
2717   /// different behavior.
2718   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2719     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2720   }
2721 
2722   /// Build a new \c va_arg expression.
2723   ///
2724   /// By default, performs semantic analysis to build the new expression.
2725   /// Subclasses may override this routine to provide different behavior.
2726   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2727                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2728                                     SourceLocation RParenLoc) {
2729     return getSema().BuildVAArgExpr(BuiltinLoc,
2730                                     SubExpr, TInfo,
2731                                     RParenLoc);
2732   }
2733 
2734   /// Build a new expression list in parentheses.
2735   ///
2736   /// By default, performs semantic analysis to build the new expression.
2737   /// Subclasses may override this routine to provide different behavior.
2738   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2739                                   MultiExprArg SubExprs,
2740                                   SourceLocation RParenLoc) {
2741     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2742   }
2743 
2744   /// Build a new address-of-label expression.
2745   ///
2746   /// By default, performs semantic analysis, using the name of the label
2747   /// rather than attempting to map the label statement itself.
2748   /// Subclasses may override this routine to provide different behavior.
2749   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2750                                   SourceLocation LabelLoc, LabelDecl *Label) {
2751     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2752   }
2753 
2754   /// Build a new GNU statement expression.
2755   ///
2756   /// By default, performs semantic analysis to build the new expression.
2757   /// Subclasses may override this routine to provide different behavior.
2758   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2759                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2760     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2761                                    TemplateDepth);
2762   }
2763 
2764   /// Build a new __builtin_choose_expr expression.
2765   ///
2766   /// By default, performs semantic analysis to build the new expression.
2767   /// Subclasses may override this routine to provide different behavior.
2768   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2769                                      Expr *Cond, Expr *LHS, Expr *RHS,
2770                                      SourceLocation RParenLoc) {
2771     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2772                                    Cond, LHS, RHS,
2773                                    RParenLoc);
2774   }
2775 
2776   /// Build a new generic selection expression.
2777   ///
2778   /// By default, performs semantic analysis to build the new expression.
2779   /// Subclasses may override this routine to provide different behavior.
2780   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2781                                          SourceLocation DefaultLoc,
2782                                          SourceLocation RParenLoc,
2783                                          Expr *ControllingExpr,
2784                                          ArrayRef<TypeSourceInfo *> Types,
2785                                          ArrayRef<Expr *> Exprs) {
2786     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2787                                                 ControllingExpr, Types, Exprs);
2788   }
2789 
2790   /// Build a new overloaded operator call expression.
2791   ///
2792   /// By default, performs semantic analysis to build the new expression.
2793   /// The semantic analysis provides the behavior of template instantiation,
2794   /// copying with transformations that turn what looks like an overloaded
2795   /// operator call into a use of a builtin operator, performing
2796   /// argument-dependent lookup, etc. Subclasses may override this routine to
2797   /// provide different behavior.
2798   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2799                                               SourceLocation OpLoc,
2800                                               Expr *Callee,
2801                                               Expr *First,
2802                                               Expr *Second);
2803 
2804   /// Build a new C++ "named" cast expression, such as static_cast or
2805   /// reinterpret_cast.
2806   ///
2807   /// By default, this routine dispatches to one of the more-specific routines
2808   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2809   /// Subclasses may override this routine to provide different behavior.
2810   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2811                                            Stmt::StmtClass Class,
2812                                            SourceLocation LAngleLoc,
2813                                            TypeSourceInfo *TInfo,
2814                                            SourceLocation RAngleLoc,
2815                                            SourceLocation LParenLoc,
2816                                            Expr *SubExpr,
2817                                            SourceLocation RParenLoc) {
2818     switch (Class) {
2819     case Stmt::CXXStaticCastExprClass:
2820       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2821                                                    RAngleLoc, LParenLoc,
2822                                                    SubExpr, RParenLoc);
2823 
2824     case Stmt::CXXDynamicCastExprClass:
2825       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2826                                                     RAngleLoc, LParenLoc,
2827                                                     SubExpr, RParenLoc);
2828 
2829     case Stmt::CXXReinterpretCastExprClass:
2830       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2831                                                         RAngleLoc, LParenLoc,
2832                                                         SubExpr,
2833                                                         RParenLoc);
2834 
2835     case Stmt::CXXConstCastExprClass:
2836       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2837                                                    RAngleLoc, LParenLoc,
2838                                                    SubExpr, RParenLoc);
2839 
2840     case Stmt::CXXAddrspaceCastExprClass:
2841       return getDerived().RebuildCXXAddrspaceCastExpr(
2842           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2843 
2844     default:
2845       llvm_unreachable("Invalid C++ named cast");
2846     }
2847   }
2848 
2849   /// Build a new C++ static_cast expression.
2850   ///
2851   /// By default, performs semantic analysis to build the new expression.
2852   /// Subclasses may override this routine to provide different behavior.
2853   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2854                                             SourceLocation LAngleLoc,
2855                                             TypeSourceInfo *TInfo,
2856                                             SourceLocation RAngleLoc,
2857                                             SourceLocation LParenLoc,
2858                                             Expr *SubExpr,
2859                                             SourceLocation RParenLoc) {
2860     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2861                                        TInfo, SubExpr,
2862                                        SourceRange(LAngleLoc, RAngleLoc),
2863                                        SourceRange(LParenLoc, RParenLoc));
2864   }
2865 
2866   /// Build a new C++ dynamic_cast expression.
2867   ///
2868   /// By default, performs semantic analysis to build the new expression.
2869   /// Subclasses may override this routine to provide different behavior.
2870   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2871                                              SourceLocation LAngleLoc,
2872                                              TypeSourceInfo *TInfo,
2873                                              SourceLocation RAngleLoc,
2874                                              SourceLocation LParenLoc,
2875                                              Expr *SubExpr,
2876                                              SourceLocation RParenLoc) {
2877     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2878                                        TInfo, SubExpr,
2879                                        SourceRange(LAngleLoc, RAngleLoc),
2880                                        SourceRange(LParenLoc, RParenLoc));
2881   }
2882 
2883   /// Build a new C++ reinterpret_cast expression.
2884   ///
2885   /// By default, performs semantic analysis to build the new expression.
2886   /// Subclasses may override this routine to provide different behavior.
2887   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2888                                                  SourceLocation LAngleLoc,
2889                                                  TypeSourceInfo *TInfo,
2890                                                  SourceLocation RAngleLoc,
2891                                                  SourceLocation LParenLoc,
2892                                                  Expr *SubExpr,
2893                                                  SourceLocation RParenLoc) {
2894     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2895                                        TInfo, SubExpr,
2896                                        SourceRange(LAngleLoc, RAngleLoc),
2897                                        SourceRange(LParenLoc, RParenLoc));
2898   }
2899 
2900   /// Build a new C++ const_cast expression.
2901   ///
2902   /// By default, performs semantic analysis to build the new expression.
2903   /// Subclasses may override this routine to provide different behavior.
2904   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2905                                            SourceLocation LAngleLoc,
2906                                            TypeSourceInfo *TInfo,
2907                                            SourceLocation RAngleLoc,
2908                                            SourceLocation LParenLoc,
2909                                            Expr *SubExpr,
2910                                            SourceLocation RParenLoc) {
2911     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2912                                        TInfo, SubExpr,
2913                                        SourceRange(LAngleLoc, RAngleLoc),
2914                                        SourceRange(LParenLoc, RParenLoc));
2915   }
2916 
2917   ExprResult
2918   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2919                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2920                               SourceLocation LParenLoc, Expr *SubExpr,
2921                               SourceLocation RParenLoc) {
2922     return getSema().BuildCXXNamedCast(
2923         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2924         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2925   }
2926 
2927   /// Build a new C++ functional-style cast expression.
2928   ///
2929   /// By default, performs semantic analysis to build the new expression.
2930   /// Subclasses may override this routine to provide different behavior.
2931   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2932                                           SourceLocation LParenLoc,
2933                                           Expr *Sub,
2934                                           SourceLocation RParenLoc,
2935                                           bool ListInitialization) {
2936     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2937                                                MultiExprArg(&Sub, 1), RParenLoc,
2938                                                ListInitialization);
2939   }
2940 
2941   /// Build a new C++ __builtin_bit_cast expression.
2942   ///
2943   /// By default, performs semantic analysis to build the new expression.
2944   /// Subclasses may override this routine to provide different behavior.
2945   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2946                                        TypeSourceInfo *TSI, Expr *Sub,
2947                                        SourceLocation RParenLoc) {
2948     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2949   }
2950 
2951   /// Build a new C++ typeid(type) expression.
2952   ///
2953   /// By default, performs semantic analysis to build the new expression.
2954   /// Subclasses may override this routine to provide different behavior.
2955   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2956                                         SourceLocation TypeidLoc,
2957                                         TypeSourceInfo *Operand,
2958                                         SourceLocation RParenLoc) {
2959     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2960                                     RParenLoc);
2961   }
2962 
2963 
2964   /// Build a new C++ typeid(expr) expression.
2965   ///
2966   /// By default, performs semantic analysis to build the new expression.
2967   /// Subclasses may override this routine to provide different behavior.
2968   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2969                                         SourceLocation TypeidLoc,
2970                                         Expr *Operand,
2971                                         SourceLocation RParenLoc) {
2972     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2973                                     RParenLoc);
2974   }
2975 
2976   /// Build a new C++ __uuidof(type) expression.
2977   ///
2978   /// By default, performs semantic analysis to build the new expression.
2979   /// Subclasses may override this routine to provide different behavior.
2980   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2981                                   TypeSourceInfo *Operand,
2982                                   SourceLocation RParenLoc) {
2983     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2984   }
2985 
2986   /// Build a new C++ __uuidof(expr) expression.
2987   ///
2988   /// By default, performs semantic analysis to build the new expression.
2989   /// Subclasses may override this routine to provide different behavior.
2990   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2991                                   Expr *Operand, SourceLocation RParenLoc) {
2992     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2993   }
2994 
2995   /// Build a new C++ "this" expression.
2996   ///
2997   /// By default, builds a new "this" expression without performing any
2998   /// semantic analysis. Subclasses may override this routine to provide
2999   /// different behavior.
3000   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
3001                                 QualType ThisType,
3002                                 bool isImplicit) {
3003     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
3004   }
3005 
3006   /// Build a new C++ throw expression.
3007   ///
3008   /// By default, performs semantic analysis to build the new expression.
3009   /// Subclasses may override this routine to provide different behavior.
3010   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
3011                                  bool IsThrownVariableInScope) {
3012     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
3013   }
3014 
3015   /// Build a new C++ default-argument expression.
3016   ///
3017   /// By default, builds a new default-argument expression, which does not
3018   /// require any semantic analysis. Subclasses may override this routine to
3019   /// provide different behavior.
3020   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
3021     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
3022                                      getSema().CurContext);
3023   }
3024 
3025   /// Build a new C++11 default-initialization expression.
3026   ///
3027   /// By default, builds a new default field initialization expression, which
3028   /// does not require any semantic analysis. Subclasses may override this
3029   /// routine to provide different behavior.
3030   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
3031                                        FieldDecl *Field) {
3032     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
3033                                       getSema().CurContext);
3034   }
3035 
3036   /// Build a new C++ zero-initialization expression.
3037   ///
3038   /// By default, performs semantic analysis to build the new expression.
3039   /// Subclasses may override this routine to provide different behavior.
3040   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
3041                                            SourceLocation LParenLoc,
3042                                            SourceLocation RParenLoc) {
3043     return getSema().BuildCXXTypeConstructExpr(
3044         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
3045   }
3046 
3047   /// Build a new C++ "new" expression.
3048   ///
3049   /// By default, performs semantic analysis to build the new expression.
3050   /// Subclasses may override this routine to provide different behavior.
3051   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3052                                bool UseGlobal,
3053                                SourceLocation PlacementLParen,
3054                                MultiExprArg PlacementArgs,
3055                                SourceLocation PlacementRParen,
3056                                SourceRange TypeIdParens,
3057                                QualType AllocatedType,
3058                                TypeSourceInfo *AllocatedTypeInfo,
3059                                Optional<Expr *> ArraySize,
3060                                SourceRange DirectInitRange,
3061                                Expr *Initializer) {
3062     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3063                                  PlacementLParen,
3064                                  PlacementArgs,
3065                                  PlacementRParen,
3066                                  TypeIdParens,
3067                                  AllocatedType,
3068                                  AllocatedTypeInfo,
3069                                  ArraySize,
3070                                  DirectInitRange,
3071                                  Initializer);
3072   }
3073 
3074   /// Build a new C++ "delete" expression.
3075   ///
3076   /// By default, performs semantic analysis to build the new expression.
3077   /// Subclasses may override this routine to provide different behavior.
3078   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3079                                         bool IsGlobalDelete,
3080                                         bool IsArrayForm,
3081                                         Expr *Operand) {
3082     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3083                                     Operand);
3084   }
3085 
3086   /// Build a new type trait expression.
3087   ///
3088   /// By default, performs semantic analysis to build the new expression.
3089   /// Subclasses may override this routine to provide different behavior.
3090   ExprResult RebuildTypeTrait(TypeTrait Trait,
3091                               SourceLocation StartLoc,
3092                               ArrayRef<TypeSourceInfo *> Args,
3093                               SourceLocation RParenLoc) {
3094     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3095   }
3096 
3097   /// Build a new array type trait expression.
3098   ///
3099   /// By default, performs semantic analysis to build the new expression.
3100   /// Subclasses may override this routine to provide different behavior.
3101   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3102                                    SourceLocation StartLoc,
3103                                    TypeSourceInfo *TSInfo,
3104                                    Expr *DimExpr,
3105                                    SourceLocation RParenLoc) {
3106     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3107   }
3108 
3109   /// Build a new expression trait expression.
3110   ///
3111   /// By default, performs semantic analysis to build the new expression.
3112   /// Subclasses may override this routine to provide different behavior.
3113   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3114                                    SourceLocation StartLoc,
3115                                    Expr *Queried,
3116                                    SourceLocation RParenLoc) {
3117     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3118   }
3119 
3120   /// Build a new (previously unresolved) declaration reference
3121   /// 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 RebuildDependentScopeDeclRefExpr(
3126                                           NestedNameSpecifierLoc QualifierLoc,
3127                                           SourceLocation TemplateKWLoc,
3128                                        const DeclarationNameInfo &NameInfo,
3129                               const TemplateArgumentListInfo *TemplateArgs,
3130                                           bool IsAddressOfOperand,
3131                                           TypeSourceInfo **RecoveryTSI) {
3132     CXXScopeSpec SS;
3133     SS.Adopt(QualifierLoc);
3134 
3135     if (TemplateArgs || TemplateKWLoc.isValid())
3136       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3137                                                     TemplateArgs);
3138 
3139     return getSema().BuildQualifiedDeclarationNameExpr(
3140         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3141   }
3142 
3143   /// Build a new template-id expression.
3144   ///
3145   /// By default, performs semantic analysis to build the new expression.
3146   /// Subclasses may override this routine to provide different behavior.
3147   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3148                                    SourceLocation TemplateKWLoc,
3149                                    LookupResult &R,
3150                                    bool RequiresADL,
3151                               const TemplateArgumentListInfo *TemplateArgs) {
3152     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3153                                          TemplateArgs);
3154   }
3155 
3156   /// Build a new object-construction 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 RebuildCXXConstructExpr(QualType T,
3161                                      SourceLocation Loc,
3162                                      CXXConstructorDecl *Constructor,
3163                                      bool IsElidable,
3164                                      MultiExprArg Args,
3165                                      bool HadMultipleCandidates,
3166                                      bool ListInitialization,
3167                                      bool StdInitListInitialization,
3168                                      bool RequiresZeroInit,
3169                              CXXConstructExpr::ConstructionKind ConstructKind,
3170                                      SourceRange ParenRange) {
3171     // Reconstruct the constructor we originally found, which might be
3172     // different if this is a call to an inherited constructor.
3173     CXXConstructorDecl *FoundCtor = Constructor;
3174     if (Constructor->isInheritingConstructor())
3175       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3176 
3177     SmallVector<Expr *, 8> ConvertedArgs;
3178     if (getSema().CompleteConstructorCall(FoundCtor, T, Args, Loc,
3179                                           ConvertedArgs))
3180       return ExprError();
3181 
3182     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3183                                            IsElidable,
3184                                            ConvertedArgs,
3185                                            HadMultipleCandidates,
3186                                            ListInitialization,
3187                                            StdInitListInitialization,
3188                                            RequiresZeroInit, ConstructKind,
3189                                            ParenRange);
3190   }
3191 
3192   /// Build a new implicit construction via inherited constructor
3193   /// expression.
3194   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3195                                              CXXConstructorDecl *Constructor,
3196                                              bool ConstructsVBase,
3197                                              bool InheritedFromVBase) {
3198     return new (getSema().Context) CXXInheritedCtorInitExpr(
3199         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3200   }
3201 
3202   /// Build a new object-construction expression.
3203   ///
3204   /// By default, performs semantic analysis to build the new expression.
3205   /// Subclasses may override this routine to provide different behavior.
3206   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3207                                            SourceLocation LParenOrBraceLoc,
3208                                            MultiExprArg Args,
3209                                            SourceLocation RParenOrBraceLoc,
3210                                            bool ListInitialization) {
3211     return getSema().BuildCXXTypeConstructExpr(
3212         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3213   }
3214 
3215   /// Build a new object-construction expression.
3216   ///
3217   /// By default, performs semantic analysis to build the new expression.
3218   /// Subclasses may override this routine to provide different behavior.
3219   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3220                                                SourceLocation LParenLoc,
3221                                                MultiExprArg Args,
3222                                                SourceLocation RParenLoc,
3223                                                bool ListInitialization) {
3224     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3225                                                RParenLoc, ListInitialization);
3226   }
3227 
3228   /// Build a new member reference expression.
3229   ///
3230   /// By default, performs semantic analysis to build the new expression.
3231   /// Subclasses may override this routine to provide different behavior.
3232   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3233                                                 QualType BaseType,
3234                                                 bool IsArrow,
3235                                                 SourceLocation OperatorLoc,
3236                                           NestedNameSpecifierLoc QualifierLoc,
3237                                                 SourceLocation TemplateKWLoc,
3238                                             NamedDecl *FirstQualifierInScope,
3239                                    const DeclarationNameInfo &MemberNameInfo,
3240                               const TemplateArgumentListInfo *TemplateArgs) {
3241     CXXScopeSpec SS;
3242     SS.Adopt(QualifierLoc);
3243 
3244     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3245                                             OperatorLoc, IsArrow,
3246                                             SS, TemplateKWLoc,
3247                                             FirstQualifierInScope,
3248                                             MemberNameInfo,
3249                                             TemplateArgs, /*S*/nullptr);
3250   }
3251 
3252   /// Build a new member reference expression.
3253   ///
3254   /// By default, performs semantic analysis to build the new expression.
3255   /// Subclasses may override this routine to provide different behavior.
3256   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3257                                          SourceLocation OperatorLoc,
3258                                          bool IsArrow,
3259                                          NestedNameSpecifierLoc QualifierLoc,
3260                                          SourceLocation TemplateKWLoc,
3261                                          NamedDecl *FirstQualifierInScope,
3262                                          LookupResult &R,
3263                                 const TemplateArgumentListInfo *TemplateArgs) {
3264     CXXScopeSpec SS;
3265     SS.Adopt(QualifierLoc);
3266 
3267     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3268                                             OperatorLoc, IsArrow,
3269                                             SS, TemplateKWLoc,
3270                                             FirstQualifierInScope,
3271                                             R, TemplateArgs, /*S*/nullptr);
3272   }
3273 
3274   /// Build a new noexcept expression.
3275   ///
3276   /// By default, performs semantic analysis to build the new expression.
3277   /// Subclasses may override this routine to provide different behavior.
3278   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3279     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3280   }
3281 
3282   /// Build a new expression to compute the length of a parameter pack.
3283   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3284                                    NamedDecl *Pack,
3285                                    SourceLocation PackLoc,
3286                                    SourceLocation RParenLoc,
3287                                    Optional<unsigned> Length,
3288                                    ArrayRef<TemplateArgument> PartialArgs) {
3289     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3290                                   RParenLoc, Length, PartialArgs);
3291   }
3292 
3293   /// Build a new expression representing a call to a source location
3294   ///  builtin.
3295   ///
3296   /// By default, performs semantic analysis to build the new expression.
3297   /// Subclasses may override this routine to provide different behavior.
3298   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3299                                   SourceLocation BuiltinLoc,
3300                                   SourceLocation RPLoc,
3301                                   DeclContext *ParentContext) {
3302     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3303   }
3304 
3305   /// Build a new Objective-C boxed expression.
3306   ///
3307   /// By default, performs semantic analysis to build the new expression.
3308   /// Subclasses may override this routine to provide different behavior.
3309   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3310       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3311       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3312       TemplateArgumentListInfo *TALI) {
3313     CXXScopeSpec SS;
3314     SS.Adopt(NNS);
3315     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3316                                                          ConceptNameInfo,
3317                                                          FoundDecl,
3318                                                          NamedConcept, TALI);
3319     if (Result.isInvalid())
3320       return ExprError();
3321     return Result;
3322   }
3323 
3324   /// \brief Build a new requires expression.
3325   ///
3326   /// By default, performs semantic analysis to build the new expression.
3327   /// Subclasses may override this routine to provide different behavior.
3328   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3329                                  RequiresExprBodyDecl *Body,
3330                                  ArrayRef<ParmVarDecl *> LocalParameters,
3331                                  ArrayRef<concepts::Requirement *> Requirements,
3332                                  SourceLocation ClosingBraceLoc) {
3333     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3334                                 LocalParameters, Requirements, ClosingBraceLoc);
3335   }
3336 
3337   concepts::TypeRequirement *
3338   RebuildTypeRequirement(
3339       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3340     return SemaRef.BuildTypeRequirement(SubstDiag);
3341   }
3342 
3343   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3344     return SemaRef.BuildTypeRequirement(T);
3345   }
3346 
3347   concepts::ExprRequirement *
3348   RebuildExprRequirement(
3349       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3350       SourceLocation NoexceptLoc,
3351       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3352     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3353                                         std::move(Ret));
3354   }
3355 
3356   concepts::ExprRequirement *
3357   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3358                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3359     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3360                                         std::move(Ret));
3361   }
3362 
3363   concepts::NestedRequirement *
3364   RebuildNestedRequirement(
3365       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3366     return SemaRef.BuildNestedRequirement(SubstDiag);
3367   }
3368 
3369   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3370     return SemaRef.BuildNestedRequirement(Constraint);
3371   }
3372 
3373   /// \brief Build a new Objective-C boxed expression.
3374   ///
3375   /// By default, performs semantic analysis to build the new expression.
3376   /// Subclasses may override this routine to provide different behavior.
3377   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3378     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3379   }
3380 
3381   /// Build a new Objective-C array literal.
3382   ///
3383   /// By default, performs semantic analysis to build the new expression.
3384   /// Subclasses may override this routine to provide different behavior.
3385   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3386                                      Expr **Elements, unsigned NumElements) {
3387     return getSema().BuildObjCArrayLiteral(Range,
3388                                            MultiExprArg(Elements, NumElements));
3389   }
3390 
3391   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3392                                          Expr *Base, Expr *Key,
3393                                          ObjCMethodDecl *getterMethod,
3394                                          ObjCMethodDecl *setterMethod) {
3395     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3396                                                    getterMethod, setterMethod);
3397   }
3398 
3399   /// Build a new Objective-C dictionary literal.
3400   ///
3401   /// By default, performs semantic analysis to build the new expression.
3402   /// Subclasses may override this routine to provide different behavior.
3403   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3404                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3405     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3406   }
3407 
3408   /// Build a new Objective-C \@encode expression.
3409   ///
3410   /// By default, performs semantic analysis to build the new expression.
3411   /// Subclasses may override this routine to provide different behavior.
3412   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3413                                          TypeSourceInfo *EncodeTypeInfo,
3414                                          SourceLocation RParenLoc) {
3415     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3416   }
3417 
3418   /// Build a new Objective-C class message.
3419   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3420                                           Selector Sel,
3421                                           ArrayRef<SourceLocation> SelectorLocs,
3422                                           ObjCMethodDecl *Method,
3423                                           SourceLocation LBracLoc,
3424                                           MultiExprArg Args,
3425                                           SourceLocation RBracLoc) {
3426     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3427                                      ReceiverTypeInfo->getType(),
3428                                      /*SuperLoc=*/SourceLocation(),
3429                                      Sel, Method, LBracLoc, SelectorLocs,
3430                                      RBracLoc, Args);
3431   }
3432 
3433   /// Build a new Objective-C instance message.
3434   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3435                                           Selector Sel,
3436                                           ArrayRef<SourceLocation> SelectorLocs,
3437                                           ObjCMethodDecl *Method,
3438                                           SourceLocation LBracLoc,
3439                                           MultiExprArg Args,
3440                                           SourceLocation RBracLoc) {
3441     return SemaRef.BuildInstanceMessage(Receiver,
3442                                         Receiver->getType(),
3443                                         /*SuperLoc=*/SourceLocation(),
3444                                         Sel, Method, LBracLoc, SelectorLocs,
3445                                         RBracLoc, Args);
3446   }
3447 
3448   /// Build a new Objective-C instance/class message to 'super'.
3449   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3450                                     Selector Sel,
3451                                     ArrayRef<SourceLocation> SelectorLocs,
3452                                     QualType SuperType,
3453                                     ObjCMethodDecl *Method,
3454                                     SourceLocation LBracLoc,
3455                                     MultiExprArg Args,
3456                                     SourceLocation RBracLoc) {
3457     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3458                                           SuperType,
3459                                           SuperLoc,
3460                                           Sel, Method, LBracLoc, SelectorLocs,
3461                                           RBracLoc, Args)
3462                                       : SemaRef.BuildClassMessage(nullptr,
3463                                           SuperType,
3464                                           SuperLoc,
3465                                           Sel, Method, LBracLoc, SelectorLocs,
3466                                           RBracLoc, Args);
3467 
3468 
3469   }
3470 
3471   /// Build a new Objective-C ivar reference expression.
3472   ///
3473   /// By default, performs semantic analysis to build the new expression.
3474   /// Subclasses may override this routine to provide different behavior.
3475   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3476                                           SourceLocation IvarLoc,
3477                                           bool IsArrow, bool IsFreeIvar) {
3478     CXXScopeSpec SS;
3479     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3480     ExprResult Result = getSema().BuildMemberReferenceExpr(
3481         BaseArg, BaseArg->getType(),
3482         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3483         /*FirstQualifierInScope=*/nullptr, NameInfo,
3484         /*TemplateArgs=*/nullptr,
3485         /*S=*/nullptr);
3486     if (IsFreeIvar && Result.isUsable())
3487       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3488     return Result;
3489   }
3490 
3491   /// Build a new Objective-C property reference expression.
3492   ///
3493   /// By default, performs semantic analysis to build the new expression.
3494   /// Subclasses may override this routine to provide different behavior.
3495   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3496                                         ObjCPropertyDecl *Property,
3497                                         SourceLocation PropertyLoc) {
3498     CXXScopeSpec SS;
3499     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3500     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3501                                               /*FIXME:*/PropertyLoc,
3502                                               /*IsArrow=*/false,
3503                                               SS, SourceLocation(),
3504                                               /*FirstQualifierInScope=*/nullptr,
3505                                               NameInfo,
3506                                               /*TemplateArgs=*/nullptr,
3507                                               /*S=*/nullptr);
3508   }
3509 
3510   /// Build a new Objective-C property reference expression.
3511   ///
3512   /// By default, performs semantic analysis to build the new expression.
3513   /// Subclasses may override this routine to provide different behavior.
3514   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3515                                         ObjCMethodDecl *Getter,
3516                                         ObjCMethodDecl *Setter,
3517                                         SourceLocation PropertyLoc) {
3518     // Since these expressions can only be value-dependent, we do not
3519     // need to perform semantic analysis again.
3520     return Owned(
3521       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3522                                                   VK_LValue, OK_ObjCProperty,
3523                                                   PropertyLoc, Base));
3524   }
3525 
3526   /// Build a new Objective-C "isa" expression.
3527   ///
3528   /// By default, performs semantic analysis to build the new expression.
3529   /// Subclasses may override this routine to provide different behavior.
3530   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3531                                 SourceLocation OpLoc, bool IsArrow) {
3532     CXXScopeSpec SS;
3533     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3534     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3535                                               OpLoc, IsArrow,
3536                                               SS, SourceLocation(),
3537                                               /*FirstQualifierInScope=*/nullptr,
3538                                               NameInfo,
3539                                               /*TemplateArgs=*/nullptr,
3540                                               /*S=*/nullptr);
3541   }
3542 
3543   /// Build a new shuffle vector expression.
3544   ///
3545   /// By default, performs semantic analysis to build the new expression.
3546   /// Subclasses may override this routine to provide different behavior.
3547   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3548                                       MultiExprArg SubExprs,
3549                                       SourceLocation RParenLoc) {
3550     // Find the declaration for __builtin_shufflevector
3551     const IdentifierInfo &Name
3552       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3553     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3554     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3555     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3556 
3557     // Build a reference to the __builtin_shufflevector builtin
3558     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3559     Expr *Callee = new (SemaRef.Context)
3560         DeclRefExpr(SemaRef.Context, Builtin, false,
3561                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3562     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3563     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3564                                        CK_BuiltinFnToFnPtr).get();
3565 
3566     // Build the CallExpr
3567     ExprResult TheCall = CallExpr::Create(
3568         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3569         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3570         FPOptionsOverride());
3571 
3572     // Type-check the __builtin_shufflevector expression.
3573     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3574   }
3575 
3576   /// Build a new convert vector expression.
3577   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3578                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3579                                       SourceLocation RParenLoc) {
3580     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3581                                          BuiltinLoc, RParenLoc);
3582   }
3583 
3584   /// Build a new template argument pack expansion.
3585   ///
3586   /// By default, performs semantic analysis to build a new pack expansion
3587   /// for a template argument. Subclasses may override this routine to provide
3588   /// different behavior.
3589   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3590                                            SourceLocation EllipsisLoc,
3591                                            Optional<unsigned> NumExpansions) {
3592     switch (Pattern.getArgument().getKind()) {
3593     case TemplateArgument::Expression: {
3594       ExprResult Result
3595         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3596                                        EllipsisLoc, NumExpansions);
3597       if (Result.isInvalid())
3598         return TemplateArgumentLoc();
3599 
3600       return TemplateArgumentLoc(Result.get(), Result.get());
3601     }
3602 
3603     case TemplateArgument::Template:
3604       return TemplateArgumentLoc(
3605           SemaRef.Context,
3606           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3607                            NumExpansions),
3608           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3609           EllipsisLoc);
3610 
3611     case TemplateArgument::Null:
3612     case TemplateArgument::Integral:
3613     case TemplateArgument::Declaration:
3614     case TemplateArgument::Pack:
3615     case TemplateArgument::TemplateExpansion:
3616     case TemplateArgument::NullPtr:
3617       llvm_unreachable("Pack expansion pattern has no parameter packs");
3618 
3619     case TemplateArgument::Type:
3620       if (TypeSourceInfo *Expansion
3621             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3622                                            EllipsisLoc,
3623                                            NumExpansions))
3624         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3625                                    Expansion);
3626       break;
3627     }
3628 
3629     return TemplateArgumentLoc();
3630   }
3631 
3632   /// Build a new expression pack expansion.
3633   ///
3634   /// By default, performs semantic analysis to build a new pack expansion
3635   /// for an expression. Subclasses may override this routine to provide
3636   /// different behavior.
3637   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3638                                   Optional<unsigned> NumExpansions) {
3639     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3640   }
3641 
3642   /// Build a new C++1z fold-expression.
3643   ///
3644   /// By default, performs semantic analysis in order to build a new fold
3645   /// expression.
3646   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3647                                 SourceLocation LParenLoc, Expr *LHS,
3648                                 BinaryOperatorKind Operator,
3649                                 SourceLocation EllipsisLoc, Expr *RHS,
3650                                 SourceLocation RParenLoc,
3651                                 Optional<unsigned> NumExpansions) {
3652     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3653                                       EllipsisLoc, RHS, RParenLoc,
3654                                       NumExpansions);
3655   }
3656 
3657   /// Build an empty C++1z fold-expression with the given operator.
3658   ///
3659   /// By default, produces the fallback value for the fold-expression, or
3660   /// produce an error if there is no fallback value.
3661   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3662                                      BinaryOperatorKind Operator) {
3663     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3664   }
3665 
3666   /// Build a new atomic operation expression.
3667   ///
3668   /// By default, performs semantic analysis to build the new expression.
3669   /// Subclasses may override this routine to provide different behavior.
3670   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3671                                AtomicExpr::AtomicOp Op,
3672                                SourceLocation RParenLoc) {
3673     // Use this for all of the locations, since we don't know the difference
3674     // between the call and the expr at this point.
3675     SourceRange Range{BuiltinLoc, RParenLoc};
3676     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3677                                      Sema::AtomicArgumentOrder::AST);
3678   }
3679 
3680   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3681                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3682     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3683   }
3684 
3685 private:
3686   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3687                                      QualType ObjectType,
3688                                      NamedDecl *FirstQualifierInScope,
3689                                      CXXScopeSpec &SS);
3690 
3691   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3692                                              QualType ObjectType,
3693                                              NamedDecl *FirstQualifierInScope,
3694                                              CXXScopeSpec &SS);
3695 
3696   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3697                                             NamedDecl *FirstQualifierInScope,
3698                                             CXXScopeSpec &SS);
3699 
3700   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3701                                       DependentNameTypeLoc TL,
3702                                       bool DeducibleTSTContext);
3703 };
3704 
3705 template <typename Derived>
3706 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3707   if (!S)
3708     return S;
3709 
3710   switch (S->getStmtClass()) {
3711   case Stmt::NoStmtClass: break;
3712 
3713   // Transform individual statement nodes
3714   // Pass SDK into statements that can produce a value
3715 #define STMT(Node, Parent)                                              \
3716   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3717 #define VALUESTMT(Node, Parent)                                         \
3718   case Stmt::Node##Class:                                               \
3719     return getDerived().Transform##Node(cast<Node>(S), SDK);
3720 #define ABSTRACT_STMT(Node)
3721 #define EXPR(Node, Parent)
3722 #include "clang/AST/StmtNodes.inc"
3723 
3724   // Transform expressions by calling TransformExpr.
3725 #define STMT(Node, Parent)
3726 #define ABSTRACT_STMT(Stmt)
3727 #define EXPR(Node, Parent) case Stmt::Node##Class:
3728 #include "clang/AST/StmtNodes.inc"
3729     {
3730       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3731 
3732       if (SDK == SDK_StmtExprResult)
3733         E = getSema().ActOnStmtExprResult(E);
3734       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3735     }
3736   }
3737 
3738   return S;
3739 }
3740 
3741 template<typename Derived>
3742 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3743   if (!S)
3744     return S;
3745 
3746   switch (S->getClauseKind()) {
3747   default: break;
3748   // Transform individual clause nodes
3749 #define GEN_CLANG_CLAUSE_CLASS
3750 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3751   case Enum:                                                                   \
3752     return getDerived().Transform##Class(cast<Class>(S));
3753 #include "llvm/Frontend/OpenMP/OMP.inc"
3754   }
3755 
3756   return S;
3757 }
3758 
3759 
3760 template<typename Derived>
3761 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3762   if (!E)
3763     return E;
3764 
3765   switch (E->getStmtClass()) {
3766     case Stmt::NoStmtClass: break;
3767 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3768 #define ABSTRACT_STMT(Stmt)
3769 #define EXPR(Node, Parent)                                              \
3770     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3771 #include "clang/AST/StmtNodes.inc"
3772   }
3773 
3774   return E;
3775 }
3776 
3777 template<typename Derived>
3778 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3779                                                         bool NotCopyInit) {
3780   // Initializers are instantiated like expressions, except that various outer
3781   // layers are stripped.
3782   if (!Init)
3783     return Init;
3784 
3785   if (auto *FE = dyn_cast<FullExpr>(Init))
3786     Init = FE->getSubExpr();
3787 
3788   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3789     Init = AIL->getCommonExpr();
3790 
3791   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3792     Init = MTE->getSubExpr();
3793 
3794   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3795     Init = Binder->getSubExpr();
3796 
3797   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3798     Init = ICE->getSubExprAsWritten();
3799 
3800   if (CXXStdInitializerListExpr *ILE =
3801           dyn_cast<CXXStdInitializerListExpr>(Init))
3802     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3803 
3804   // If this is copy-initialization, we only need to reconstruct
3805   // InitListExprs. Other forms of copy-initialization will be a no-op if
3806   // the initializer is already the right type.
3807   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3808   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3809     return getDerived().TransformExpr(Init);
3810 
3811   // Revert value-initialization back to empty parens.
3812   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3813     SourceRange Parens = VIE->getSourceRange();
3814     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3815                                              Parens.getEnd());
3816   }
3817 
3818   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3819   if (isa<ImplicitValueInitExpr>(Init))
3820     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3821                                              SourceLocation());
3822 
3823   // Revert initialization by constructor back to a parenthesized or braced list
3824   // of expressions. Any other form of initializer can just be reused directly.
3825   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3826     return getDerived().TransformExpr(Init);
3827 
3828   // If the initialization implicitly converted an initializer list to a
3829   // std::initializer_list object, unwrap the std::initializer_list too.
3830   if (Construct && Construct->isStdInitListInitialization())
3831     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3832 
3833   // Enter a list-init context if this was list initialization.
3834   EnterExpressionEvaluationContext Context(
3835       getSema(), EnterExpressionEvaluationContext::InitList,
3836       Construct->isListInitialization());
3837 
3838   SmallVector<Expr*, 8> NewArgs;
3839   bool ArgChanged = false;
3840   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3841                                   /*IsCall*/true, NewArgs, &ArgChanged))
3842     return ExprError();
3843 
3844   // If this was list initialization, revert to syntactic list form.
3845   if (Construct->isListInitialization())
3846     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3847                                         Construct->getEndLoc());
3848 
3849   // Build a ParenListExpr to represent anything else.
3850   SourceRange Parens = Construct->getParenOrBraceRange();
3851   if (Parens.isInvalid()) {
3852     // This was a variable declaration's initialization for which no initializer
3853     // was specified.
3854     assert(NewArgs.empty() &&
3855            "no parens or braces but have direct init with arguments?");
3856     return ExprEmpty();
3857   }
3858   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3859                                            Parens.getEnd());
3860 }
3861 
3862 template<typename Derived>
3863 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3864                                             unsigned NumInputs,
3865                                             bool IsCall,
3866                                       SmallVectorImpl<Expr *> &Outputs,
3867                                             bool *ArgChanged) {
3868   for (unsigned I = 0; I != NumInputs; ++I) {
3869     // If requested, drop call arguments that need to be dropped.
3870     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3871       if (ArgChanged)
3872         *ArgChanged = true;
3873 
3874       break;
3875     }
3876 
3877     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3878       Expr *Pattern = Expansion->getPattern();
3879 
3880       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3881       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3882       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3883 
3884       // Determine whether the set of unexpanded parameter packs can and should
3885       // be expanded.
3886       bool Expand = true;
3887       bool RetainExpansion = false;
3888       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3889       Optional<unsigned> NumExpansions = OrigNumExpansions;
3890       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3891                                                Pattern->getSourceRange(),
3892                                                Unexpanded,
3893                                                Expand, RetainExpansion,
3894                                                NumExpansions))
3895         return true;
3896 
3897       if (!Expand) {
3898         // The transform has determined that we should perform a simple
3899         // transformation on the pack expansion, producing another pack
3900         // expansion.
3901         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3902         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3903         if (OutPattern.isInvalid())
3904           return true;
3905 
3906         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3907                                                 Expansion->getEllipsisLoc(),
3908                                                            NumExpansions);
3909         if (Out.isInvalid())
3910           return true;
3911 
3912         if (ArgChanged)
3913           *ArgChanged = true;
3914         Outputs.push_back(Out.get());
3915         continue;
3916       }
3917 
3918       // Record right away that the argument was changed.  This needs
3919       // to happen even if the array expands to nothing.
3920       if (ArgChanged) *ArgChanged = true;
3921 
3922       // The transform has determined that we should perform an elementwise
3923       // expansion of the pattern. Do so.
3924       for (unsigned I = 0; I != *NumExpansions; ++I) {
3925         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3926         ExprResult Out = getDerived().TransformExpr(Pattern);
3927         if (Out.isInvalid())
3928           return true;
3929 
3930         if (Out.get()->containsUnexpandedParameterPack()) {
3931           Out = getDerived().RebuildPackExpansion(
3932               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3933           if (Out.isInvalid())
3934             return true;
3935         }
3936 
3937         Outputs.push_back(Out.get());
3938       }
3939 
3940       // If we're supposed to retain a pack expansion, do so by temporarily
3941       // forgetting the partially-substituted parameter pack.
3942       if (RetainExpansion) {
3943         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3944 
3945         ExprResult Out = getDerived().TransformExpr(Pattern);
3946         if (Out.isInvalid())
3947           return true;
3948 
3949         Out = getDerived().RebuildPackExpansion(
3950             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3951         if (Out.isInvalid())
3952           return true;
3953 
3954         Outputs.push_back(Out.get());
3955       }
3956 
3957       continue;
3958     }
3959 
3960     ExprResult Result =
3961       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3962              : getDerived().TransformExpr(Inputs[I]);
3963     if (Result.isInvalid())
3964       return true;
3965 
3966     if (Result.get() != Inputs[I] && ArgChanged)
3967       *ArgChanged = true;
3968 
3969     Outputs.push_back(Result.get());
3970   }
3971 
3972   return false;
3973 }
3974 
3975 template <typename Derived>
3976 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3977     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3978   if (Var) {
3979     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3980         getDerived().TransformDefinition(Var->getLocation(), Var));
3981 
3982     if (!ConditionVar)
3983       return Sema::ConditionError();
3984 
3985     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3986   }
3987 
3988   if (Expr) {
3989     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3990 
3991     if (CondExpr.isInvalid())
3992       return Sema::ConditionError();
3993 
3994     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3995   }
3996 
3997   return Sema::ConditionResult();
3998 }
3999 
4000 template<typename Derived>
4001 NestedNameSpecifierLoc
4002 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
4003                                                     NestedNameSpecifierLoc NNS,
4004                                                      QualType ObjectType,
4005                                              NamedDecl *FirstQualifierInScope) {
4006   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
4007   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
4008        Qualifier = Qualifier.getPrefix())
4009     Qualifiers.push_back(Qualifier);
4010 
4011   CXXScopeSpec SS;
4012   while (!Qualifiers.empty()) {
4013     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
4014     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
4015 
4016     switch (QNNS->getKind()) {
4017     case NestedNameSpecifier::Identifier: {
4018       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
4019                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
4020       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
4021                                               SS, FirstQualifierInScope, false))
4022         return NestedNameSpecifierLoc();
4023     }
4024       break;
4025 
4026     case NestedNameSpecifier::Namespace: {
4027       NamespaceDecl *NS
4028         = cast_or_null<NamespaceDecl>(
4029                                     getDerived().TransformDecl(
4030                                                           Q.getLocalBeginLoc(),
4031                                                        QNNS->getAsNamespace()));
4032       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
4033       break;
4034     }
4035 
4036     case NestedNameSpecifier::NamespaceAlias: {
4037       NamespaceAliasDecl *Alias
4038         = cast_or_null<NamespaceAliasDecl>(
4039                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
4040                                                  QNNS->getAsNamespaceAlias()));
4041       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
4042                 Q.getLocalEndLoc());
4043       break;
4044     }
4045 
4046     case NestedNameSpecifier::Global:
4047       // There is no meaningful transformation that one could perform on the
4048       // global scope.
4049       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4050       break;
4051 
4052     case NestedNameSpecifier::Super: {
4053       CXXRecordDecl *RD =
4054           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4055               SourceLocation(), QNNS->getAsRecordDecl()));
4056       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4057       break;
4058     }
4059 
4060     case NestedNameSpecifier::TypeSpecWithTemplate:
4061     case NestedNameSpecifier::TypeSpec: {
4062       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4063                                               FirstQualifierInScope, SS);
4064 
4065       if (!TL)
4066         return NestedNameSpecifierLoc();
4067 
4068       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4069           (SemaRef.getLangOpts().CPlusPlus11 &&
4070            TL.getType()->isEnumeralType())) {
4071         assert(!TL.getType().hasLocalQualifiers() &&
4072                "Can't get cv-qualifiers here");
4073         if (TL.getType()->isEnumeralType())
4074           SemaRef.Diag(TL.getBeginLoc(),
4075                        diag::warn_cxx98_compat_enum_nested_name_spec);
4076         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
4077                   Q.getLocalEndLoc());
4078         break;
4079       }
4080       // If the nested-name-specifier is an invalid type def, don't emit an
4081       // error because a previous error should have already been emitted.
4082       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4083       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4084         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4085           << TL.getType() << SS.getRange();
4086       }
4087       return NestedNameSpecifierLoc();
4088     }
4089     }
4090 
4091     // The qualifier-in-scope and object type only apply to the leftmost entity.
4092     FirstQualifierInScope = nullptr;
4093     ObjectType = QualType();
4094   }
4095 
4096   // Don't rebuild the nested-name-specifier if we don't have to.
4097   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4098       !getDerived().AlwaysRebuild())
4099     return NNS;
4100 
4101   // If we can re-use the source-location data from the original
4102   // nested-name-specifier, do so.
4103   if (SS.location_size() == NNS.getDataLength() &&
4104       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4105     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4106 
4107   // Allocate new nested-name-specifier location information.
4108   return SS.getWithLocInContext(SemaRef.Context);
4109 }
4110 
4111 template<typename Derived>
4112 DeclarationNameInfo
4113 TreeTransform<Derived>
4114 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4115   DeclarationName Name = NameInfo.getName();
4116   if (!Name)
4117     return DeclarationNameInfo();
4118 
4119   switch (Name.getNameKind()) {
4120   case DeclarationName::Identifier:
4121   case DeclarationName::ObjCZeroArgSelector:
4122   case DeclarationName::ObjCOneArgSelector:
4123   case DeclarationName::ObjCMultiArgSelector:
4124   case DeclarationName::CXXOperatorName:
4125   case DeclarationName::CXXLiteralOperatorName:
4126   case DeclarationName::CXXUsingDirective:
4127     return NameInfo;
4128 
4129   case DeclarationName::CXXDeductionGuideName: {
4130     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4131     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4132         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4133     if (!NewTemplate)
4134       return DeclarationNameInfo();
4135 
4136     DeclarationNameInfo NewNameInfo(NameInfo);
4137     NewNameInfo.setName(
4138         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4139     return NewNameInfo;
4140   }
4141 
4142   case DeclarationName::CXXConstructorName:
4143   case DeclarationName::CXXDestructorName:
4144   case DeclarationName::CXXConversionFunctionName: {
4145     TypeSourceInfo *NewTInfo;
4146     CanQualType NewCanTy;
4147     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4148       NewTInfo = getDerived().TransformType(OldTInfo);
4149       if (!NewTInfo)
4150         return DeclarationNameInfo();
4151       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4152     }
4153     else {
4154       NewTInfo = nullptr;
4155       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4156       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4157       if (NewT.isNull())
4158         return DeclarationNameInfo();
4159       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4160     }
4161 
4162     DeclarationName NewName
4163       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4164                                                            NewCanTy);
4165     DeclarationNameInfo NewNameInfo(NameInfo);
4166     NewNameInfo.setName(NewName);
4167     NewNameInfo.setNamedTypeInfo(NewTInfo);
4168     return NewNameInfo;
4169   }
4170   }
4171 
4172   llvm_unreachable("Unknown name kind.");
4173 }
4174 
4175 template<typename Derived>
4176 TemplateName
4177 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4178                                               TemplateName Name,
4179                                               SourceLocation NameLoc,
4180                                               QualType ObjectType,
4181                                               NamedDecl *FirstQualifierInScope,
4182                                               bool AllowInjectedClassName) {
4183   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4184     TemplateDecl *Template = QTN->getTemplateDecl();
4185     assert(Template && "qualified template name must refer to a template");
4186 
4187     TemplateDecl *TransTemplate
4188       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4189                                                               Template));
4190     if (!TransTemplate)
4191       return TemplateName();
4192 
4193     if (!getDerived().AlwaysRebuild() &&
4194         SS.getScopeRep() == QTN->getQualifier() &&
4195         TransTemplate == Template)
4196       return Name;
4197 
4198     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4199                                             TransTemplate);
4200   }
4201 
4202   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4203     if (SS.getScopeRep()) {
4204       // These apply to the scope specifier, not the template.
4205       ObjectType = QualType();
4206       FirstQualifierInScope = nullptr;
4207     }
4208 
4209     if (!getDerived().AlwaysRebuild() &&
4210         SS.getScopeRep() == DTN->getQualifier() &&
4211         ObjectType.isNull())
4212       return Name;
4213 
4214     // FIXME: Preserve the location of the "template" keyword.
4215     SourceLocation TemplateKWLoc = NameLoc;
4216 
4217     if (DTN->isIdentifier()) {
4218       return getDerived().RebuildTemplateName(SS,
4219                                               TemplateKWLoc,
4220                                               *DTN->getIdentifier(),
4221                                               NameLoc,
4222                                               ObjectType,
4223                                               FirstQualifierInScope,
4224                                               AllowInjectedClassName);
4225     }
4226 
4227     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4228                                             DTN->getOperator(), NameLoc,
4229                                             ObjectType, AllowInjectedClassName);
4230   }
4231 
4232   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4233     TemplateDecl *TransTemplate
4234       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4235                                                               Template));
4236     if (!TransTemplate)
4237       return TemplateName();
4238 
4239     if (!getDerived().AlwaysRebuild() &&
4240         TransTemplate == Template)
4241       return Name;
4242 
4243     return TemplateName(TransTemplate);
4244   }
4245 
4246   if (SubstTemplateTemplateParmPackStorage *SubstPack
4247       = Name.getAsSubstTemplateTemplateParmPack()) {
4248     TemplateTemplateParmDecl *TransParam
4249     = cast_or_null<TemplateTemplateParmDecl>(
4250             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4251     if (!TransParam)
4252       return TemplateName();
4253 
4254     if (!getDerived().AlwaysRebuild() &&
4255         TransParam == SubstPack->getParameterPack())
4256       return Name;
4257 
4258     return getDerived().RebuildTemplateName(TransParam,
4259                                             SubstPack->getArgumentPack());
4260   }
4261 
4262   // These should be getting filtered out before they reach the AST.
4263   llvm_unreachable("overloaded function decl survived to here");
4264 }
4265 
4266 template<typename Derived>
4267 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4268                                          const TemplateArgument &Arg,
4269                                          TemplateArgumentLoc &Output) {
4270   Output = getSema().getTrivialTemplateArgumentLoc(
4271       Arg, QualType(), getDerived().getBaseLocation());
4272 }
4273 
4274 template<typename Derived>
4275 bool TreeTransform<Derived>::TransformTemplateArgument(
4276                                          const TemplateArgumentLoc &Input,
4277                                          TemplateArgumentLoc &Output, bool Uneval) {
4278   const TemplateArgument &Arg = Input.getArgument();
4279   switch (Arg.getKind()) {
4280   case TemplateArgument::Null:
4281   case TemplateArgument::Pack:
4282     llvm_unreachable("Unexpected TemplateArgument");
4283 
4284   case TemplateArgument::Integral:
4285   case TemplateArgument::NullPtr:
4286   case TemplateArgument::Declaration: {
4287     // Transform a resolved template argument straight to a resolved template
4288     // argument. We get here when substituting into an already-substituted
4289     // template type argument during concept satisfaction checking.
4290     QualType T = Arg.getNonTypeTemplateArgumentType();
4291     QualType NewT = getDerived().TransformType(T);
4292     if (NewT.isNull())
4293       return true;
4294 
4295     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4296                        ? Arg.getAsDecl()
4297                        : nullptr;
4298     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4299                               getDerived().getBaseLocation(), D))
4300                         : nullptr;
4301     if (D && !NewD)
4302       return true;
4303 
4304     if (NewT == T && D == NewD)
4305       Output = Input;
4306     else if (Arg.getKind() == TemplateArgument::Integral)
4307       Output = TemplateArgumentLoc(
4308           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4309           TemplateArgumentLocInfo());
4310     else if (Arg.getKind() == TemplateArgument::NullPtr)
4311       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4312                                    TemplateArgumentLocInfo());
4313     else
4314       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4315                                    TemplateArgumentLocInfo());
4316 
4317     return false;
4318   }
4319 
4320   case TemplateArgument::Type: {
4321     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4322     if (!DI)
4323       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4324 
4325     DI = getDerived().TransformType(DI);
4326     if (!DI) return true;
4327 
4328     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4329     return false;
4330   }
4331 
4332   case TemplateArgument::Template: {
4333     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4334     if (QualifierLoc) {
4335       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4336       if (!QualifierLoc)
4337         return true;
4338     }
4339 
4340     CXXScopeSpec SS;
4341     SS.Adopt(QualifierLoc);
4342     TemplateName Template
4343       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4344                                            Input.getTemplateNameLoc());
4345     if (Template.isNull())
4346       return true;
4347 
4348     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4349                                  QualifierLoc, Input.getTemplateNameLoc());
4350     return false;
4351   }
4352 
4353   case TemplateArgument::TemplateExpansion:
4354     llvm_unreachable("Caller should expand pack expansions");
4355 
4356   case TemplateArgument::Expression: {
4357     // Template argument expressions are constant expressions.
4358     EnterExpressionEvaluationContext Unevaluated(
4359         getSema(),
4360         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4361                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4362         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4363         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4364 
4365     Expr *InputExpr = Input.getSourceExpression();
4366     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4367 
4368     ExprResult E = getDerived().TransformExpr(InputExpr);
4369     E = SemaRef.ActOnConstantExpression(E);
4370     if (E.isInvalid()) return true;
4371     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4372     return false;
4373   }
4374   }
4375 
4376   // Work around bogus GCC warning
4377   return true;
4378 }
4379 
4380 /// Iterator adaptor that invents template argument location information
4381 /// for each of the template arguments in its underlying iterator.
4382 template<typename Derived, typename InputIterator>
4383 class TemplateArgumentLocInventIterator {
4384   TreeTransform<Derived> &Self;
4385   InputIterator Iter;
4386 
4387 public:
4388   typedef TemplateArgumentLoc value_type;
4389   typedef TemplateArgumentLoc reference;
4390   typedef typename std::iterator_traits<InputIterator>::difference_type
4391     difference_type;
4392   typedef std::input_iterator_tag iterator_category;
4393 
4394   class pointer {
4395     TemplateArgumentLoc Arg;
4396 
4397   public:
4398     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4399 
4400     const TemplateArgumentLoc *operator->() const { return &Arg; }
4401   };
4402 
4403   TemplateArgumentLocInventIterator() { }
4404 
4405   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4406                                              InputIterator Iter)
4407     : Self(Self), Iter(Iter) { }
4408 
4409   TemplateArgumentLocInventIterator &operator++() {
4410     ++Iter;
4411     return *this;
4412   }
4413 
4414   TemplateArgumentLocInventIterator operator++(int) {
4415     TemplateArgumentLocInventIterator Old(*this);
4416     ++(*this);
4417     return Old;
4418   }
4419 
4420   reference operator*() const {
4421     TemplateArgumentLoc Result;
4422     Self.InventTemplateArgumentLoc(*Iter, Result);
4423     return Result;
4424   }
4425 
4426   pointer operator->() const { return pointer(**this); }
4427 
4428   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4429                          const TemplateArgumentLocInventIterator &Y) {
4430     return X.Iter == Y.Iter;
4431   }
4432 
4433   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4434                          const TemplateArgumentLocInventIterator &Y) {
4435     return X.Iter != Y.Iter;
4436   }
4437 };
4438 
4439 template<typename Derived>
4440 template<typename InputIterator>
4441 bool TreeTransform<Derived>::TransformTemplateArguments(
4442     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4443     bool Uneval) {
4444   for (; First != Last; ++First) {
4445     TemplateArgumentLoc Out;
4446     TemplateArgumentLoc In = *First;
4447 
4448     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4449       // Unpack argument packs, which we translate them into separate
4450       // arguments.
4451       // FIXME: We could do much better if we could guarantee that the
4452       // TemplateArgumentLocInfo for the pack expansion would be usable for
4453       // all of the template arguments in the argument pack.
4454       typedef TemplateArgumentLocInventIterator<Derived,
4455                                                 TemplateArgument::pack_iterator>
4456         PackLocIterator;
4457       if (TransformTemplateArguments(PackLocIterator(*this,
4458                                                  In.getArgument().pack_begin()),
4459                                      PackLocIterator(*this,
4460                                                    In.getArgument().pack_end()),
4461                                      Outputs, Uneval))
4462         return true;
4463 
4464       continue;
4465     }
4466 
4467     if (In.getArgument().isPackExpansion()) {
4468       // We have a pack expansion, for which we will be substituting into
4469       // the pattern.
4470       SourceLocation Ellipsis;
4471       Optional<unsigned> OrigNumExpansions;
4472       TemplateArgumentLoc Pattern
4473         = getSema().getTemplateArgumentPackExpansionPattern(
4474               In, Ellipsis, OrigNumExpansions);
4475 
4476       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4477       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4478       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4479 
4480       // Determine whether the set of unexpanded parameter packs can and should
4481       // be expanded.
4482       bool Expand = true;
4483       bool RetainExpansion = false;
4484       Optional<unsigned> NumExpansions = OrigNumExpansions;
4485       if (getDerived().TryExpandParameterPacks(Ellipsis,
4486                                                Pattern.getSourceRange(),
4487                                                Unexpanded,
4488                                                Expand,
4489                                                RetainExpansion,
4490                                                NumExpansions))
4491         return true;
4492 
4493       if (!Expand) {
4494         // The transform has determined that we should perform a simple
4495         // transformation on the pack expansion, producing another pack
4496         // expansion.
4497         TemplateArgumentLoc OutPattern;
4498         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4499         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4500           return true;
4501 
4502         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4503                                                 NumExpansions);
4504         if (Out.getArgument().isNull())
4505           return true;
4506 
4507         Outputs.addArgument(Out);
4508         continue;
4509       }
4510 
4511       // The transform has determined that we should perform an elementwise
4512       // expansion of the pattern. Do so.
4513       for (unsigned I = 0; I != *NumExpansions; ++I) {
4514         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4515 
4516         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4517           return true;
4518 
4519         if (Out.getArgument().containsUnexpandedParameterPack()) {
4520           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4521                                                   OrigNumExpansions);
4522           if (Out.getArgument().isNull())
4523             return true;
4524         }
4525 
4526         Outputs.addArgument(Out);
4527       }
4528 
4529       // If we're supposed to retain a pack expansion, do so by temporarily
4530       // forgetting the partially-substituted parameter pack.
4531       if (RetainExpansion) {
4532         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4533 
4534         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4535           return true;
4536 
4537         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4538                                                 OrigNumExpansions);
4539         if (Out.getArgument().isNull())
4540           return true;
4541 
4542         Outputs.addArgument(Out);
4543       }
4544 
4545       continue;
4546     }
4547 
4548     // The simple case:
4549     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4550       return true;
4551 
4552     Outputs.addArgument(Out);
4553   }
4554 
4555   return false;
4556 
4557 }
4558 
4559 //===----------------------------------------------------------------------===//
4560 // Type transformation
4561 //===----------------------------------------------------------------------===//
4562 
4563 template<typename Derived>
4564 QualType TreeTransform<Derived>::TransformType(QualType T) {
4565   if (getDerived().AlreadyTransformed(T))
4566     return T;
4567 
4568   // Temporary workaround.  All of these transformations should
4569   // eventually turn into transformations on TypeLocs.
4570   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4571                                                 getDerived().getBaseLocation());
4572 
4573   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4574 
4575   if (!NewDI)
4576     return QualType();
4577 
4578   return NewDI->getType();
4579 }
4580 
4581 template<typename Derived>
4582 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4583   // Refine the base location to the type's location.
4584   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4585                        getDerived().getBaseEntity());
4586   if (getDerived().AlreadyTransformed(DI->getType()))
4587     return DI;
4588 
4589   TypeLocBuilder TLB;
4590 
4591   TypeLoc TL = DI->getTypeLoc();
4592   TLB.reserve(TL.getFullDataSize());
4593 
4594   QualType Result = getDerived().TransformType(TLB, TL);
4595   if (Result.isNull())
4596     return nullptr;
4597 
4598   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4599 }
4600 
4601 template<typename Derived>
4602 QualType
4603 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4604   switch (T.getTypeLocClass()) {
4605 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4606 #define TYPELOC(CLASS, PARENT)                                                 \
4607   case TypeLoc::CLASS:                                                         \
4608     return getDerived().Transform##CLASS##Type(TLB,                            \
4609                                                T.castAs<CLASS##TypeLoc>());
4610 #include "clang/AST/TypeLocNodes.def"
4611   }
4612 
4613   llvm_unreachable("unhandled type loc!");
4614 }
4615 
4616 template<typename Derived>
4617 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4618   if (!isa<DependentNameType>(T))
4619     return TransformType(T);
4620 
4621   if (getDerived().AlreadyTransformed(T))
4622     return T;
4623   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4624                                                 getDerived().getBaseLocation());
4625   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4626   return NewDI ? NewDI->getType() : QualType();
4627 }
4628 
4629 template<typename Derived>
4630 TypeSourceInfo *
4631 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4632   if (!isa<DependentNameType>(DI->getType()))
4633     return TransformType(DI);
4634 
4635   // Refine the base location to the type's location.
4636   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4637                        getDerived().getBaseEntity());
4638   if (getDerived().AlreadyTransformed(DI->getType()))
4639     return DI;
4640 
4641   TypeLocBuilder TLB;
4642 
4643   TypeLoc TL = DI->getTypeLoc();
4644   TLB.reserve(TL.getFullDataSize());
4645 
4646   auto QTL = TL.getAs<QualifiedTypeLoc>();
4647   if (QTL)
4648     TL = QTL.getUnqualifiedLoc();
4649 
4650   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4651 
4652   QualType Result = getDerived().TransformDependentNameType(
4653       TLB, DNTL, /*DeducedTSTContext*/true);
4654   if (Result.isNull())
4655     return nullptr;
4656 
4657   if (QTL) {
4658     Result = getDerived().RebuildQualifiedType(Result, QTL);
4659     if (Result.isNull())
4660       return nullptr;
4661     TLB.TypeWasModifiedSafely(Result);
4662   }
4663 
4664   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4665 }
4666 
4667 template<typename Derived>
4668 QualType
4669 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4670                                                QualifiedTypeLoc T) {
4671   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4672   if (Result.isNull())
4673     return QualType();
4674 
4675   Result = getDerived().RebuildQualifiedType(Result, T);
4676 
4677   if (Result.isNull())
4678     return QualType();
4679 
4680   // RebuildQualifiedType might have updated the type, but not in a way
4681   // that invalidates the TypeLoc. (There's no location information for
4682   // qualifiers.)
4683   TLB.TypeWasModifiedSafely(Result);
4684 
4685   return Result;
4686 }
4687 
4688 template <typename Derived>
4689 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4690                                                       QualifiedTypeLoc TL) {
4691 
4692   SourceLocation Loc = TL.getBeginLoc();
4693   Qualifiers Quals = TL.getType().getLocalQualifiers();
4694 
4695   if (((T.getAddressSpace() != LangAS::Default &&
4696         Quals.getAddressSpace() != LangAS::Default)) &&
4697       T.getAddressSpace() != Quals.getAddressSpace()) {
4698     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4699         << TL.getType() << T;
4700     return QualType();
4701   }
4702 
4703   // C++ [dcl.fct]p7:
4704   //   [When] adding cv-qualifications on top of the function type [...] the
4705   //   cv-qualifiers are ignored.
4706   if (T->isFunctionType()) {
4707     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4708                                                      Quals.getAddressSpace());
4709     return T;
4710   }
4711 
4712   // C++ [dcl.ref]p1:
4713   //   when the cv-qualifiers are introduced through the use of a typedef-name
4714   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4715   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4716   // applied to a reference type.
4717   if (T->isReferenceType()) {
4718     // The only qualifier that applies to a reference type is restrict.
4719     if (!Quals.hasRestrict())
4720       return T;
4721     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4722   }
4723 
4724   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4725   // resulting type.
4726   if (Quals.hasObjCLifetime()) {
4727     if (!T->isObjCLifetimeType() && !T->isDependentType())
4728       Quals.removeObjCLifetime();
4729     else if (T.getObjCLifetime()) {
4730       // Objective-C ARC:
4731       //   A lifetime qualifier applied to a substituted template parameter
4732       //   overrides the lifetime qualifier from the template argument.
4733       const AutoType *AutoTy;
4734       if (const SubstTemplateTypeParmType *SubstTypeParam
4735                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4736         QualType Replacement = SubstTypeParam->getReplacementType();
4737         Qualifiers Qs = Replacement.getQualifiers();
4738         Qs.removeObjCLifetime();
4739         Replacement = SemaRef.Context.getQualifiedType(
4740             Replacement.getUnqualifiedType(), Qs);
4741         T = SemaRef.Context.getSubstTemplateTypeParmType(
4742             SubstTypeParam->getReplacedParameter(), Replacement);
4743       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4744         // 'auto' types behave the same way as template parameters.
4745         QualType Deduced = AutoTy->getDeducedType();
4746         Qualifiers Qs = Deduced.getQualifiers();
4747         Qs.removeObjCLifetime();
4748         Deduced =
4749             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4750         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4751                                         AutoTy->isDependentType(),
4752                                         /*isPack=*/false,
4753                                         AutoTy->getTypeConstraintConcept(),
4754                                         AutoTy->getTypeConstraintArguments());
4755       } else {
4756         // Otherwise, complain about the addition of a qualifier to an
4757         // already-qualified type.
4758         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4759         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4760         Quals.removeObjCLifetime();
4761       }
4762     }
4763   }
4764 
4765   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4766 }
4767 
4768 template<typename Derived>
4769 TypeLoc
4770 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4771                                                    QualType ObjectType,
4772                                                    NamedDecl *UnqualLookup,
4773                                                    CXXScopeSpec &SS) {
4774   if (getDerived().AlreadyTransformed(TL.getType()))
4775     return TL;
4776 
4777   TypeSourceInfo *TSI =
4778       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4779   if (TSI)
4780     return TSI->getTypeLoc();
4781   return TypeLoc();
4782 }
4783 
4784 template<typename Derived>
4785 TypeSourceInfo *
4786 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4787                                                    QualType ObjectType,
4788                                                    NamedDecl *UnqualLookup,
4789                                                    CXXScopeSpec &SS) {
4790   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4791     return TSInfo;
4792 
4793   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4794                                    UnqualLookup, SS);
4795 }
4796 
4797 template <typename Derived>
4798 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4799     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4800     CXXScopeSpec &SS) {
4801   QualType T = TL.getType();
4802   assert(!getDerived().AlreadyTransformed(T));
4803 
4804   TypeLocBuilder TLB;
4805   QualType Result;
4806 
4807   if (isa<TemplateSpecializationType>(T)) {
4808     TemplateSpecializationTypeLoc SpecTL =
4809         TL.castAs<TemplateSpecializationTypeLoc>();
4810 
4811     TemplateName Template = getDerived().TransformTemplateName(
4812         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4813         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4814     if (Template.isNull())
4815       return nullptr;
4816 
4817     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4818                                                               Template);
4819   } else if (isa<DependentTemplateSpecializationType>(T)) {
4820     DependentTemplateSpecializationTypeLoc SpecTL =
4821         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4822 
4823     TemplateName Template
4824       = getDerived().RebuildTemplateName(SS,
4825                                          SpecTL.getTemplateKeywordLoc(),
4826                                          *SpecTL.getTypePtr()->getIdentifier(),
4827                                          SpecTL.getTemplateNameLoc(),
4828                                          ObjectType, UnqualLookup,
4829                                          /*AllowInjectedClassName*/true);
4830     if (Template.isNull())
4831       return nullptr;
4832 
4833     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4834                                                                        SpecTL,
4835                                                                        Template,
4836                                                                        SS);
4837   } else {
4838     // Nothing special needs to be done for these.
4839     Result = getDerived().TransformType(TLB, TL);
4840   }
4841 
4842   if (Result.isNull())
4843     return nullptr;
4844 
4845   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4846 }
4847 
4848 template <class TyLoc> static inline
4849 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4850   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4851   NewT.setNameLoc(T.getNameLoc());
4852   return T.getType();
4853 }
4854 
4855 template<typename Derived>
4856 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4857                                                       BuiltinTypeLoc T) {
4858   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4859   NewT.setBuiltinLoc(T.getBuiltinLoc());
4860   if (T.needsExtraLocalData())
4861     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4862   return T.getType();
4863 }
4864 
4865 template<typename Derived>
4866 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4867                                                       ComplexTypeLoc T) {
4868   // FIXME: recurse?
4869   return TransformTypeSpecType(TLB, T);
4870 }
4871 
4872 template <typename Derived>
4873 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4874                                                        AdjustedTypeLoc TL) {
4875   // Adjustments applied during transformation are handled elsewhere.
4876   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4877 }
4878 
4879 template<typename Derived>
4880 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4881                                                       DecayedTypeLoc TL) {
4882   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4883   if (OriginalType.isNull())
4884     return QualType();
4885 
4886   QualType Result = TL.getType();
4887   if (getDerived().AlwaysRebuild() ||
4888       OriginalType != TL.getOriginalLoc().getType())
4889     Result = SemaRef.Context.getDecayedType(OriginalType);
4890   TLB.push<DecayedTypeLoc>(Result);
4891   // Nothing to set for DecayedTypeLoc.
4892   return Result;
4893 }
4894 
4895 template<typename Derived>
4896 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4897                                                       PointerTypeLoc TL) {
4898   QualType PointeeType
4899     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4900   if (PointeeType.isNull())
4901     return QualType();
4902 
4903   QualType Result = TL.getType();
4904   if (PointeeType->getAs<ObjCObjectType>()) {
4905     // A dependent pointer type 'T *' has is being transformed such
4906     // that an Objective-C class type is being replaced for 'T'. The
4907     // resulting pointer type is an ObjCObjectPointerType, not a
4908     // PointerType.
4909     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4910 
4911     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4912     NewT.setStarLoc(TL.getStarLoc());
4913     return Result;
4914   }
4915 
4916   if (getDerived().AlwaysRebuild() ||
4917       PointeeType != TL.getPointeeLoc().getType()) {
4918     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4919     if (Result.isNull())
4920       return QualType();
4921   }
4922 
4923   // Objective-C ARC can add lifetime qualifiers to the type that we're
4924   // pointing to.
4925   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4926 
4927   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4928   NewT.setSigilLoc(TL.getSigilLoc());
4929   return Result;
4930 }
4931 
4932 template<typename Derived>
4933 QualType
4934 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4935                                                   BlockPointerTypeLoc TL) {
4936   QualType PointeeType
4937     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4938   if (PointeeType.isNull())
4939     return QualType();
4940 
4941   QualType Result = TL.getType();
4942   if (getDerived().AlwaysRebuild() ||
4943       PointeeType != TL.getPointeeLoc().getType()) {
4944     Result = getDerived().RebuildBlockPointerType(PointeeType,
4945                                                   TL.getSigilLoc());
4946     if (Result.isNull())
4947       return QualType();
4948   }
4949 
4950   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4951   NewT.setSigilLoc(TL.getSigilLoc());
4952   return Result;
4953 }
4954 
4955 /// Transforms a reference type.  Note that somewhat paradoxically we
4956 /// don't care whether the type itself is an l-value type or an r-value
4957 /// type;  we only care if the type was *written* as an l-value type
4958 /// or an r-value type.
4959 template<typename Derived>
4960 QualType
4961 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4962                                                ReferenceTypeLoc TL) {
4963   const ReferenceType *T = TL.getTypePtr();
4964 
4965   // Note that this works with the pointee-as-written.
4966   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4967   if (PointeeType.isNull())
4968     return QualType();
4969 
4970   QualType Result = TL.getType();
4971   if (getDerived().AlwaysRebuild() ||
4972       PointeeType != T->getPointeeTypeAsWritten()) {
4973     Result = getDerived().RebuildReferenceType(PointeeType,
4974                                                T->isSpelledAsLValue(),
4975                                                TL.getSigilLoc());
4976     if (Result.isNull())
4977       return QualType();
4978   }
4979 
4980   // Objective-C ARC can add lifetime qualifiers to the type that we're
4981   // referring to.
4982   TLB.TypeWasModifiedSafely(
4983       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4984 
4985   // r-value references can be rebuilt as l-value references.
4986   ReferenceTypeLoc NewTL;
4987   if (isa<LValueReferenceType>(Result))
4988     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4989   else
4990     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4991   NewTL.setSigilLoc(TL.getSigilLoc());
4992 
4993   return Result;
4994 }
4995 
4996 template<typename Derived>
4997 QualType
4998 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4999                                                  LValueReferenceTypeLoc TL) {
5000   return TransformReferenceType(TLB, TL);
5001 }
5002 
5003 template<typename Derived>
5004 QualType
5005 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
5006                                                  RValueReferenceTypeLoc TL) {
5007   return TransformReferenceType(TLB, TL);
5008 }
5009 
5010 template<typename Derived>
5011 QualType
5012 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
5013                                                    MemberPointerTypeLoc TL) {
5014   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
5015   if (PointeeType.isNull())
5016     return QualType();
5017 
5018   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
5019   TypeSourceInfo *NewClsTInfo = nullptr;
5020   if (OldClsTInfo) {
5021     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
5022     if (!NewClsTInfo)
5023       return QualType();
5024   }
5025 
5026   const MemberPointerType *T = TL.getTypePtr();
5027   QualType OldClsType = QualType(T->getClass(), 0);
5028   QualType NewClsType;
5029   if (NewClsTInfo)
5030     NewClsType = NewClsTInfo->getType();
5031   else {
5032     NewClsType = getDerived().TransformType(OldClsType);
5033     if (NewClsType.isNull())
5034       return QualType();
5035   }
5036 
5037   QualType Result = TL.getType();
5038   if (getDerived().AlwaysRebuild() ||
5039       PointeeType != T->getPointeeType() ||
5040       NewClsType != OldClsType) {
5041     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
5042                                                    TL.getStarLoc());
5043     if (Result.isNull())
5044       return QualType();
5045   }
5046 
5047   // If we had to adjust the pointee type when building a member pointer, make
5048   // sure to push TypeLoc info for it.
5049   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5050   if (MPT && PointeeType != MPT->getPointeeType()) {
5051     assert(isa<AdjustedType>(MPT->getPointeeType()));
5052     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5053   }
5054 
5055   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5056   NewTL.setSigilLoc(TL.getSigilLoc());
5057   NewTL.setClassTInfo(NewClsTInfo);
5058 
5059   return Result;
5060 }
5061 
5062 template<typename Derived>
5063 QualType
5064 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5065                                                    ConstantArrayTypeLoc TL) {
5066   const ConstantArrayType *T = TL.getTypePtr();
5067   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5068   if (ElementType.isNull())
5069     return QualType();
5070 
5071   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5072   Expr *OldSize = TL.getSizeExpr();
5073   if (!OldSize)
5074     OldSize = const_cast<Expr*>(T->getSizeExpr());
5075   Expr *NewSize = nullptr;
5076   if (OldSize) {
5077     EnterExpressionEvaluationContext Unevaluated(
5078         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5079     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5080     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5081   }
5082 
5083   QualType Result = TL.getType();
5084   if (getDerived().AlwaysRebuild() ||
5085       ElementType != T->getElementType() ||
5086       (T->getSizeExpr() && NewSize != OldSize)) {
5087     Result = getDerived().RebuildConstantArrayType(ElementType,
5088                                                    T->getSizeModifier(),
5089                                                    T->getSize(), NewSize,
5090                                              T->getIndexTypeCVRQualifiers(),
5091                                                    TL.getBracketsRange());
5092     if (Result.isNull())
5093       return QualType();
5094   }
5095 
5096   // We might have either a ConstantArrayType or a VariableArrayType now:
5097   // a ConstantArrayType is allowed to have an element type which is a
5098   // VariableArrayType if the type is dependent.  Fortunately, all array
5099   // types have the same location layout.
5100   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5101   NewTL.setLBracketLoc(TL.getLBracketLoc());
5102   NewTL.setRBracketLoc(TL.getRBracketLoc());
5103   NewTL.setSizeExpr(NewSize);
5104 
5105   return Result;
5106 }
5107 
5108 template<typename Derived>
5109 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5110                                               TypeLocBuilder &TLB,
5111                                               IncompleteArrayTypeLoc TL) {
5112   const IncompleteArrayType *T = TL.getTypePtr();
5113   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5114   if (ElementType.isNull())
5115     return QualType();
5116 
5117   QualType Result = TL.getType();
5118   if (getDerived().AlwaysRebuild() ||
5119       ElementType != T->getElementType()) {
5120     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5121                                                      T->getSizeModifier(),
5122                                            T->getIndexTypeCVRQualifiers(),
5123                                                      TL.getBracketsRange());
5124     if (Result.isNull())
5125       return QualType();
5126   }
5127 
5128   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5129   NewTL.setLBracketLoc(TL.getLBracketLoc());
5130   NewTL.setRBracketLoc(TL.getRBracketLoc());
5131   NewTL.setSizeExpr(nullptr);
5132 
5133   return Result;
5134 }
5135 
5136 template<typename Derived>
5137 QualType
5138 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5139                                                    VariableArrayTypeLoc TL) {
5140   const VariableArrayType *T = TL.getTypePtr();
5141   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5142   if (ElementType.isNull())
5143     return QualType();
5144 
5145   ExprResult SizeResult;
5146   {
5147     EnterExpressionEvaluationContext Context(
5148         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5149     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5150   }
5151   if (SizeResult.isInvalid())
5152     return QualType();
5153   SizeResult =
5154       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5155   if (SizeResult.isInvalid())
5156     return QualType();
5157 
5158   Expr *Size = SizeResult.get();
5159 
5160   QualType Result = TL.getType();
5161   if (getDerived().AlwaysRebuild() ||
5162       ElementType != T->getElementType() ||
5163       Size != T->getSizeExpr()) {
5164     Result = getDerived().RebuildVariableArrayType(ElementType,
5165                                                    T->getSizeModifier(),
5166                                                    Size,
5167                                              T->getIndexTypeCVRQualifiers(),
5168                                                    TL.getBracketsRange());
5169     if (Result.isNull())
5170       return QualType();
5171   }
5172 
5173   // We might have constant size array now, but fortunately it has the same
5174   // location layout.
5175   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5176   NewTL.setLBracketLoc(TL.getLBracketLoc());
5177   NewTL.setRBracketLoc(TL.getRBracketLoc());
5178   NewTL.setSizeExpr(Size);
5179 
5180   return Result;
5181 }
5182 
5183 template<typename Derived>
5184 QualType
5185 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5186                                              DependentSizedArrayTypeLoc TL) {
5187   const DependentSizedArrayType *T = TL.getTypePtr();
5188   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5189   if (ElementType.isNull())
5190     return QualType();
5191 
5192   // Array bounds are constant expressions.
5193   EnterExpressionEvaluationContext Unevaluated(
5194       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5195 
5196   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5197   Expr *origSize = TL.getSizeExpr();
5198   if (!origSize) origSize = T->getSizeExpr();
5199 
5200   ExprResult sizeResult
5201     = getDerived().TransformExpr(origSize);
5202   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5203   if (sizeResult.isInvalid())
5204     return QualType();
5205 
5206   Expr *size = sizeResult.get();
5207 
5208   QualType Result = TL.getType();
5209   if (getDerived().AlwaysRebuild() ||
5210       ElementType != T->getElementType() ||
5211       size != origSize) {
5212     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5213                                                          T->getSizeModifier(),
5214                                                          size,
5215                                                 T->getIndexTypeCVRQualifiers(),
5216                                                         TL.getBracketsRange());
5217     if (Result.isNull())
5218       return QualType();
5219   }
5220 
5221   // We might have any sort of array type now, but fortunately they
5222   // all have the same location layout.
5223   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5224   NewTL.setLBracketLoc(TL.getLBracketLoc());
5225   NewTL.setRBracketLoc(TL.getRBracketLoc());
5226   NewTL.setSizeExpr(size);
5227 
5228   return Result;
5229 }
5230 
5231 template <typename Derived>
5232 QualType TreeTransform<Derived>::TransformDependentVectorType(
5233     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5234   const DependentVectorType *T = TL.getTypePtr();
5235   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5236   if (ElementType.isNull())
5237     return QualType();
5238 
5239   EnterExpressionEvaluationContext Unevaluated(
5240       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5241 
5242   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5243   Size = SemaRef.ActOnConstantExpression(Size);
5244   if (Size.isInvalid())
5245     return QualType();
5246 
5247   QualType Result = TL.getType();
5248   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5249       Size.get() != T->getSizeExpr()) {
5250     Result = getDerived().RebuildDependentVectorType(
5251         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5252     if (Result.isNull())
5253       return QualType();
5254   }
5255 
5256   // Result might be dependent or not.
5257   if (isa<DependentVectorType>(Result)) {
5258     DependentVectorTypeLoc NewTL =
5259         TLB.push<DependentVectorTypeLoc>(Result);
5260     NewTL.setNameLoc(TL.getNameLoc());
5261   } else {
5262     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5263     NewTL.setNameLoc(TL.getNameLoc());
5264   }
5265 
5266   return Result;
5267 }
5268 
5269 template<typename Derived>
5270 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5271                                       TypeLocBuilder &TLB,
5272                                       DependentSizedExtVectorTypeLoc TL) {
5273   const DependentSizedExtVectorType *T = TL.getTypePtr();
5274 
5275   // FIXME: ext vector locs should be nested
5276   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5277   if (ElementType.isNull())
5278     return QualType();
5279 
5280   // Vector sizes are constant expressions.
5281   EnterExpressionEvaluationContext Unevaluated(
5282       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5283 
5284   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5285   Size = SemaRef.ActOnConstantExpression(Size);
5286   if (Size.isInvalid())
5287     return QualType();
5288 
5289   QualType Result = TL.getType();
5290   if (getDerived().AlwaysRebuild() ||
5291       ElementType != T->getElementType() ||
5292       Size.get() != T->getSizeExpr()) {
5293     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5294                                                              Size.get(),
5295                                                          T->getAttributeLoc());
5296     if (Result.isNull())
5297       return QualType();
5298   }
5299 
5300   // Result might be dependent or not.
5301   if (isa<DependentSizedExtVectorType>(Result)) {
5302     DependentSizedExtVectorTypeLoc NewTL
5303       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5304     NewTL.setNameLoc(TL.getNameLoc());
5305   } else {
5306     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5307     NewTL.setNameLoc(TL.getNameLoc());
5308   }
5309 
5310   return Result;
5311 }
5312 
5313 template <typename Derived>
5314 QualType
5315 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5316                                                     ConstantMatrixTypeLoc TL) {
5317   const ConstantMatrixType *T = TL.getTypePtr();
5318   QualType ElementType = getDerived().TransformType(T->getElementType());
5319   if (ElementType.isNull())
5320     return QualType();
5321 
5322   QualType Result = TL.getType();
5323   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5324     Result = getDerived().RebuildConstantMatrixType(
5325         ElementType, T->getNumRows(), T->getNumColumns());
5326     if (Result.isNull())
5327       return QualType();
5328   }
5329 
5330   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5331   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5332   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5333   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5334   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5335 
5336   return Result;
5337 }
5338 
5339 template <typename Derived>
5340 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5341     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5342   const DependentSizedMatrixType *T = TL.getTypePtr();
5343 
5344   QualType ElementType = getDerived().TransformType(T->getElementType());
5345   if (ElementType.isNull()) {
5346     return QualType();
5347   }
5348 
5349   // Matrix dimensions are constant expressions.
5350   EnterExpressionEvaluationContext Unevaluated(
5351       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5352 
5353   Expr *origRows = TL.getAttrRowOperand();
5354   if (!origRows)
5355     origRows = T->getRowExpr();
5356   Expr *origColumns = TL.getAttrColumnOperand();
5357   if (!origColumns)
5358     origColumns = T->getColumnExpr();
5359 
5360   ExprResult rowResult = getDerived().TransformExpr(origRows);
5361   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5362   if (rowResult.isInvalid())
5363     return QualType();
5364 
5365   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5366   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5367   if (columnResult.isInvalid())
5368     return QualType();
5369 
5370   Expr *rows = rowResult.get();
5371   Expr *columns = columnResult.get();
5372 
5373   QualType Result = TL.getType();
5374   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5375       rows != origRows || columns != origColumns) {
5376     Result = getDerived().RebuildDependentSizedMatrixType(
5377         ElementType, rows, columns, T->getAttributeLoc());
5378 
5379     if (Result.isNull())
5380       return QualType();
5381   }
5382 
5383   // We might have any sort of matrix type now, but fortunately they
5384   // all have the same location layout.
5385   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5386   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5387   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5388   NewTL.setAttrRowOperand(rows);
5389   NewTL.setAttrColumnOperand(columns);
5390   return Result;
5391 }
5392 
5393 template <typename Derived>
5394 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5395     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5396   const DependentAddressSpaceType *T = TL.getTypePtr();
5397 
5398   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5399 
5400   if (pointeeType.isNull())
5401     return QualType();
5402 
5403   // Address spaces are constant expressions.
5404   EnterExpressionEvaluationContext Unevaluated(
5405       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5406 
5407   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5408   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5409   if (AddrSpace.isInvalid())
5410     return QualType();
5411 
5412   QualType Result = TL.getType();
5413   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5414       AddrSpace.get() != T->getAddrSpaceExpr()) {
5415     Result = getDerived().RebuildDependentAddressSpaceType(
5416         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5417     if (Result.isNull())
5418       return QualType();
5419   }
5420 
5421   // Result might be dependent or not.
5422   if (isa<DependentAddressSpaceType>(Result)) {
5423     DependentAddressSpaceTypeLoc NewTL =
5424         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5425 
5426     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5427     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5428     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5429 
5430   } else {
5431     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5432         Result, getDerived().getBaseLocation());
5433     TransformType(TLB, DI->getTypeLoc());
5434   }
5435 
5436   return Result;
5437 }
5438 
5439 template <typename Derived>
5440 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5441                                                      VectorTypeLoc TL) {
5442   const VectorType *T = TL.getTypePtr();
5443   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5444   if (ElementType.isNull())
5445     return QualType();
5446 
5447   QualType Result = TL.getType();
5448   if (getDerived().AlwaysRebuild() ||
5449       ElementType != T->getElementType()) {
5450     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5451                                             T->getVectorKind());
5452     if (Result.isNull())
5453       return QualType();
5454   }
5455 
5456   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5457   NewTL.setNameLoc(TL.getNameLoc());
5458 
5459   return Result;
5460 }
5461 
5462 template<typename Derived>
5463 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5464                                                         ExtVectorTypeLoc TL) {
5465   const VectorType *T = TL.getTypePtr();
5466   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5467   if (ElementType.isNull())
5468     return QualType();
5469 
5470   QualType Result = TL.getType();
5471   if (getDerived().AlwaysRebuild() ||
5472       ElementType != T->getElementType()) {
5473     Result = getDerived().RebuildExtVectorType(ElementType,
5474                                                T->getNumElements(),
5475                                                /*FIXME*/ SourceLocation());
5476     if (Result.isNull())
5477       return QualType();
5478   }
5479 
5480   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5481   NewTL.setNameLoc(TL.getNameLoc());
5482 
5483   return Result;
5484 }
5485 
5486 template <typename Derived>
5487 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5488     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5489     bool ExpectParameterPack) {
5490   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5491   TypeSourceInfo *NewDI = nullptr;
5492 
5493   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5494     // If we're substituting into a pack expansion type and we know the
5495     // length we want to expand to, just substitute for the pattern.
5496     TypeLoc OldTL = OldDI->getTypeLoc();
5497     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5498 
5499     TypeLocBuilder TLB;
5500     TypeLoc NewTL = OldDI->getTypeLoc();
5501     TLB.reserve(NewTL.getFullDataSize());
5502 
5503     QualType Result = getDerived().TransformType(TLB,
5504                                                OldExpansionTL.getPatternLoc());
5505     if (Result.isNull())
5506       return nullptr;
5507 
5508     Result = RebuildPackExpansionType(Result,
5509                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5510                                       OldExpansionTL.getEllipsisLoc(),
5511                                       NumExpansions);
5512     if (Result.isNull())
5513       return nullptr;
5514 
5515     PackExpansionTypeLoc NewExpansionTL
5516       = TLB.push<PackExpansionTypeLoc>(Result);
5517     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5518     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5519   } else
5520     NewDI = getDerived().TransformType(OldDI);
5521   if (!NewDI)
5522     return nullptr;
5523 
5524   if (NewDI == OldDI && indexAdjustment == 0)
5525     return OldParm;
5526 
5527   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5528                                              OldParm->getDeclContext(),
5529                                              OldParm->getInnerLocStart(),
5530                                              OldParm->getLocation(),
5531                                              OldParm->getIdentifier(),
5532                                              NewDI->getType(),
5533                                              NewDI,
5534                                              OldParm->getStorageClass(),
5535                                              /* DefArg */ nullptr);
5536   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5537                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5538   transformedLocalDecl(OldParm, {newParm});
5539   return newParm;
5540 }
5541 
5542 template <typename Derived>
5543 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5544     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5545     const QualType *ParamTypes,
5546     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5547     SmallVectorImpl<QualType> &OutParamTypes,
5548     SmallVectorImpl<ParmVarDecl *> *PVars,
5549     Sema::ExtParameterInfoBuilder &PInfos) {
5550   int indexAdjustment = 0;
5551 
5552   unsigned NumParams = Params.size();
5553   for (unsigned i = 0; i != NumParams; ++i) {
5554     if (ParmVarDecl *OldParm = Params[i]) {
5555       assert(OldParm->getFunctionScopeIndex() == i);
5556 
5557       Optional<unsigned> NumExpansions;
5558       ParmVarDecl *NewParm = nullptr;
5559       if (OldParm->isParameterPack()) {
5560         // We have a function parameter pack that may need to be expanded.
5561         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5562 
5563         // Find the parameter packs that could be expanded.
5564         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5565         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5566         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5567         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5568 
5569         // Determine whether we should expand the parameter packs.
5570         bool ShouldExpand = false;
5571         bool RetainExpansion = false;
5572         Optional<unsigned> OrigNumExpansions;
5573         if (Unexpanded.size() > 0) {
5574           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5575           NumExpansions = OrigNumExpansions;
5576           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5577                                                    Pattern.getSourceRange(),
5578                                                    Unexpanded,
5579                                                    ShouldExpand,
5580                                                    RetainExpansion,
5581                                                    NumExpansions)) {
5582             return true;
5583           }
5584         } else {
5585 #ifndef NDEBUG
5586           const AutoType *AT =
5587               Pattern.getType().getTypePtr()->getContainedAutoType();
5588           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5589                  "Could not find parameter packs or undeduced auto type!");
5590 #endif
5591         }
5592 
5593         if (ShouldExpand) {
5594           // Expand the function parameter pack into multiple, separate
5595           // parameters.
5596           getDerived().ExpandingFunctionParameterPack(OldParm);
5597           for (unsigned I = 0; I != *NumExpansions; ++I) {
5598             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5599             ParmVarDecl *NewParm
5600               = getDerived().TransformFunctionTypeParam(OldParm,
5601                                                         indexAdjustment++,
5602                                                         OrigNumExpansions,
5603                                                 /*ExpectParameterPack=*/false);
5604             if (!NewParm)
5605               return true;
5606 
5607             if (ParamInfos)
5608               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5609             OutParamTypes.push_back(NewParm->getType());
5610             if (PVars)
5611               PVars->push_back(NewParm);
5612           }
5613 
5614           // If we're supposed to retain a pack expansion, do so by temporarily
5615           // forgetting the partially-substituted parameter pack.
5616           if (RetainExpansion) {
5617             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5618             ParmVarDecl *NewParm
5619               = getDerived().TransformFunctionTypeParam(OldParm,
5620                                                         indexAdjustment++,
5621                                                         OrigNumExpansions,
5622                                                 /*ExpectParameterPack=*/false);
5623             if (!NewParm)
5624               return true;
5625 
5626             if (ParamInfos)
5627               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5628             OutParamTypes.push_back(NewParm->getType());
5629             if (PVars)
5630               PVars->push_back(NewParm);
5631           }
5632 
5633           // The next parameter should have the same adjustment as the
5634           // last thing we pushed, but we post-incremented indexAdjustment
5635           // on every push.  Also, if we push nothing, the adjustment should
5636           // go down by one.
5637           indexAdjustment--;
5638 
5639           // We're done with the pack expansion.
5640           continue;
5641         }
5642 
5643         // We'll substitute the parameter now without expanding the pack
5644         // expansion.
5645         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5646         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5647                                                           indexAdjustment,
5648                                                           NumExpansions,
5649                                                   /*ExpectParameterPack=*/true);
5650         assert(NewParm->isParameterPack() &&
5651                "Parameter pack no longer a parameter pack after "
5652                "transformation.");
5653       } else {
5654         NewParm = getDerived().TransformFunctionTypeParam(
5655             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5656       }
5657 
5658       if (!NewParm)
5659         return true;
5660 
5661       if (ParamInfos)
5662         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5663       OutParamTypes.push_back(NewParm->getType());
5664       if (PVars)
5665         PVars->push_back(NewParm);
5666       continue;
5667     }
5668 
5669     // Deal with the possibility that we don't have a parameter
5670     // declaration for this parameter.
5671     QualType OldType = ParamTypes[i];
5672     bool IsPackExpansion = false;
5673     Optional<unsigned> NumExpansions;
5674     QualType NewType;
5675     if (const PackExpansionType *Expansion
5676                                        = dyn_cast<PackExpansionType>(OldType)) {
5677       // We have a function parameter pack that may need to be expanded.
5678       QualType Pattern = Expansion->getPattern();
5679       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5680       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5681 
5682       // Determine whether we should expand the parameter packs.
5683       bool ShouldExpand = false;
5684       bool RetainExpansion = false;
5685       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5686                                                Unexpanded,
5687                                                ShouldExpand,
5688                                                RetainExpansion,
5689                                                NumExpansions)) {
5690         return true;
5691       }
5692 
5693       if (ShouldExpand) {
5694         // Expand the function parameter pack into multiple, separate
5695         // parameters.
5696         for (unsigned I = 0; I != *NumExpansions; ++I) {
5697           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5698           QualType NewType = getDerived().TransformType(Pattern);
5699           if (NewType.isNull())
5700             return true;
5701 
5702           if (NewType->containsUnexpandedParameterPack()) {
5703             NewType =
5704                 getSema().getASTContext().getPackExpansionType(NewType, None);
5705 
5706             if (NewType.isNull())
5707               return true;
5708           }
5709 
5710           if (ParamInfos)
5711             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5712           OutParamTypes.push_back(NewType);
5713           if (PVars)
5714             PVars->push_back(nullptr);
5715         }
5716 
5717         // We're done with the pack expansion.
5718         continue;
5719       }
5720 
5721       // If we're supposed to retain a pack expansion, do so by temporarily
5722       // forgetting the partially-substituted parameter pack.
5723       if (RetainExpansion) {
5724         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5725         QualType NewType = getDerived().TransformType(Pattern);
5726         if (NewType.isNull())
5727           return true;
5728 
5729         if (ParamInfos)
5730           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5731         OutParamTypes.push_back(NewType);
5732         if (PVars)
5733           PVars->push_back(nullptr);
5734       }
5735 
5736       // We'll substitute the parameter now without expanding the pack
5737       // expansion.
5738       OldType = Expansion->getPattern();
5739       IsPackExpansion = true;
5740       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5741       NewType = getDerived().TransformType(OldType);
5742     } else {
5743       NewType = getDerived().TransformType(OldType);
5744     }
5745 
5746     if (NewType.isNull())
5747       return true;
5748 
5749     if (IsPackExpansion)
5750       NewType = getSema().Context.getPackExpansionType(NewType,
5751                                                        NumExpansions);
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 #ifndef NDEBUG
5761   if (PVars) {
5762     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5763       if (ParmVarDecl *parm = (*PVars)[i])
5764         assert(parm->getFunctionScopeIndex() == i);
5765   }
5766 #endif
5767 
5768   return false;
5769 }
5770 
5771 template<typename Derived>
5772 QualType
5773 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5774                                                    FunctionProtoTypeLoc TL) {
5775   SmallVector<QualType, 4> ExceptionStorage;
5776   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5777   return getDerived().TransformFunctionProtoType(
5778       TLB, TL, nullptr, Qualifiers(),
5779       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5780         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5781                                             ExceptionStorage, Changed);
5782       });
5783 }
5784 
5785 template<typename Derived> template<typename Fn>
5786 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5787     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5788     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5789 
5790   // Transform the parameters and return type.
5791   //
5792   // We are required to instantiate the params and return type in source order.
5793   // When the function has a trailing return type, we instantiate the
5794   // parameters before the return type,  since the return type can then refer
5795   // to the parameters themselves (via decltype, sizeof, etc.).
5796   //
5797   SmallVector<QualType, 4> ParamTypes;
5798   SmallVector<ParmVarDecl*, 4> ParamDecls;
5799   Sema::ExtParameterInfoBuilder ExtParamInfos;
5800   const FunctionProtoType *T = TL.getTypePtr();
5801 
5802   QualType ResultType;
5803 
5804   if (T->hasTrailingReturn()) {
5805     if (getDerived().TransformFunctionTypeParams(
5806             TL.getBeginLoc(), TL.getParams(),
5807             TL.getTypePtr()->param_type_begin(),
5808             T->getExtParameterInfosOrNull(),
5809             ParamTypes, &ParamDecls, ExtParamInfos))
5810       return QualType();
5811 
5812     {
5813       // C++11 [expr.prim.general]p3:
5814       //   If a declaration declares a member function or member function
5815       //   template of a class X, the expression this is a prvalue of type
5816       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5817       //   and the end of the function-definition, member-declarator, or
5818       //   declarator.
5819       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5820 
5821       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5822       if (ResultType.isNull())
5823         return QualType();
5824     }
5825   }
5826   else {
5827     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5828     if (ResultType.isNull())
5829       return QualType();
5830 
5831     if (getDerived().TransformFunctionTypeParams(
5832             TL.getBeginLoc(), TL.getParams(),
5833             TL.getTypePtr()->param_type_begin(),
5834             T->getExtParameterInfosOrNull(),
5835             ParamTypes, &ParamDecls, ExtParamInfos))
5836       return QualType();
5837   }
5838 
5839   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5840 
5841   bool EPIChanged = false;
5842   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5843     return QualType();
5844 
5845   // Handle extended parameter information.
5846   if (auto NewExtParamInfos =
5847         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5848     if (!EPI.ExtParameterInfos ||
5849         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5850           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5851       EPIChanged = true;
5852     }
5853     EPI.ExtParameterInfos = NewExtParamInfos;
5854   } else if (EPI.ExtParameterInfos) {
5855     EPIChanged = true;
5856     EPI.ExtParameterInfos = nullptr;
5857   }
5858 
5859   QualType Result = TL.getType();
5860   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5861       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5862     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5863     if (Result.isNull())
5864       return QualType();
5865   }
5866 
5867   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5868   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5869   NewTL.setLParenLoc(TL.getLParenLoc());
5870   NewTL.setRParenLoc(TL.getRParenLoc());
5871   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5872   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5873   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5874     NewTL.setParam(i, ParamDecls[i]);
5875 
5876   return Result;
5877 }
5878 
5879 template<typename Derived>
5880 bool TreeTransform<Derived>::TransformExceptionSpec(
5881     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5882     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5883   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5884 
5885   // Instantiate a dynamic noexcept expression, if any.
5886   if (isComputedNoexcept(ESI.Type)) {
5887     EnterExpressionEvaluationContext Unevaluated(
5888         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5889     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5890     if (NoexceptExpr.isInvalid())
5891       return true;
5892 
5893     ExceptionSpecificationType EST = ESI.Type;
5894     NoexceptExpr =
5895         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5896     if (NoexceptExpr.isInvalid())
5897       return true;
5898 
5899     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5900       Changed = true;
5901     ESI.NoexceptExpr = NoexceptExpr.get();
5902     ESI.Type = EST;
5903   }
5904 
5905   if (ESI.Type != EST_Dynamic)
5906     return false;
5907 
5908   // Instantiate a dynamic exception specification's type.
5909   for (QualType T : ESI.Exceptions) {
5910     if (const PackExpansionType *PackExpansion =
5911             T->getAs<PackExpansionType>()) {
5912       Changed = true;
5913 
5914       // We have a pack expansion. Instantiate it.
5915       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5916       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5917                                               Unexpanded);
5918       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5919 
5920       // Determine whether the set of unexpanded parameter packs can and
5921       // should
5922       // be expanded.
5923       bool Expand = false;
5924       bool RetainExpansion = false;
5925       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5926       // FIXME: Track the location of the ellipsis (and track source location
5927       // information for the types in the exception specification in general).
5928       if (getDerived().TryExpandParameterPacks(
5929               Loc, SourceRange(), Unexpanded, Expand,
5930               RetainExpansion, NumExpansions))
5931         return true;
5932 
5933       if (!Expand) {
5934         // We can't expand this pack expansion into separate arguments yet;
5935         // just substitute into the pattern and create a new pack expansion
5936         // type.
5937         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5938         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5939         if (U.isNull())
5940           return true;
5941 
5942         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5943         Exceptions.push_back(U);
5944         continue;
5945       }
5946 
5947       // Substitute into the pack expansion pattern for each slice of the
5948       // pack.
5949       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5950         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5951 
5952         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5953         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5954           return true;
5955 
5956         Exceptions.push_back(U);
5957       }
5958     } else {
5959       QualType U = getDerived().TransformType(T);
5960       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5961         return true;
5962       if (T != U)
5963         Changed = true;
5964 
5965       Exceptions.push_back(U);
5966     }
5967   }
5968 
5969   ESI.Exceptions = Exceptions;
5970   if (ESI.Exceptions.empty())
5971     ESI.Type = EST_DynamicNone;
5972   return false;
5973 }
5974 
5975 template<typename Derived>
5976 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5977                                                  TypeLocBuilder &TLB,
5978                                                  FunctionNoProtoTypeLoc TL) {
5979   const FunctionNoProtoType *T = TL.getTypePtr();
5980   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5981   if (ResultType.isNull())
5982     return QualType();
5983 
5984   QualType Result = TL.getType();
5985   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5986     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5987 
5988   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5989   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5990   NewTL.setLParenLoc(TL.getLParenLoc());
5991   NewTL.setRParenLoc(TL.getRParenLoc());
5992   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5993 
5994   return Result;
5995 }
5996 
5997 template<typename Derived> QualType
5998 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5999                                                  UnresolvedUsingTypeLoc TL) {
6000   const UnresolvedUsingType *T = TL.getTypePtr();
6001   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
6002   if (!D)
6003     return QualType();
6004 
6005   QualType Result = TL.getType();
6006   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
6007     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
6008     if (Result.isNull())
6009       return QualType();
6010   }
6011 
6012   // We might get an arbitrary type spec type back.  We should at
6013   // least always get a type spec type, though.
6014   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
6015   NewTL.setNameLoc(TL.getNameLoc());
6016 
6017   return Result;
6018 }
6019 
6020 template<typename Derived>
6021 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
6022                                                       TypedefTypeLoc TL) {
6023   const TypedefType *T = TL.getTypePtr();
6024   TypedefNameDecl *Typedef
6025     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6026                                                                T->getDecl()));
6027   if (!Typedef)
6028     return QualType();
6029 
6030   QualType Result = TL.getType();
6031   if (getDerived().AlwaysRebuild() ||
6032       Typedef != T->getDecl()) {
6033     Result = getDerived().RebuildTypedefType(Typedef);
6034     if (Result.isNull())
6035       return QualType();
6036   }
6037 
6038   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
6039   NewTL.setNameLoc(TL.getNameLoc());
6040 
6041   return Result;
6042 }
6043 
6044 template<typename Derived>
6045 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
6046                                                       TypeOfExprTypeLoc TL) {
6047   // typeof expressions are not potentially evaluated contexts
6048   EnterExpressionEvaluationContext Unevaluated(
6049       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6050       Sema::ReuseLambdaContextDecl);
6051 
6052   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6053   if (E.isInvalid())
6054     return QualType();
6055 
6056   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6057   if (E.isInvalid())
6058     return QualType();
6059 
6060   QualType Result = TL.getType();
6061   if (getDerived().AlwaysRebuild() ||
6062       E.get() != TL.getUnderlyingExpr()) {
6063     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6064     if (Result.isNull())
6065       return QualType();
6066   }
6067   else E.get();
6068 
6069   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6070   NewTL.setTypeofLoc(TL.getTypeofLoc());
6071   NewTL.setLParenLoc(TL.getLParenLoc());
6072   NewTL.setRParenLoc(TL.getRParenLoc());
6073 
6074   return Result;
6075 }
6076 
6077 template<typename Derived>
6078 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6079                                                      TypeOfTypeLoc TL) {
6080   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6081   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6082   if (!New_Under_TI)
6083     return QualType();
6084 
6085   QualType Result = TL.getType();
6086   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6087     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6088     if (Result.isNull())
6089       return QualType();
6090   }
6091 
6092   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6093   NewTL.setTypeofLoc(TL.getTypeofLoc());
6094   NewTL.setLParenLoc(TL.getLParenLoc());
6095   NewTL.setRParenLoc(TL.getRParenLoc());
6096   NewTL.setUnderlyingTInfo(New_Under_TI);
6097 
6098   return Result;
6099 }
6100 
6101 template<typename Derived>
6102 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6103                                                        DecltypeTypeLoc TL) {
6104   const DecltypeType *T = TL.getTypePtr();
6105 
6106   // decltype expressions are not potentially evaluated contexts
6107   EnterExpressionEvaluationContext Unevaluated(
6108       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6109       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6110 
6111   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6112   if (E.isInvalid())
6113     return QualType();
6114 
6115   E = getSema().ActOnDecltypeExpression(E.get());
6116   if (E.isInvalid())
6117     return QualType();
6118 
6119   QualType Result = TL.getType();
6120   if (getDerived().AlwaysRebuild() ||
6121       E.get() != T->getUnderlyingExpr()) {
6122     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6123     if (Result.isNull())
6124       return QualType();
6125   }
6126   else E.get();
6127 
6128   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6129   NewTL.setNameLoc(TL.getNameLoc());
6130 
6131   return Result;
6132 }
6133 
6134 template<typename Derived>
6135 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6136                                                             TypeLocBuilder &TLB,
6137                                                      UnaryTransformTypeLoc TL) {
6138   QualType Result = TL.getType();
6139   if (Result->isDependentType()) {
6140     const UnaryTransformType *T = TL.getTypePtr();
6141     QualType NewBase =
6142       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6143     Result = getDerived().RebuildUnaryTransformType(NewBase,
6144                                                     T->getUTTKind(),
6145                                                     TL.getKWLoc());
6146     if (Result.isNull())
6147       return QualType();
6148   }
6149 
6150   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6151   NewTL.setKWLoc(TL.getKWLoc());
6152   NewTL.setParensRange(TL.getParensRange());
6153   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6154   return Result;
6155 }
6156 
6157 template<typename Derived>
6158 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6159     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6160   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6161 
6162   CXXScopeSpec SS;
6163   TemplateName TemplateName = getDerived().TransformTemplateName(
6164       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6165   if (TemplateName.isNull())
6166     return QualType();
6167 
6168   QualType OldDeduced = T->getDeducedType();
6169   QualType NewDeduced;
6170   if (!OldDeduced.isNull()) {
6171     NewDeduced = getDerived().TransformType(OldDeduced);
6172     if (NewDeduced.isNull())
6173       return QualType();
6174   }
6175 
6176   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6177       TemplateName, NewDeduced);
6178   if (Result.isNull())
6179     return QualType();
6180 
6181   DeducedTemplateSpecializationTypeLoc NewTL =
6182       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6183   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6184 
6185   return Result;
6186 }
6187 
6188 template<typename Derived>
6189 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6190                                                      RecordTypeLoc TL) {
6191   const RecordType *T = TL.getTypePtr();
6192   RecordDecl *Record
6193     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6194                                                           T->getDecl()));
6195   if (!Record)
6196     return QualType();
6197 
6198   QualType Result = TL.getType();
6199   if (getDerived().AlwaysRebuild() ||
6200       Record != T->getDecl()) {
6201     Result = getDerived().RebuildRecordType(Record);
6202     if (Result.isNull())
6203       return QualType();
6204   }
6205 
6206   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6207   NewTL.setNameLoc(TL.getNameLoc());
6208 
6209   return Result;
6210 }
6211 
6212 template<typename Derived>
6213 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6214                                                    EnumTypeLoc TL) {
6215   const EnumType *T = TL.getTypePtr();
6216   EnumDecl *Enum
6217     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6218                                                         T->getDecl()));
6219   if (!Enum)
6220     return QualType();
6221 
6222   QualType Result = TL.getType();
6223   if (getDerived().AlwaysRebuild() ||
6224       Enum != T->getDecl()) {
6225     Result = getDerived().RebuildEnumType(Enum);
6226     if (Result.isNull())
6227       return QualType();
6228   }
6229 
6230   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6231   NewTL.setNameLoc(TL.getNameLoc());
6232 
6233   return Result;
6234 }
6235 
6236 template<typename Derived>
6237 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6238                                          TypeLocBuilder &TLB,
6239                                          InjectedClassNameTypeLoc TL) {
6240   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6241                                        TL.getTypePtr()->getDecl());
6242   if (!D) return QualType();
6243 
6244   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6245   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6246   return T;
6247 }
6248 
6249 template<typename Derived>
6250 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6251                                                 TypeLocBuilder &TLB,
6252                                                 TemplateTypeParmTypeLoc TL) {
6253   return TransformTypeSpecType(TLB, TL);
6254 }
6255 
6256 template<typename Derived>
6257 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6258                                          TypeLocBuilder &TLB,
6259                                          SubstTemplateTypeParmTypeLoc TL) {
6260   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6261 
6262   // Substitute into the replacement type, which itself might involve something
6263   // that needs to be transformed. This only tends to occur with default
6264   // template arguments of template template parameters.
6265   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6266   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6267   if (Replacement.isNull())
6268     return QualType();
6269 
6270   // Always canonicalize the replacement type.
6271   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6272   QualType Result
6273     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6274                                                    Replacement);
6275 
6276   // Propagate type-source information.
6277   SubstTemplateTypeParmTypeLoc NewTL
6278     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6279   NewTL.setNameLoc(TL.getNameLoc());
6280   return Result;
6281 
6282 }
6283 
6284 template<typename Derived>
6285 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6286                                           TypeLocBuilder &TLB,
6287                                           SubstTemplateTypeParmPackTypeLoc TL) {
6288   return TransformTypeSpecType(TLB, TL);
6289 }
6290 
6291 template<typename Derived>
6292 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6293                                                         TypeLocBuilder &TLB,
6294                                            TemplateSpecializationTypeLoc TL) {
6295   const TemplateSpecializationType *T = TL.getTypePtr();
6296 
6297   // The nested-name-specifier never matters in a TemplateSpecializationType,
6298   // because we can't have a dependent nested-name-specifier anyway.
6299   CXXScopeSpec SS;
6300   TemplateName Template
6301     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6302                                          TL.getTemplateNameLoc());
6303   if (Template.isNull())
6304     return QualType();
6305 
6306   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6307 }
6308 
6309 template<typename Derived>
6310 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6311                                                      AtomicTypeLoc TL) {
6312   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6313   if (ValueType.isNull())
6314     return QualType();
6315 
6316   QualType Result = TL.getType();
6317   if (getDerived().AlwaysRebuild() ||
6318       ValueType != TL.getValueLoc().getType()) {
6319     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6320     if (Result.isNull())
6321       return QualType();
6322   }
6323 
6324   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6325   NewTL.setKWLoc(TL.getKWLoc());
6326   NewTL.setLParenLoc(TL.getLParenLoc());
6327   NewTL.setRParenLoc(TL.getRParenLoc());
6328 
6329   return Result;
6330 }
6331 
6332 template <typename Derived>
6333 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6334                                                    PipeTypeLoc TL) {
6335   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6336   if (ValueType.isNull())
6337     return QualType();
6338 
6339   QualType Result = TL.getType();
6340   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6341     const PipeType *PT = Result->castAs<PipeType>();
6342     bool isReadPipe = PT->isReadOnly();
6343     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6344     if (Result.isNull())
6345       return QualType();
6346   }
6347 
6348   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6349   NewTL.setKWLoc(TL.getKWLoc());
6350 
6351   return Result;
6352 }
6353 
6354 template <typename Derived>
6355 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6356                                                      ExtIntTypeLoc TL) {
6357   const ExtIntType *EIT = TL.getTypePtr();
6358   QualType Result = TL.getType();
6359 
6360   if (getDerived().AlwaysRebuild()) {
6361     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6362                                             EIT->getNumBits(), TL.getNameLoc());
6363     if (Result.isNull())
6364       return QualType();
6365   }
6366 
6367   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6368   NewTL.setNameLoc(TL.getNameLoc());
6369   return Result;
6370 }
6371 
6372 template <typename Derived>
6373 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6374     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6375   const DependentExtIntType *EIT = TL.getTypePtr();
6376 
6377   EnterExpressionEvaluationContext Unevaluated(
6378       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6379   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6380   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6381 
6382   if (BitsExpr.isInvalid())
6383     return QualType();
6384 
6385   QualType Result = TL.getType();
6386 
6387   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6388     Result = getDerived().RebuildDependentExtIntType(
6389         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6390 
6391     if (Result.isNull())
6392       return QualType();
6393   }
6394 
6395   if (isa<DependentExtIntType>(Result)) {
6396     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6397     NewTL.setNameLoc(TL.getNameLoc());
6398   } else {
6399     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6400     NewTL.setNameLoc(TL.getNameLoc());
6401   }
6402   return Result;
6403 }
6404 
6405   /// Simple iterator that traverses the template arguments in a
6406   /// container that provides a \c getArgLoc() member function.
6407   ///
6408   /// This iterator is intended to be used with the iterator form of
6409   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6410   template<typename ArgLocContainer>
6411   class TemplateArgumentLocContainerIterator {
6412     ArgLocContainer *Container;
6413     unsigned Index;
6414 
6415   public:
6416     typedef TemplateArgumentLoc value_type;
6417     typedef TemplateArgumentLoc reference;
6418     typedef int difference_type;
6419     typedef std::input_iterator_tag iterator_category;
6420 
6421     class pointer {
6422       TemplateArgumentLoc Arg;
6423 
6424     public:
6425       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6426 
6427       const TemplateArgumentLoc *operator->() const {
6428         return &Arg;
6429       }
6430     };
6431 
6432 
6433     TemplateArgumentLocContainerIterator() {}
6434 
6435     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6436                                  unsigned Index)
6437       : Container(&Container), Index(Index) { }
6438 
6439     TemplateArgumentLocContainerIterator &operator++() {
6440       ++Index;
6441       return *this;
6442     }
6443 
6444     TemplateArgumentLocContainerIterator operator++(int) {
6445       TemplateArgumentLocContainerIterator Old(*this);
6446       ++(*this);
6447       return Old;
6448     }
6449 
6450     TemplateArgumentLoc operator*() const {
6451       return Container->getArgLoc(Index);
6452     }
6453 
6454     pointer operator->() const {
6455       return pointer(Container->getArgLoc(Index));
6456     }
6457 
6458     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6459                            const TemplateArgumentLocContainerIterator &Y) {
6460       return X.Container == Y.Container && X.Index == Y.Index;
6461     }
6462 
6463     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6464                            const TemplateArgumentLocContainerIterator &Y) {
6465       return !(X == Y);
6466     }
6467   };
6468 
6469 template<typename Derived>
6470 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6471                                                    AutoTypeLoc TL) {
6472   const AutoType *T = TL.getTypePtr();
6473   QualType OldDeduced = T->getDeducedType();
6474   QualType NewDeduced;
6475   if (!OldDeduced.isNull()) {
6476     NewDeduced = getDerived().TransformType(OldDeduced);
6477     if (NewDeduced.isNull())
6478       return QualType();
6479   }
6480 
6481   ConceptDecl *NewCD = nullptr;
6482   TemplateArgumentListInfo NewTemplateArgs;
6483   NestedNameSpecifierLoc NewNestedNameSpec;
6484   if (TL.getTypePtr()->isConstrained()) {
6485     NewCD = cast_or_null<ConceptDecl>(
6486         getDerived().TransformDecl(
6487             TL.getConceptNameLoc(),
6488             TL.getTypePtr()->getTypeConstraintConcept()));
6489 
6490     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6491     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6492     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6493     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6494                                                 ArgIterator(TL,
6495                                                             TL.getNumArgs()),
6496                                                 NewTemplateArgs))
6497       return QualType();
6498 
6499     if (TL.getNestedNameSpecifierLoc()) {
6500       NewNestedNameSpec
6501         = getDerived().TransformNestedNameSpecifierLoc(
6502             TL.getNestedNameSpecifierLoc());
6503       if (!NewNestedNameSpec)
6504         return QualType();
6505     }
6506   }
6507 
6508   QualType Result = TL.getType();
6509   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6510       T->isDependentType()) {
6511     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6512     NewArgList.reserve(NewArgList.size());
6513     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6514       NewArgList.push_back(ArgLoc.getArgument());
6515     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6516                                           NewArgList);
6517     if (Result.isNull())
6518       return QualType();
6519   }
6520 
6521   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6522   NewTL.setNameLoc(TL.getNameLoc());
6523   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6524   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6525   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6526   NewTL.setFoundDecl(TL.getFoundDecl());
6527   NewTL.setLAngleLoc(TL.getLAngleLoc());
6528   NewTL.setRAngleLoc(TL.getRAngleLoc());
6529   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6530     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6531 
6532   return Result;
6533 }
6534 
6535 template <typename Derived>
6536 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6537                                                         TypeLocBuilder &TLB,
6538                                            TemplateSpecializationTypeLoc TL,
6539                                                       TemplateName Template) {
6540   TemplateArgumentListInfo NewTemplateArgs;
6541   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6542   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6543   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6544     ArgIterator;
6545   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6546                                               ArgIterator(TL, TL.getNumArgs()),
6547                                               NewTemplateArgs))
6548     return QualType();
6549 
6550   // FIXME: maybe don't rebuild if all the template arguments are the same.
6551 
6552   QualType Result =
6553     getDerived().RebuildTemplateSpecializationType(Template,
6554                                                    TL.getTemplateNameLoc(),
6555                                                    NewTemplateArgs);
6556 
6557   if (!Result.isNull()) {
6558     // Specializations of template template parameters are represented as
6559     // TemplateSpecializationTypes, and substitution of type alias templates
6560     // within a dependent context can transform them into
6561     // DependentTemplateSpecializationTypes.
6562     if (isa<DependentTemplateSpecializationType>(Result)) {
6563       DependentTemplateSpecializationTypeLoc NewTL
6564         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6565       NewTL.setElaboratedKeywordLoc(SourceLocation());
6566       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6567       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6568       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6569       NewTL.setLAngleLoc(TL.getLAngleLoc());
6570       NewTL.setRAngleLoc(TL.getRAngleLoc());
6571       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6572         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6573       return Result;
6574     }
6575 
6576     TemplateSpecializationTypeLoc NewTL
6577       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6578     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6579     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6580     NewTL.setLAngleLoc(TL.getLAngleLoc());
6581     NewTL.setRAngleLoc(TL.getRAngleLoc());
6582     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6583       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6584   }
6585 
6586   return Result;
6587 }
6588 
6589 template <typename Derived>
6590 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6591                                      TypeLocBuilder &TLB,
6592                                      DependentTemplateSpecializationTypeLoc TL,
6593                                      TemplateName Template,
6594                                      CXXScopeSpec &SS) {
6595   TemplateArgumentListInfo NewTemplateArgs;
6596   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6597   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6598   typedef TemplateArgumentLocContainerIterator<
6599             DependentTemplateSpecializationTypeLoc> ArgIterator;
6600   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6601                                               ArgIterator(TL, TL.getNumArgs()),
6602                                               NewTemplateArgs))
6603     return QualType();
6604 
6605   // FIXME: maybe don't rebuild if all the template arguments are the same.
6606 
6607   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6608     QualType Result
6609       = getSema().Context.getDependentTemplateSpecializationType(
6610                                                 TL.getTypePtr()->getKeyword(),
6611                                                          DTN->getQualifier(),
6612                                                          DTN->getIdentifier(),
6613                                                                NewTemplateArgs);
6614 
6615     DependentTemplateSpecializationTypeLoc NewTL
6616       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6617     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6618     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6619     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6620     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6621     NewTL.setLAngleLoc(TL.getLAngleLoc());
6622     NewTL.setRAngleLoc(TL.getRAngleLoc());
6623     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6624       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6625     return Result;
6626   }
6627 
6628   QualType Result
6629     = getDerived().RebuildTemplateSpecializationType(Template,
6630                                                      TL.getTemplateNameLoc(),
6631                                                      NewTemplateArgs);
6632 
6633   if (!Result.isNull()) {
6634     /// FIXME: Wrap this in an elaborated-type-specifier?
6635     TemplateSpecializationTypeLoc NewTL
6636       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6637     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6638     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6639     NewTL.setLAngleLoc(TL.getLAngleLoc());
6640     NewTL.setRAngleLoc(TL.getRAngleLoc());
6641     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6642       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6643   }
6644 
6645   return Result;
6646 }
6647 
6648 template<typename Derived>
6649 QualType
6650 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6651                                                 ElaboratedTypeLoc TL) {
6652   const ElaboratedType *T = TL.getTypePtr();
6653 
6654   NestedNameSpecifierLoc QualifierLoc;
6655   // NOTE: the qualifier in an ElaboratedType is optional.
6656   if (TL.getQualifierLoc()) {
6657     QualifierLoc
6658       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6659     if (!QualifierLoc)
6660       return QualType();
6661   }
6662 
6663   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6664   if (NamedT.isNull())
6665     return QualType();
6666 
6667   // C++0x [dcl.type.elab]p2:
6668   //   If the identifier resolves to a typedef-name or the simple-template-id
6669   //   resolves to an alias template specialization, the
6670   //   elaborated-type-specifier is ill-formed.
6671   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6672     if (const TemplateSpecializationType *TST =
6673           NamedT->getAs<TemplateSpecializationType>()) {
6674       TemplateName Template = TST->getTemplateName();
6675       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6676               Template.getAsTemplateDecl())) {
6677         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6678                      diag::err_tag_reference_non_tag)
6679             << TAT << Sema::NTK_TypeAliasTemplate
6680             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6681         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6682       }
6683     }
6684   }
6685 
6686   QualType Result = TL.getType();
6687   if (getDerived().AlwaysRebuild() ||
6688       QualifierLoc != TL.getQualifierLoc() ||
6689       NamedT != T->getNamedType()) {
6690     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6691                                                 T->getKeyword(),
6692                                                 QualifierLoc, NamedT);
6693     if (Result.isNull())
6694       return QualType();
6695   }
6696 
6697   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6698   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6699   NewTL.setQualifierLoc(QualifierLoc);
6700   return Result;
6701 }
6702 
6703 template<typename Derived>
6704 QualType TreeTransform<Derived>::TransformAttributedType(
6705                                                 TypeLocBuilder &TLB,
6706                                                 AttributedTypeLoc TL) {
6707   const AttributedType *oldType = TL.getTypePtr();
6708   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6709   if (modifiedType.isNull())
6710     return QualType();
6711 
6712   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6713   const Attr *oldAttr = TL.getAttr();
6714   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6715   if (oldAttr && !newAttr)
6716     return QualType();
6717 
6718   QualType result = TL.getType();
6719 
6720   // FIXME: dependent operand expressions?
6721   if (getDerived().AlwaysRebuild() ||
6722       modifiedType != oldType->getModifiedType()) {
6723     // TODO: this is really lame; we should really be rebuilding the
6724     // equivalent type from first principles.
6725     QualType equivalentType
6726       = getDerived().TransformType(oldType->getEquivalentType());
6727     if (equivalentType.isNull())
6728       return QualType();
6729 
6730     // Check whether we can add nullability; it is only represented as
6731     // type sugar, and therefore cannot be diagnosed in any other way.
6732     if (auto nullability = oldType->getImmediateNullability()) {
6733       if (!modifiedType->canHaveNullability()) {
6734         SemaRef.Diag(TL.getAttr()->getLocation(),
6735                      diag::err_nullability_nonpointer)
6736             << DiagNullabilityKind(*nullability, false) << modifiedType;
6737         return QualType();
6738       }
6739     }
6740 
6741     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6742                                                modifiedType,
6743                                                equivalentType);
6744   }
6745 
6746   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6747   newTL.setAttr(newAttr);
6748   return result;
6749 }
6750 
6751 template<typename Derived>
6752 QualType
6753 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6754                                            ParenTypeLoc TL) {
6755   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6756   if (Inner.isNull())
6757     return QualType();
6758 
6759   QualType Result = TL.getType();
6760   if (getDerived().AlwaysRebuild() ||
6761       Inner != TL.getInnerLoc().getType()) {
6762     Result = getDerived().RebuildParenType(Inner);
6763     if (Result.isNull())
6764       return QualType();
6765   }
6766 
6767   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6768   NewTL.setLParenLoc(TL.getLParenLoc());
6769   NewTL.setRParenLoc(TL.getRParenLoc());
6770   return Result;
6771 }
6772 
6773 template <typename Derived>
6774 QualType
6775 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6776                                                     MacroQualifiedTypeLoc TL) {
6777   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6778   if (Inner.isNull())
6779     return QualType();
6780 
6781   QualType Result = TL.getType();
6782   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6783     Result =
6784         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6785     if (Result.isNull())
6786       return QualType();
6787   }
6788 
6789   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6790   NewTL.setExpansionLoc(TL.getExpansionLoc());
6791   return Result;
6792 }
6793 
6794 template<typename Derived>
6795 QualType TreeTransform<Derived>::TransformDependentNameType(
6796     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6797   return TransformDependentNameType(TLB, TL, false);
6798 }
6799 
6800 template<typename Derived>
6801 QualType TreeTransform<Derived>::TransformDependentNameType(
6802     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6803   const DependentNameType *T = TL.getTypePtr();
6804 
6805   NestedNameSpecifierLoc QualifierLoc
6806     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6807   if (!QualifierLoc)
6808     return QualType();
6809 
6810   QualType Result
6811     = getDerived().RebuildDependentNameType(T->getKeyword(),
6812                                             TL.getElaboratedKeywordLoc(),
6813                                             QualifierLoc,
6814                                             T->getIdentifier(),
6815                                             TL.getNameLoc(),
6816                                             DeducedTSTContext);
6817   if (Result.isNull())
6818     return QualType();
6819 
6820   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6821     QualType NamedT = ElabT->getNamedType();
6822     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6823 
6824     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6825     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6826     NewTL.setQualifierLoc(QualifierLoc);
6827   } else {
6828     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6829     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6830     NewTL.setQualifierLoc(QualifierLoc);
6831     NewTL.setNameLoc(TL.getNameLoc());
6832   }
6833   return Result;
6834 }
6835 
6836 template<typename Derived>
6837 QualType TreeTransform<Derived>::
6838           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6839                                  DependentTemplateSpecializationTypeLoc TL) {
6840   NestedNameSpecifierLoc QualifierLoc;
6841   if (TL.getQualifierLoc()) {
6842     QualifierLoc
6843       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6844     if (!QualifierLoc)
6845       return QualType();
6846   }
6847 
6848   return getDerived()
6849            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6850 }
6851 
6852 template<typename Derived>
6853 QualType TreeTransform<Derived>::
6854 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6855                                    DependentTemplateSpecializationTypeLoc TL,
6856                                        NestedNameSpecifierLoc QualifierLoc) {
6857   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6858 
6859   TemplateArgumentListInfo NewTemplateArgs;
6860   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6861   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6862 
6863   typedef TemplateArgumentLocContainerIterator<
6864   DependentTemplateSpecializationTypeLoc> ArgIterator;
6865   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6866                                               ArgIterator(TL, TL.getNumArgs()),
6867                                               NewTemplateArgs))
6868     return QualType();
6869 
6870   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6871       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6872       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6873       /*AllowInjectedClassName*/ false);
6874   if (Result.isNull())
6875     return QualType();
6876 
6877   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6878     QualType NamedT = ElabT->getNamedType();
6879 
6880     // Copy information relevant to the template specialization.
6881     TemplateSpecializationTypeLoc NamedTL
6882       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6883     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6884     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6885     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6886     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6887     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6888       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6889 
6890     // Copy information relevant to the elaborated type.
6891     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6892     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6893     NewTL.setQualifierLoc(QualifierLoc);
6894   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6895     DependentTemplateSpecializationTypeLoc SpecTL
6896       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6897     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6898     SpecTL.setQualifierLoc(QualifierLoc);
6899     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6900     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6901     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6902     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6903     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6904       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6905   } else {
6906     TemplateSpecializationTypeLoc SpecTL
6907       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6908     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6909     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6910     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6911     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6912     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6913       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6914   }
6915   return Result;
6916 }
6917 
6918 template<typename Derived>
6919 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6920                                                       PackExpansionTypeLoc TL) {
6921   QualType Pattern
6922     = getDerived().TransformType(TLB, TL.getPatternLoc());
6923   if (Pattern.isNull())
6924     return QualType();
6925 
6926   QualType Result = TL.getType();
6927   if (getDerived().AlwaysRebuild() ||
6928       Pattern != TL.getPatternLoc().getType()) {
6929     Result = getDerived().RebuildPackExpansionType(Pattern,
6930                                            TL.getPatternLoc().getSourceRange(),
6931                                                    TL.getEllipsisLoc(),
6932                                            TL.getTypePtr()->getNumExpansions());
6933     if (Result.isNull())
6934       return QualType();
6935   }
6936 
6937   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6938   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6939   return Result;
6940 }
6941 
6942 template<typename Derived>
6943 QualType
6944 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6945                                                    ObjCInterfaceTypeLoc TL) {
6946   // ObjCInterfaceType is never dependent.
6947   TLB.pushFullCopy(TL);
6948   return TL.getType();
6949 }
6950 
6951 template<typename Derived>
6952 QualType
6953 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6954                                                    ObjCTypeParamTypeLoc TL) {
6955   const ObjCTypeParamType *T = TL.getTypePtr();
6956   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6957       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6958   if (!OTP)
6959     return QualType();
6960 
6961   QualType Result = TL.getType();
6962   if (getDerived().AlwaysRebuild() ||
6963       OTP != T->getDecl()) {
6964     Result = getDerived().RebuildObjCTypeParamType(OTP,
6965                  TL.getProtocolLAngleLoc(),
6966                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6967                                     TL.getNumProtocols()),
6968                  TL.getProtocolLocs(),
6969                  TL.getProtocolRAngleLoc());
6970     if (Result.isNull())
6971       return QualType();
6972   }
6973 
6974   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6975   if (TL.getNumProtocols()) {
6976     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6977     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6978       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6979     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6980   }
6981   return Result;
6982 }
6983 
6984 template<typename Derived>
6985 QualType
6986 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6987                                                 ObjCObjectTypeLoc TL) {
6988   // Transform base type.
6989   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6990   if (BaseType.isNull())
6991     return QualType();
6992 
6993   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6994 
6995   // Transform type arguments.
6996   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6997   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6998     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6999     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
7000     QualType TypeArg = TypeArgInfo->getType();
7001     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
7002       AnyChanged = true;
7003 
7004       // We have a pack expansion. Instantiate it.
7005       const auto *PackExpansion = PackExpansionLoc.getType()
7006                                     ->castAs<PackExpansionType>();
7007       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
7008       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
7009                                               Unexpanded);
7010       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
7011 
7012       // Determine whether the set of unexpanded parameter packs can
7013       // and should be expanded.
7014       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
7015       bool Expand = false;
7016       bool RetainExpansion = false;
7017       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
7018       if (getDerived().TryExpandParameterPacks(
7019             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
7020             Unexpanded, Expand, RetainExpansion, NumExpansions))
7021         return QualType();
7022 
7023       if (!Expand) {
7024         // We can't expand this pack expansion into separate arguments yet;
7025         // just substitute into the pattern and create a new pack expansion
7026         // type.
7027         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
7028 
7029         TypeLocBuilder TypeArgBuilder;
7030         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7031         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
7032                                                              PatternLoc);
7033         if (NewPatternType.isNull())
7034           return QualType();
7035 
7036         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
7037                                       NewPatternType, NumExpansions);
7038         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
7039         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
7040         NewTypeArgInfos.push_back(
7041           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
7042         continue;
7043       }
7044 
7045       // Substitute into the pack expansion pattern for each slice of the
7046       // pack.
7047       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7048         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7049 
7050         TypeLocBuilder TypeArgBuilder;
7051         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7052 
7053         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7054                                                          PatternLoc);
7055         if (NewTypeArg.isNull())
7056           return QualType();
7057 
7058         NewTypeArgInfos.push_back(
7059           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7060       }
7061 
7062       continue;
7063     }
7064 
7065     TypeLocBuilder TypeArgBuilder;
7066     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7067     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7068     if (NewTypeArg.isNull())
7069       return QualType();
7070 
7071     // If nothing changed, just keep the old TypeSourceInfo.
7072     if (NewTypeArg == TypeArg) {
7073       NewTypeArgInfos.push_back(TypeArgInfo);
7074       continue;
7075     }
7076 
7077     NewTypeArgInfos.push_back(
7078       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7079     AnyChanged = true;
7080   }
7081 
7082   QualType Result = TL.getType();
7083   if (getDerived().AlwaysRebuild() || AnyChanged) {
7084     // Rebuild the type.
7085     Result = getDerived().RebuildObjCObjectType(
7086         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7087         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7088         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7089         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7090 
7091     if (Result.isNull())
7092       return QualType();
7093   }
7094 
7095   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7096   NewT.setHasBaseTypeAsWritten(true);
7097   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7098   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7099     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7100   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7101   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7102   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7103     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7104   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7105   return Result;
7106 }
7107 
7108 template<typename Derived>
7109 QualType
7110 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7111                                                ObjCObjectPointerTypeLoc TL) {
7112   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7113   if (PointeeType.isNull())
7114     return QualType();
7115 
7116   QualType Result = TL.getType();
7117   if (getDerived().AlwaysRebuild() ||
7118       PointeeType != TL.getPointeeLoc().getType()) {
7119     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7120                                                        TL.getStarLoc());
7121     if (Result.isNull())
7122       return QualType();
7123   }
7124 
7125   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7126   NewT.setStarLoc(TL.getStarLoc());
7127   return Result;
7128 }
7129 
7130 //===----------------------------------------------------------------------===//
7131 // Statement transformation
7132 //===----------------------------------------------------------------------===//
7133 template<typename Derived>
7134 StmtResult
7135 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7136   return S;
7137 }
7138 
7139 template<typename Derived>
7140 StmtResult
7141 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7142   return getDerived().TransformCompoundStmt(S, false);
7143 }
7144 
7145 template<typename Derived>
7146 StmtResult
7147 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7148                                               bool IsStmtExpr) {
7149   Sema::CompoundScopeRAII CompoundScope(getSema());
7150 
7151   const Stmt *ExprResult = S->getStmtExprResult();
7152   bool SubStmtInvalid = false;
7153   bool SubStmtChanged = false;
7154   SmallVector<Stmt*, 8> Statements;
7155   for (auto *B : S->body()) {
7156     StmtResult Result = getDerived().TransformStmt(
7157         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7158 
7159     if (Result.isInvalid()) {
7160       // Immediately fail if this was a DeclStmt, since it's very
7161       // likely that this will cause problems for future statements.
7162       if (isa<DeclStmt>(B))
7163         return StmtError();
7164 
7165       // Otherwise, just keep processing substatements and fail later.
7166       SubStmtInvalid = true;
7167       continue;
7168     }
7169 
7170     SubStmtChanged = SubStmtChanged || Result.get() != B;
7171     Statements.push_back(Result.getAs<Stmt>());
7172   }
7173 
7174   if (SubStmtInvalid)
7175     return StmtError();
7176 
7177   if (!getDerived().AlwaysRebuild() &&
7178       !SubStmtChanged)
7179     return S;
7180 
7181   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7182                                           Statements,
7183                                           S->getRBracLoc(),
7184                                           IsStmtExpr);
7185 }
7186 
7187 template<typename Derived>
7188 StmtResult
7189 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7190   ExprResult LHS, RHS;
7191   {
7192     EnterExpressionEvaluationContext Unevaluated(
7193         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7194 
7195     // Transform the left-hand case value.
7196     LHS = getDerived().TransformExpr(S->getLHS());
7197     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7198     if (LHS.isInvalid())
7199       return StmtError();
7200 
7201     // Transform the right-hand case value (for the GNU case-range extension).
7202     RHS = getDerived().TransformExpr(S->getRHS());
7203     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7204     if (RHS.isInvalid())
7205       return StmtError();
7206   }
7207 
7208   // Build the case statement.
7209   // Case statements are always rebuilt so that they will attached to their
7210   // transformed switch statement.
7211   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7212                                                        LHS.get(),
7213                                                        S->getEllipsisLoc(),
7214                                                        RHS.get(),
7215                                                        S->getColonLoc());
7216   if (Case.isInvalid())
7217     return StmtError();
7218 
7219   // Transform the statement following the case
7220   StmtResult SubStmt =
7221       getDerived().TransformStmt(S->getSubStmt());
7222   if (SubStmt.isInvalid())
7223     return StmtError();
7224 
7225   // Attach the body to the case statement
7226   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7227 }
7228 
7229 template <typename Derived>
7230 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7231   // Transform the statement following the default case
7232   StmtResult SubStmt =
7233       getDerived().TransformStmt(S->getSubStmt());
7234   if (SubStmt.isInvalid())
7235     return StmtError();
7236 
7237   // Default statements are always rebuilt
7238   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7239                                          SubStmt.get());
7240 }
7241 
7242 template<typename Derived>
7243 StmtResult
7244 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7245   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7246   if (SubStmt.isInvalid())
7247     return StmtError();
7248 
7249   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7250                                         S->getDecl());
7251   if (!LD)
7252     return StmtError();
7253 
7254   // If we're transforming "in-place" (we're not creating new local
7255   // declarations), assume we're replacing the old label statement
7256   // and clear out the reference to it.
7257   if (LD == S->getDecl())
7258     S->getDecl()->setStmt(nullptr);
7259 
7260   // FIXME: Pass the real colon location in.
7261   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7262                                        cast<LabelDecl>(LD), SourceLocation(),
7263                                        SubStmt.get());
7264 }
7265 
7266 template <typename Derived>
7267 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7268   if (!R)
7269     return R;
7270 
7271   switch (R->getKind()) {
7272 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7273 #define ATTR(X)
7274 #define PRAGMA_SPELLING_ATTR(X)                                                \
7275   case attr::X:                                                                \
7276     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7277 #include "clang/Basic/AttrList.inc"
7278   default:
7279     return R;
7280   }
7281 }
7282 
7283 template <typename Derived>
7284 StmtResult
7285 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7286                                                 StmtDiscardKind SDK) {
7287   bool AttrsChanged = false;
7288   SmallVector<const Attr *, 1> Attrs;
7289 
7290   // Visit attributes and keep track if any are transformed.
7291   for (const auto *I : S->getAttrs()) {
7292     const Attr *R = getDerived().TransformAttr(I);
7293     AttrsChanged |= (I != R);
7294     Attrs.push_back(R);
7295   }
7296 
7297   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7298   if (SubStmt.isInvalid())
7299     return StmtError();
7300 
7301   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7302     return S;
7303 
7304   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7305                                             SubStmt.get());
7306 }
7307 
7308 template<typename Derived>
7309 StmtResult
7310 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7311   // Transform the initialization statement
7312   StmtResult Init = getDerived().TransformStmt(S->getInit());
7313   if (Init.isInvalid())
7314     return StmtError();
7315 
7316   // Transform the condition
7317   Sema::ConditionResult Cond = getDerived().TransformCondition(
7318       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7319       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7320                        : Sema::ConditionKind::Boolean);
7321   if (Cond.isInvalid())
7322     return StmtError();
7323 
7324   // If this is a constexpr if, determine which arm we should instantiate.
7325   llvm::Optional<bool> ConstexprConditionValue;
7326   if (S->isConstexpr())
7327     ConstexprConditionValue = Cond.getKnownValue();
7328 
7329   // Transform the "then" branch.
7330   StmtResult Then;
7331   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7332     Then = getDerived().TransformStmt(S->getThen());
7333     if (Then.isInvalid())
7334       return StmtError();
7335   } else {
7336     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7337   }
7338 
7339   // Transform the "else" branch.
7340   StmtResult Else;
7341   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7342     Else = getDerived().TransformStmt(S->getElse());
7343     if (Else.isInvalid())
7344       return StmtError();
7345   }
7346 
7347   if (!getDerived().AlwaysRebuild() &&
7348       Init.get() == S->getInit() &&
7349       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7350       Then.get() == S->getThen() &&
7351       Else.get() == S->getElse())
7352     return S;
7353 
7354   return getDerived().RebuildIfStmt(
7355       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7356       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7357 }
7358 
7359 template<typename Derived>
7360 StmtResult
7361 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7362   // Transform the initialization statement
7363   StmtResult Init = getDerived().TransformStmt(S->getInit());
7364   if (Init.isInvalid())
7365     return StmtError();
7366 
7367   // Transform the condition.
7368   Sema::ConditionResult Cond = getDerived().TransformCondition(
7369       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7370       Sema::ConditionKind::Switch);
7371   if (Cond.isInvalid())
7372     return StmtError();
7373 
7374   // Rebuild the switch statement.
7375   StmtResult Switch =
7376       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7377                                           Init.get(), Cond, S->getRParenLoc());
7378   if (Switch.isInvalid())
7379     return StmtError();
7380 
7381   // Transform the body of the switch statement.
7382   StmtResult Body = getDerived().TransformStmt(S->getBody());
7383   if (Body.isInvalid())
7384     return StmtError();
7385 
7386   // Complete the switch statement.
7387   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7388                                             Body.get());
7389 }
7390 
7391 template<typename Derived>
7392 StmtResult
7393 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7394   // Transform the condition
7395   Sema::ConditionResult Cond = getDerived().TransformCondition(
7396       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7397       Sema::ConditionKind::Boolean);
7398   if (Cond.isInvalid())
7399     return StmtError();
7400 
7401   // Transform the body
7402   StmtResult Body = getDerived().TransformStmt(S->getBody());
7403   if (Body.isInvalid())
7404     return StmtError();
7405 
7406   if (!getDerived().AlwaysRebuild() &&
7407       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7408       Body.get() == S->getBody())
7409     return Owned(S);
7410 
7411   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7412                                        Cond, S->getRParenLoc(), Body.get());
7413 }
7414 
7415 template<typename Derived>
7416 StmtResult
7417 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7418   // Transform the body
7419   StmtResult Body = getDerived().TransformStmt(S->getBody());
7420   if (Body.isInvalid())
7421     return StmtError();
7422 
7423   // Transform the condition
7424   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7425   if (Cond.isInvalid())
7426     return StmtError();
7427 
7428   if (!getDerived().AlwaysRebuild() &&
7429       Cond.get() == S->getCond() &&
7430       Body.get() == S->getBody())
7431     return S;
7432 
7433   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7434                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7435                                     S->getRParenLoc());
7436 }
7437 
7438 template<typename Derived>
7439 StmtResult
7440 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7441   if (getSema().getLangOpts().OpenMP)
7442     getSema().startOpenMPLoop();
7443 
7444   // Transform the initialization statement
7445   StmtResult Init = getDerived().TransformStmt(S->getInit());
7446   if (Init.isInvalid())
7447     return StmtError();
7448 
7449   // In OpenMP loop region loop control variable must be captured and be
7450   // private. Perform analysis of first part (if any).
7451   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7452     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7453 
7454   // Transform the condition
7455   Sema::ConditionResult Cond = getDerived().TransformCondition(
7456       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7457       Sema::ConditionKind::Boolean);
7458   if (Cond.isInvalid())
7459     return StmtError();
7460 
7461   // Transform the increment
7462   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7463   if (Inc.isInvalid())
7464     return StmtError();
7465 
7466   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7467   if (S->getInc() && !FullInc.get())
7468     return StmtError();
7469 
7470   // Transform the body
7471   StmtResult Body = getDerived().TransformStmt(S->getBody());
7472   if (Body.isInvalid())
7473     return StmtError();
7474 
7475   if (!getDerived().AlwaysRebuild() &&
7476       Init.get() == S->getInit() &&
7477       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7478       Inc.get() == S->getInc() &&
7479       Body.get() == S->getBody())
7480     return S;
7481 
7482   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7483                                      Init.get(), Cond, FullInc,
7484                                      S->getRParenLoc(), Body.get());
7485 }
7486 
7487 template<typename Derived>
7488 StmtResult
7489 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7490   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7491                                         S->getLabel());
7492   if (!LD)
7493     return StmtError();
7494 
7495   // Goto statements must always be rebuilt, to resolve the label.
7496   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7497                                       cast<LabelDecl>(LD));
7498 }
7499 
7500 template<typename Derived>
7501 StmtResult
7502 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7503   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7504   if (Target.isInvalid())
7505     return StmtError();
7506   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7507 
7508   if (!getDerived().AlwaysRebuild() &&
7509       Target.get() == S->getTarget())
7510     return S;
7511 
7512   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7513                                               Target.get());
7514 }
7515 
7516 template<typename Derived>
7517 StmtResult
7518 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7519   return S;
7520 }
7521 
7522 template<typename Derived>
7523 StmtResult
7524 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7525   return S;
7526 }
7527 
7528 template<typename Derived>
7529 StmtResult
7530 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7531   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7532                                                         /*NotCopyInit*/false);
7533   if (Result.isInvalid())
7534     return StmtError();
7535 
7536   // FIXME: We always rebuild the return statement because there is no way
7537   // to tell whether the return type of the function has changed.
7538   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7539 }
7540 
7541 template<typename Derived>
7542 StmtResult
7543 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7544   bool DeclChanged = false;
7545   SmallVector<Decl *, 4> Decls;
7546   for (auto *D : S->decls()) {
7547     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7548     if (!Transformed)
7549       return StmtError();
7550 
7551     if (Transformed != D)
7552       DeclChanged = true;
7553 
7554     Decls.push_back(Transformed);
7555   }
7556 
7557   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7558     return S;
7559 
7560   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7561 }
7562 
7563 template<typename Derived>
7564 StmtResult
7565 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7566 
7567   SmallVector<Expr*, 8> Constraints;
7568   SmallVector<Expr*, 8> Exprs;
7569   SmallVector<IdentifierInfo *, 4> Names;
7570 
7571   ExprResult AsmString;
7572   SmallVector<Expr*, 8> Clobbers;
7573 
7574   bool ExprsChanged = false;
7575 
7576   // Go through the outputs.
7577   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7578     Names.push_back(S->getOutputIdentifier(I));
7579 
7580     // No need to transform the constraint literal.
7581     Constraints.push_back(S->getOutputConstraintLiteral(I));
7582 
7583     // Transform the output expr.
7584     Expr *OutputExpr = S->getOutputExpr(I);
7585     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7586     if (Result.isInvalid())
7587       return StmtError();
7588 
7589     ExprsChanged |= Result.get() != OutputExpr;
7590 
7591     Exprs.push_back(Result.get());
7592   }
7593 
7594   // Go through the inputs.
7595   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7596     Names.push_back(S->getInputIdentifier(I));
7597 
7598     // No need to transform the constraint literal.
7599     Constraints.push_back(S->getInputConstraintLiteral(I));
7600 
7601     // Transform the input expr.
7602     Expr *InputExpr = S->getInputExpr(I);
7603     ExprResult Result = getDerived().TransformExpr(InputExpr);
7604     if (Result.isInvalid())
7605       return StmtError();
7606 
7607     ExprsChanged |= Result.get() != InputExpr;
7608 
7609     Exprs.push_back(Result.get());
7610   }
7611 
7612   // Go through the Labels.
7613   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7614     Names.push_back(S->getLabelIdentifier(I));
7615 
7616     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7617     if (Result.isInvalid())
7618       return StmtError();
7619     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7620     Exprs.push_back(Result.get());
7621   }
7622   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7623     return S;
7624 
7625   // Go through the clobbers.
7626   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7627     Clobbers.push_back(S->getClobberStringLiteral(I));
7628 
7629   // No need to transform the asm string literal.
7630   AsmString = S->getAsmString();
7631   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7632                                         S->isVolatile(), S->getNumOutputs(),
7633                                         S->getNumInputs(), Names.data(),
7634                                         Constraints, Exprs, AsmString.get(),
7635                                         Clobbers, S->getNumLabels(),
7636                                         S->getRParenLoc());
7637 }
7638 
7639 template<typename Derived>
7640 StmtResult
7641 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7642   ArrayRef<Token> AsmToks =
7643     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7644 
7645   bool HadError = false, HadChange = false;
7646 
7647   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7648   SmallVector<Expr*, 8> TransformedExprs;
7649   TransformedExprs.reserve(SrcExprs.size());
7650   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7651     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7652     if (!Result.isUsable()) {
7653       HadError = true;
7654     } else {
7655       HadChange |= (Result.get() != SrcExprs[i]);
7656       TransformedExprs.push_back(Result.get());
7657     }
7658   }
7659 
7660   if (HadError) return StmtError();
7661   if (!HadChange && !getDerived().AlwaysRebuild())
7662     return Owned(S);
7663 
7664   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7665                                        AsmToks, S->getAsmString(),
7666                                        S->getNumOutputs(), S->getNumInputs(),
7667                                        S->getAllConstraints(), S->getClobbers(),
7668                                        TransformedExprs, S->getEndLoc());
7669 }
7670 
7671 // C++ Coroutines TS
7672 
7673 template<typename Derived>
7674 StmtResult
7675 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7676   auto *ScopeInfo = SemaRef.getCurFunction();
7677   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7678   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7679          ScopeInfo->NeedsCoroutineSuspends &&
7680          ScopeInfo->CoroutineSuspends.first == nullptr &&
7681          ScopeInfo->CoroutineSuspends.second == nullptr &&
7682          "expected clean scope info");
7683 
7684   // Set that we have (possibly-invalid) suspend points before we do anything
7685   // that may fail.
7686   ScopeInfo->setNeedsCoroutineSuspends(false);
7687 
7688   // We re-build the coroutine promise object (and the coroutine parameters its
7689   // type and constructor depend on) based on the types used in our current
7690   // function. We must do so, and set it on the current FunctionScopeInfo,
7691   // before attempting to transform the other parts of the coroutine body
7692   // statement, such as the implicit suspend statements (because those
7693   // statements reference the FunctionScopeInfo::CoroutinePromise).
7694   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7695     return StmtError();
7696   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7697   if (!Promise)
7698     return StmtError();
7699   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7700   ScopeInfo->CoroutinePromise = Promise;
7701 
7702   // Transform the implicit coroutine statements constructed using dependent
7703   // types during the previous parse: initial and final suspensions, the return
7704   // object, and others. We also transform the coroutine function's body.
7705   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7706   if (InitSuspend.isInvalid())
7707     return StmtError();
7708   StmtResult FinalSuspend =
7709       getDerived().TransformStmt(S->getFinalSuspendStmt());
7710   if (FinalSuspend.isInvalid() ||
7711       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7712     return StmtError();
7713   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7714   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7715 
7716   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7717   if (BodyRes.isInvalid())
7718     return StmtError();
7719 
7720   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7721   if (Builder.isInvalid())
7722     return StmtError();
7723 
7724   Expr *ReturnObject = S->getReturnValueInit();
7725   assert(ReturnObject && "the return object is expected to be valid");
7726   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7727                                                      /*NoCopyInit*/ false);
7728   if (Res.isInvalid())
7729     return StmtError();
7730   Builder.ReturnValue = Res.get();
7731 
7732   // If during the previous parse the coroutine still had a dependent promise
7733   // statement, we may need to build some implicit coroutine statements
7734   // (such as exception and fallthrough handlers) for the first time.
7735   if (S->hasDependentPromiseType()) {
7736     // We can only build these statements, however, if the current promise type
7737     // is not dependent.
7738     if (!Promise->getType()->isDependentType()) {
7739       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7740              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7741              "these nodes should not have been built yet");
7742       if (!Builder.buildDependentStatements())
7743         return StmtError();
7744     }
7745   } else {
7746     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7747       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7748       if (Res.isInvalid())
7749         return StmtError();
7750       Builder.OnFallthrough = Res.get();
7751     }
7752 
7753     if (auto *OnException = S->getExceptionHandler()) {
7754       StmtResult Res = getDerived().TransformStmt(OnException);
7755       if (Res.isInvalid())
7756         return StmtError();
7757       Builder.OnException = Res.get();
7758     }
7759 
7760     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7761       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7762       if (Res.isInvalid())
7763         return StmtError();
7764       Builder.ReturnStmtOnAllocFailure = Res.get();
7765     }
7766 
7767     // Transform any additional statements we may have already built
7768     assert(S->getAllocate() && S->getDeallocate() &&
7769            "allocation and deallocation calls must already be built");
7770     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7771     if (AllocRes.isInvalid())
7772       return StmtError();
7773     Builder.Allocate = AllocRes.get();
7774 
7775     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7776     if (DeallocRes.isInvalid())
7777       return StmtError();
7778     Builder.Deallocate = DeallocRes.get();
7779 
7780     assert(S->getResultDecl() && "ResultDecl must already be built");
7781     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7782     if (ResultDecl.isInvalid())
7783       return StmtError();
7784     Builder.ResultDecl = ResultDecl.get();
7785 
7786     if (auto *ReturnStmt = S->getReturnStmt()) {
7787       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7788       if (Res.isInvalid())
7789         return StmtError();
7790       Builder.ReturnStmt = Res.get();
7791     }
7792   }
7793 
7794   return getDerived().RebuildCoroutineBodyStmt(Builder);
7795 }
7796 
7797 template<typename Derived>
7798 StmtResult
7799 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7800   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7801                                                         /*NotCopyInit*/false);
7802   if (Result.isInvalid())
7803     return StmtError();
7804 
7805   // Always rebuild; we don't know if this needs to be injected into a new
7806   // context or if the promise type has changed.
7807   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7808                                           S->isImplicit());
7809 }
7810 
7811 template<typename Derived>
7812 ExprResult
7813 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7814   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7815                                                         /*NotCopyInit*/false);
7816   if (Result.isInvalid())
7817     return ExprError();
7818 
7819   // Always rebuild; we don't know if this needs to be injected into a new
7820   // context or if the promise type has changed.
7821   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7822                                          E->isImplicit());
7823 }
7824 
7825 template <typename Derived>
7826 ExprResult
7827 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7828   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7829                                                         /*NotCopyInit*/ false);
7830   if (OperandResult.isInvalid())
7831     return ExprError();
7832 
7833   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7834           E->getOperatorCoawaitLookup());
7835 
7836   if (LookupResult.isInvalid())
7837     return ExprError();
7838 
7839   // Always rebuild; we don't know if this needs to be injected into a new
7840   // context or if the promise type has changed.
7841   return getDerived().RebuildDependentCoawaitExpr(
7842       E->getKeywordLoc(), OperandResult.get(),
7843       cast<UnresolvedLookupExpr>(LookupResult.get()));
7844 }
7845 
7846 template<typename Derived>
7847 ExprResult
7848 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7849   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7850                                                         /*NotCopyInit*/false);
7851   if (Result.isInvalid())
7852     return ExprError();
7853 
7854   // Always rebuild; we don't know if this needs to be injected into a new
7855   // context or if the promise type has changed.
7856   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7857 }
7858 
7859 // Objective-C Statements.
7860 
7861 template<typename Derived>
7862 StmtResult
7863 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7864   // Transform the body of the @try.
7865   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7866   if (TryBody.isInvalid())
7867     return StmtError();
7868 
7869   // Transform the @catch statements (if present).
7870   bool AnyCatchChanged = false;
7871   SmallVector<Stmt*, 8> CatchStmts;
7872   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7873     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7874     if (Catch.isInvalid())
7875       return StmtError();
7876     if (Catch.get() != S->getCatchStmt(I))
7877       AnyCatchChanged = true;
7878     CatchStmts.push_back(Catch.get());
7879   }
7880 
7881   // Transform the @finally statement (if present).
7882   StmtResult Finally;
7883   if (S->getFinallyStmt()) {
7884     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7885     if (Finally.isInvalid())
7886       return StmtError();
7887   }
7888 
7889   // If nothing changed, just retain this statement.
7890   if (!getDerived().AlwaysRebuild() &&
7891       TryBody.get() == S->getTryBody() &&
7892       !AnyCatchChanged &&
7893       Finally.get() == S->getFinallyStmt())
7894     return S;
7895 
7896   // Build a new statement.
7897   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7898                                            CatchStmts, Finally.get());
7899 }
7900 
7901 template<typename Derived>
7902 StmtResult
7903 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7904   // Transform the @catch parameter, if there is one.
7905   VarDecl *Var = nullptr;
7906   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7907     TypeSourceInfo *TSInfo = nullptr;
7908     if (FromVar->getTypeSourceInfo()) {
7909       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7910       if (!TSInfo)
7911         return StmtError();
7912     }
7913 
7914     QualType T;
7915     if (TSInfo)
7916       T = TSInfo->getType();
7917     else {
7918       T = getDerived().TransformType(FromVar->getType());
7919       if (T.isNull())
7920         return StmtError();
7921     }
7922 
7923     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7924     if (!Var)
7925       return StmtError();
7926   }
7927 
7928   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7929   if (Body.isInvalid())
7930     return StmtError();
7931 
7932   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7933                                              S->getRParenLoc(),
7934                                              Var, Body.get());
7935 }
7936 
7937 template<typename Derived>
7938 StmtResult
7939 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7940   // Transform the body.
7941   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7942   if (Body.isInvalid())
7943     return StmtError();
7944 
7945   // If nothing changed, just retain this statement.
7946   if (!getDerived().AlwaysRebuild() &&
7947       Body.get() == S->getFinallyBody())
7948     return S;
7949 
7950   // Build a new statement.
7951   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7952                                                Body.get());
7953 }
7954 
7955 template<typename Derived>
7956 StmtResult
7957 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7958   ExprResult Operand;
7959   if (S->getThrowExpr()) {
7960     Operand = getDerived().TransformExpr(S->getThrowExpr());
7961     if (Operand.isInvalid())
7962       return StmtError();
7963   }
7964 
7965   if (!getDerived().AlwaysRebuild() &&
7966       Operand.get() == S->getThrowExpr())
7967     return S;
7968 
7969   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7970 }
7971 
7972 template<typename Derived>
7973 StmtResult
7974 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7975                                                   ObjCAtSynchronizedStmt *S) {
7976   // Transform the object we are locking.
7977   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7978   if (Object.isInvalid())
7979     return StmtError();
7980   Object =
7981     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7982                                                   Object.get());
7983   if (Object.isInvalid())
7984     return StmtError();
7985 
7986   // Transform the body.
7987   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7988   if (Body.isInvalid())
7989     return StmtError();
7990 
7991   // If nothing change, just retain the current statement.
7992   if (!getDerived().AlwaysRebuild() &&
7993       Object.get() == S->getSynchExpr() &&
7994       Body.get() == S->getSynchBody())
7995     return S;
7996 
7997   // Build a new statement.
7998   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7999                                                     Object.get(), Body.get());
8000 }
8001 
8002 template<typename Derived>
8003 StmtResult
8004 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
8005                                               ObjCAutoreleasePoolStmt *S) {
8006   // Transform the body.
8007   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
8008   if (Body.isInvalid())
8009     return StmtError();
8010 
8011   // If nothing changed, just retain this statement.
8012   if (!getDerived().AlwaysRebuild() &&
8013       Body.get() == S->getSubStmt())
8014     return S;
8015 
8016   // Build a new statement.
8017   return getDerived().RebuildObjCAutoreleasePoolStmt(
8018                         S->getAtLoc(), Body.get());
8019 }
8020 
8021 template<typename Derived>
8022 StmtResult
8023 TreeTransform<Derived>::TransformObjCForCollectionStmt(
8024                                                   ObjCForCollectionStmt *S) {
8025   // Transform the element statement.
8026   StmtResult Element =
8027       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
8028   if (Element.isInvalid())
8029     return StmtError();
8030 
8031   // Transform the collection expression.
8032   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
8033   if (Collection.isInvalid())
8034     return StmtError();
8035 
8036   // Transform the body.
8037   StmtResult Body = getDerived().TransformStmt(S->getBody());
8038   if (Body.isInvalid())
8039     return StmtError();
8040 
8041   // If nothing changed, just retain this statement.
8042   if (!getDerived().AlwaysRebuild() &&
8043       Element.get() == S->getElement() &&
8044       Collection.get() == S->getCollection() &&
8045       Body.get() == S->getBody())
8046     return S;
8047 
8048   // Build a new statement.
8049   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8050                                                    Element.get(),
8051                                                    Collection.get(),
8052                                                    S->getRParenLoc(),
8053                                                    Body.get());
8054 }
8055 
8056 template <typename Derived>
8057 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8058   // Transform the exception declaration, if any.
8059   VarDecl *Var = nullptr;
8060   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8061     TypeSourceInfo *T =
8062         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8063     if (!T)
8064       return StmtError();
8065 
8066     Var = getDerived().RebuildExceptionDecl(
8067         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8068         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8069     if (!Var || Var->isInvalidDecl())
8070       return StmtError();
8071   }
8072 
8073   // Transform the actual exception handler.
8074   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8075   if (Handler.isInvalid())
8076     return StmtError();
8077 
8078   if (!getDerived().AlwaysRebuild() && !Var &&
8079       Handler.get() == S->getHandlerBlock())
8080     return S;
8081 
8082   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8083 }
8084 
8085 template <typename Derived>
8086 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8087   // Transform the try block itself.
8088   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8089   if (TryBlock.isInvalid())
8090     return StmtError();
8091 
8092   // Transform the handlers.
8093   bool HandlerChanged = false;
8094   SmallVector<Stmt *, 8> Handlers;
8095   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8096     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8097     if (Handler.isInvalid())
8098       return StmtError();
8099 
8100     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8101     Handlers.push_back(Handler.getAs<Stmt>());
8102   }
8103 
8104   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8105       !HandlerChanged)
8106     return S;
8107 
8108   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8109                                         Handlers);
8110 }
8111 
8112 template<typename Derived>
8113 StmtResult
8114 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8115   StmtResult Init =
8116       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8117   if (Init.isInvalid())
8118     return StmtError();
8119 
8120   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8121   if (Range.isInvalid())
8122     return StmtError();
8123 
8124   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8125   if (Begin.isInvalid())
8126     return StmtError();
8127   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8128   if (End.isInvalid())
8129     return StmtError();
8130 
8131   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8132   if (Cond.isInvalid())
8133     return StmtError();
8134   if (Cond.get())
8135     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8136   if (Cond.isInvalid())
8137     return StmtError();
8138   if (Cond.get())
8139     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8140 
8141   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8142   if (Inc.isInvalid())
8143     return StmtError();
8144   if (Inc.get())
8145     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8146 
8147   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8148   if (LoopVar.isInvalid())
8149     return StmtError();
8150 
8151   StmtResult NewStmt = S;
8152   if (getDerived().AlwaysRebuild() ||
8153       Init.get() != S->getInit() ||
8154       Range.get() != S->getRangeStmt() ||
8155       Begin.get() != S->getBeginStmt() ||
8156       End.get() != S->getEndStmt() ||
8157       Cond.get() != S->getCond() ||
8158       Inc.get() != S->getInc() ||
8159       LoopVar.get() != S->getLoopVarStmt()) {
8160     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8161                                                   S->getCoawaitLoc(), Init.get(),
8162                                                   S->getColonLoc(), Range.get(),
8163                                                   Begin.get(), End.get(),
8164                                                   Cond.get(),
8165                                                   Inc.get(), LoopVar.get(),
8166                                                   S->getRParenLoc());
8167     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8168       // Might not have attached any initializer to the loop variable.
8169       getSema().ActOnInitializerError(
8170           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8171       return StmtError();
8172     }
8173   }
8174 
8175   StmtResult Body = getDerived().TransformStmt(S->getBody());
8176   if (Body.isInvalid())
8177     return StmtError();
8178 
8179   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8180   // it now so we have a new statement to attach the body to.
8181   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8182     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8183                                                   S->getCoawaitLoc(), Init.get(),
8184                                                   S->getColonLoc(), Range.get(),
8185                                                   Begin.get(), End.get(),
8186                                                   Cond.get(),
8187                                                   Inc.get(), LoopVar.get(),
8188                                                   S->getRParenLoc());
8189     if (NewStmt.isInvalid())
8190       return StmtError();
8191   }
8192 
8193   if (NewStmt.get() == S)
8194     return S;
8195 
8196   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8197 }
8198 
8199 template<typename Derived>
8200 StmtResult
8201 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8202                                                     MSDependentExistsStmt *S) {
8203   // Transform the nested-name-specifier, if any.
8204   NestedNameSpecifierLoc QualifierLoc;
8205   if (S->getQualifierLoc()) {
8206     QualifierLoc
8207       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8208     if (!QualifierLoc)
8209       return StmtError();
8210   }
8211 
8212   // Transform the declaration name.
8213   DeclarationNameInfo NameInfo = S->getNameInfo();
8214   if (NameInfo.getName()) {
8215     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8216     if (!NameInfo.getName())
8217       return StmtError();
8218   }
8219 
8220   // Check whether anything changed.
8221   if (!getDerived().AlwaysRebuild() &&
8222       QualifierLoc == S->getQualifierLoc() &&
8223       NameInfo.getName() == S->getNameInfo().getName())
8224     return S;
8225 
8226   // Determine whether this name exists, if we can.
8227   CXXScopeSpec SS;
8228   SS.Adopt(QualifierLoc);
8229   bool Dependent = false;
8230   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8231   case Sema::IER_Exists:
8232     if (S->isIfExists())
8233       break;
8234 
8235     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8236 
8237   case Sema::IER_DoesNotExist:
8238     if (S->isIfNotExists())
8239       break;
8240 
8241     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8242 
8243   case Sema::IER_Dependent:
8244     Dependent = true;
8245     break;
8246 
8247   case Sema::IER_Error:
8248     return StmtError();
8249   }
8250 
8251   // We need to continue with the instantiation, so do so now.
8252   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8253   if (SubStmt.isInvalid())
8254     return StmtError();
8255 
8256   // If we have resolved the name, just transform to the substatement.
8257   if (!Dependent)
8258     return SubStmt;
8259 
8260   // The name is still dependent, so build a dependent expression again.
8261   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8262                                                    S->isIfExists(),
8263                                                    QualifierLoc,
8264                                                    NameInfo,
8265                                                    SubStmt.get());
8266 }
8267 
8268 template<typename Derived>
8269 ExprResult
8270 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8271   NestedNameSpecifierLoc QualifierLoc;
8272   if (E->getQualifierLoc()) {
8273     QualifierLoc
8274     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8275     if (!QualifierLoc)
8276       return ExprError();
8277   }
8278 
8279   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8280     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8281   if (!PD)
8282     return ExprError();
8283 
8284   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8285   if (Base.isInvalid())
8286     return ExprError();
8287 
8288   return new (SemaRef.getASTContext())
8289       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8290                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8291                         QualifierLoc, E->getMemberLoc());
8292 }
8293 
8294 template <typename Derived>
8295 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8296     MSPropertySubscriptExpr *E) {
8297   auto BaseRes = getDerived().TransformExpr(E->getBase());
8298   if (BaseRes.isInvalid())
8299     return ExprError();
8300   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8301   if (IdxRes.isInvalid())
8302     return ExprError();
8303 
8304   if (!getDerived().AlwaysRebuild() &&
8305       BaseRes.get() == E->getBase() &&
8306       IdxRes.get() == E->getIdx())
8307     return E;
8308 
8309   return getDerived().RebuildArraySubscriptExpr(
8310       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8311 }
8312 
8313 template <typename Derived>
8314 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8315   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8316   if (TryBlock.isInvalid())
8317     return StmtError();
8318 
8319   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8320   if (Handler.isInvalid())
8321     return StmtError();
8322 
8323   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8324       Handler.get() == S->getHandler())
8325     return S;
8326 
8327   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8328                                         TryBlock.get(), Handler.get());
8329 }
8330 
8331 template <typename Derived>
8332 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8333   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8334   if (Block.isInvalid())
8335     return StmtError();
8336 
8337   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8338 }
8339 
8340 template <typename Derived>
8341 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8342   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8343   if (FilterExpr.isInvalid())
8344     return StmtError();
8345 
8346   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8347   if (Block.isInvalid())
8348     return StmtError();
8349 
8350   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8351                                            Block.get());
8352 }
8353 
8354 template <typename Derived>
8355 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8356   if (isa<SEHFinallyStmt>(Handler))
8357     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8358   else
8359     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8360 }
8361 
8362 template<typename Derived>
8363 StmtResult
8364 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8365   return S;
8366 }
8367 
8368 //===----------------------------------------------------------------------===//
8369 // OpenMP directive transformation
8370 //===----------------------------------------------------------------------===//
8371 
8372 template <typename Derived>
8373 StmtResult
8374 TreeTransform<Derived>::TransformOMPCanonicalLoop(OMPCanonicalLoop *L) {
8375   // OMPCanonicalLoops are eliminated during transformation, since they will be
8376   // recomputed by semantic analysis of the associated OMPLoopBasedDirective
8377   // after transformation.
8378   return getDerived().TransformStmt(L->getLoopStmt());
8379 }
8380 
8381 template <typename Derived>
8382 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8383     OMPExecutableDirective *D) {
8384 
8385   // Transform the clauses
8386   llvm::SmallVector<OMPClause *, 16> TClauses;
8387   ArrayRef<OMPClause *> Clauses = D->clauses();
8388   TClauses.reserve(Clauses.size());
8389   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8390        I != E; ++I) {
8391     if (*I) {
8392       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8393       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8394       getDerived().getSema().EndOpenMPClause();
8395       if (Clause)
8396         TClauses.push_back(Clause);
8397     } else {
8398       TClauses.push_back(nullptr);
8399     }
8400   }
8401   StmtResult AssociatedStmt;
8402   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8403     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8404                                                   /*CurScope=*/nullptr);
8405     StmtResult Body;
8406     {
8407       Sema::CompoundScopeRAII CompoundScope(getSema());
8408       Stmt *CS;
8409       if (D->getDirectiveKind() == OMPD_atomic ||
8410           D->getDirectiveKind() == OMPD_critical ||
8411           D->getDirectiveKind() == OMPD_section ||
8412           D->getDirectiveKind() == OMPD_master)
8413         CS = D->getAssociatedStmt();
8414       else
8415         CS = D->getRawStmt();
8416       Body = getDerived().TransformStmt(CS);
8417       if (Body.isUsable() && isOpenMPLoopDirective(D->getDirectiveKind()) &&
8418           getSema().getLangOpts().OpenMPIRBuilder)
8419         Body = getDerived().RebuildOMPCanonicalLoop(Body.get());
8420     }
8421     AssociatedStmt =
8422         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8423     if (AssociatedStmt.isInvalid()) {
8424       return StmtError();
8425     }
8426   }
8427   if (TClauses.size() != Clauses.size()) {
8428     return StmtError();
8429   }
8430 
8431   // Transform directive name for 'omp critical' directive.
8432   DeclarationNameInfo DirName;
8433   if (D->getDirectiveKind() == OMPD_critical) {
8434     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8435     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8436   }
8437   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8438   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8439     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8440   } else if (D->getDirectiveKind() == OMPD_cancel) {
8441     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8442   }
8443 
8444   return getDerived().RebuildOMPExecutableDirective(
8445       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8446       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8447 }
8448 
8449 template <typename Derived>
8450 StmtResult
8451 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8452   DeclarationNameInfo DirName;
8453   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8454                                              D->getBeginLoc());
8455   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8456   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8457   return Res;
8458 }
8459 
8460 template <typename Derived>
8461 StmtResult
8462 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8463   DeclarationNameInfo DirName;
8464   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8465                                              D->getBeginLoc());
8466   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8467   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8468   return Res;
8469 }
8470 
8471 template <typename Derived>
8472 StmtResult
8473 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8474   DeclarationNameInfo DirName;
8475   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8476                                              nullptr, D->getBeginLoc());
8477   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8478   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8479   return Res;
8480 }
8481 
8482 template <typename Derived>
8483 StmtResult
8484 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8485   DeclarationNameInfo DirName;
8486   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8487                                              D->getBeginLoc());
8488   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8489   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8490   return Res;
8491 }
8492 
8493 template <typename Derived>
8494 StmtResult
8495 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8496   DeclarationNameInfo DirName;
8497   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8498                                              D->getBeginLoc());
8499   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8500   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8501   return Res;
8502 }
8503 
8504 template <typename Derived>
8505 StmtResult
8506 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8507   DeclarationNameInfo DirName;
8508   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8509                                              D->getBeginLoc());
8510   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8511   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8512   return Res;
8513 }
8514 
8515 template <typename Derived>
8516 StmtResult
8517 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8518   DeclarationNameInfo DirName;
8519   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8520                                              D->getBeginLoc());
8521   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8522   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8523   return Res;
8524 }
8525 
8526 template <typename Derived>
8527 StmtResult
8528 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8529   DeclarationNameInfo DirName;
8530   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8531                                              D->getBeginLoc());
8532   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8533   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8534   return Res;
8535 }
8536 
8537 template <typename Derived>
8538 StmtResult
8539 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8540   DeclarationNameInfo DirName;
8541   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8542                                              D->getBeginLoc());
8543   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8544   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8545   return Res;
8546 }
8547 
8548 template <typename Derived>
8549 StmtResult
8550 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8551   getDerived().getSema().StartOpenMPDSABlock(
8552       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8553   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8554   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8555   return Res;
8556 }
8557 
8558 template <typename Derived>
8559 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8560     OMPParallelForDirective *D) {
8561   DeclarationNameInfo DirName;
8562   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8563                                              nullptr, D->getBeginLoc());
8564   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8565   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8566   return Res;
8567 }
8568 
8569 template <typename Derived>
8570 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8571     OMPParallelForSimdDirective *D) {
8572   DeclarationNameInfo DirName;
8573   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8574                                              nullptr, D->getBeginLoc());
8575   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8576   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8577   return Res;
8578 }
8579 
8580 template <typename Derived>
8581 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8582     OMPParallelMasterDirective *D) {
8583   DeclarationNameInfo DirName;
8584   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8585                                              nullptr, D->getBeginLoc());
8586   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8587   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8588   return Res;
8589 }
8590 
8591 template <typename Derived>
8592 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8593     OMPParallelSectionsDirective *D) {
8594   DeclarationNameInfo DirName;
8595   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8596                                              nullptr, D->getBeginLoc());
8597   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8598   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8599   return Res;
8600 }
8601 
8602 template <typename Derived>
8603 StmtResult
8604 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8605   DeclarationNameInfo DirName;
8606   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8607                                              D->getBeginLoc());
8608   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8609   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8610   return Res;
8611 }
8612 
8613 template <typename Derived>
8614 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8615     OMPTaskyieldDirective *D) {
8616   DeclarationNameInfo DirName;
8617   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8618                                              D->getBeginLoc());
8619   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8620   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8621   return Res;
8622 }
8623 
8624 template <typename Derived>
8625 StmtResult
8626 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8627   DeclarationNameInfo DirName;
8628   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8629                                              D->getBeginLoc());
8630   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8631   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8632   return Res;
8633 }
8634 
8635 template <typename Derived>
8636 StmtResult
8637 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8638   DeclarationNameInfo DirName;
8639   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8640                                              D->getBeginLoc());
8641   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8642   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8643   return Res;
8644 }
8645 
8646 template <typename Derived>
8647 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8648     OMPTaskgroupDirective *D) {
8649   DeclarationNameInfo DirName;
8650   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8651                                              D->getBeginLoc());
8652   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8653   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8654   return Res;
8655 }
8656 
8657 template <typename Derived>
8658 StmtResult
8659 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8660   DeclarationNameInfo DirName;
8661   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8662                                              D->getBeginLoc());
8663   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8664   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8665   return Res;
8666 }
8667 
8668 template <typename Derived>
8669 StmtResult
8670 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8671   DeclarationNameInfo DirName;
8672   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8673                                              D->getBeginLoc());
8674   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8675   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8676   return Res;
8677 }
8678 
8679 template <typename Derived>
8680 StmtResult
8681 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8682   DeclarationNameInfo DirName;
8683   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8684                                              D->getBeginLoc());
8685   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8686   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8687   return Res;
8688 }
8689 
8690 template <typename Derived>
8691 StmtResult
8692 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8693   DeclarationNameInfo DirName;
8694   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8695                                              D->getBeginLoc());
8696   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8697   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8698   return Res;
8699 }
8700 
8701 template <typename Derived>
8702 StmtResult
8703 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8704   DeclarationNameInfo DirName;
8705   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8706                                              D->getBeginLoc());
8707   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8708   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8709   return Res;
8710 }
8711 
8712 template <typename Derived>
8713 StmtResult
8714 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8715   DeclarationNameInfo DirName;
8716   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8717                                              D->getBeginLoc());
8718   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8719   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8720   return Res;
8721 }
8722 
8723 template <typename Derived>
8724 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8725     OMPTargetDataDirective *D) {
8726   DeclarationNameInfo DirName;
8727   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8728                                              D->getBeginLoc());
8729   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8730   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8731   return Res;
8732 }
8733 
8734 template <typename Derived>
8735 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8736     OMPTargetEnterDataDirective *D) {
8737   DeclarationNameInfo DirName;
8738   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8739                                              nullptr, D->getBeginLoc());
8740   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8741   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8742   return Res;
8743 }
8744 
8745 template <typename Derived>
8746 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8747     OMPTargetExitDataDirective *D) {
8748   DeclarationNameInfo DirName;
8749   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8750                                              nullptr, D->getBeginLoc());
8751   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8752   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8753   return Res;
8754 }
8755 
8756 template <typename Derived>
8757 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8758     OMPTargetParallelDirective *D) {
8759   DeclarationNameInfo DirName;
8760   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8761                                              nullptr, D->getBeginLoc());
8762   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8763   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8764   return Res;
8765 }
8766 
8767 template <typename Derived>
8768 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8769     OMPTargetParallelForDirective *D) {
8770   DeclarationNameInfo DirName;
8771   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8772                                              nullptr, D->getBeginLoc());
8773   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8774   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8775   return Res;
8776 }
8777 
8778 template <typename Derived>
8779 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8780     OMPTargetUpdateDirective *D) {
8781   DeclarationNameInfo DirName;
8782   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8783                                              nullptr, D->getBeginLoc());
8784   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8785   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8786   return Res;
8787 }
8788 
8789 template <typename Derived>
8790 StmtResult
8791 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8792   DeclarationNameInfo DirName;
8793   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8794                                              D->getBeginLoc());
8795   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8796   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8797   return Res;
8798 }
8799 
8800 template <typename Derived>
8801 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8802     OMPCancellationPointDirective *D) {
8803   DeclarationNameInfo DirName;
8804   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8805                                              nullptr, D->getBeginLoc());
8806   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8807   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8808   return Res;
8809 }
8810 
8811 template <typename Derived>
8812 StmtResult
8813 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8814   DeclarationNameInfo DirName;
8815   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8816                                              D->getBeginLoc());
8817   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8818   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8819   return Res;
8820 }
8821 
8822 template <typename Derived>
8823 StmtResult
8824 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8825   DeclarationNameInfo DirName;
8826   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8827                                              D->getBeginLoc());
8828   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8829   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8830   return Res;
8831 }
8832 
8833 template <typename Derived>
8834 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8835     OMPTaskLoopSimdDirective *D) {
8836   DeclarationNameInfo DirName;
8837   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8838                                              nullptr, D->getBeginLoc());
8839   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8840   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8841   return Res;
8842 }
8843 
8844 template <typename Derived>
8845 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8846     OMPMasterTaskLoopDirective *D) {
8847   DeclarationNameInfo DirName;
8848   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8849                                              nullptr, D->getBeginLoc());
8850   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8851   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8852   return Res;
8853 }
8854 
8855 template <typename Derived>
8856 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8857     OMPMasterTaskLoopSimdDirective *D) {
8858   DeclarationNameInfo DirName;
8859   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8860                                              nullptr, D->getBeginLoc());
8861   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8862   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8863   return Res;
8864 }
8865 
8866 template <typename Derived>
8867 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8868     OMPParallelMasterTaskLoopDirective *D) {
8869   DeclarationNameInfo DirName;
8870   getDerived().getSema().StartOpenMPDSABlock(
8871       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8872   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8873   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8874   return Res;
8875 }
8876 
8877 template <typename Derived>
8878 StmtResult
8879 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8880     OMPParallelMasterTaskLoopSimdDirective *D) {
8881   DeclarationNameInfo DirName;
8882   getDerived().getSema().StartOpenMPDSABlock(
8883       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8884   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8885   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8886   return Res;
8887 }
8888 
8889 template <typename Derived>
8890 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8891     OMPDistributeDirective *D) {
8892   DeclarationNameInfo DirName;
8893   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8894                                              D->getBeginLoc());
8895   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8896   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8897   return Res;
8898 }
8899 
8900 template <typename Derived>
8901 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8902     OMPDistributeParallelForDirective *D) {
8903   DeclarationNameInfo DirName;
8904   getDerived().getSema().StartOpenMPDSABlock(
8905       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8906   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8907   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8908   return Res;
8909 }
8910 
8911 template <typename Derived>
8912 StmtResult
8913 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8914     OMPDistributeParallelForSimdDirective *D) {
8915   DeclarationNameInfo DirName;
8916   getDerived().getSema().StartOpenMPDSABlock(
8917       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8918   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8919   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8920   return Res;
8921 }
8922 
8923 template <typename Derived>
8924 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8925     OMPDistributeSimdDirective *D) {
8926   DeclarationNameInfo DirName;
8927   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8928                                              nullptr, D->getBeginLoc());
8929   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8930   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8931   return Res;
8932 }
8933 
8934 template <typename Derived>
8935 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8936     OMPTargetParallelForSimdDirective *D) {
8937   DeclarationNameInfo DirName;
8938   getDerived().getSema().StartOpenMPDSABlock(
8939       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8940   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8941   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8942   return Res;
8943 }
8944 
8945 template <typename Derived>
8946 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8947     OMPTargetSimdDirective *D) {
8948   DeclarationNameInfo DirName;
8949   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8950                                              D->getBeginLoc());
8951   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8952   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8953   return Res;
8954 }
8955 
8956 template <typename Derived>
8957 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8958     OMPTeamsDistributeDirective *D) {
8959   DeclarationNameInfo DirName;
8960   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8961                                              nullptr, D->getBeginLoc());
8962   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8963   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8964   return Res;
8965 }
8966 
8967 template <typename Derived>
8968 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8969     OMPTeamsDistributeSimdDirective *D) {
8970   DeclarationNameInfo DirName;
8971   getDerived().getSema().StartOpenMPDSABlock(
8972       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8973   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8974   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8975   return Res;
8976 }
8977 
8978 template <typename Derived>
8979 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8980     OMPTeamsDistributeParallelForSimdDirective *D) {
8981   DeclarationNameInfo DirName;
8982   getDerived().getSema().StartOpenMPDSABlock(
8983       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8984       D->getBeginLoc());
8985   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8986   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8987   return Res;
8988 }
8989 
8990 template <typename Derived>
8991 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8992     OMPTeamsDistributeParallelForDirective *D) {
8993   DeclarationNameInfo DirName;
8994   getDerived().getSema().StartOpenMPDSABlock(
8995       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8996   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8997   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8998   return Res;
8999 }
9000 
9001 template <typename Derived>
9002 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
9003     OMPTargetTeamsDirective *D) {
9004   DeclarationNameInfo DirName;
9005   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
9006                                              nullptr, D->getBeginLoc());
9007   auto Res = getDerived().TransformOMPExecutableDirective(D);
9008   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9009   return Res;
9010 }
9011 
9012 template <typename Derived>
9013 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
9014     OMPTargetTeamsDistributeDirective *D) {
9015   DeclarationNameInfo DirName;
9016   getDerived().getSema().StartOpenMPDSABlock(
9017       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
9018   auto Res = getDerived().TransformOMPExecutableDirective(D);
9019   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9020   return Res;
9021 }
9022 
9023 template <typename Derived>
9024 StmtResult
9025 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
9026     OMPTargetTeamsDistributeParallelForDirective *D) {
9027   DeclarationNameInfo DirName;
9028   getDerived().getSema().StartOpenMPDSABlock(
9029       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
9030       D->getBeginLoc());
9031   auto Res = getDerived().TransformOMPExecutableDirective(D);
9032   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9033   return Res;
9034 }
9035 
9036 template <typename Derived>
9037 StmtResult TreeTransform<Derived>::
9038     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
9039         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
9040   DeclarationNameInfo DirName;
9041   getDerived().getSema().StartOpenMPDSABlock(
9042       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
9043       D->getBeginLoc());
9044   auto Res = getDerived().TransformOMPExecutableDirective(D);
9045   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9046   return Res;
9047 }
9048 
9049 template <typename Derived>
9050 StmtResult
9051 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
9052     OMPTargetTeamsDistributeSimdDirective *D) {
9053   DeclarationNameInfo DirName;
9054   getDerived().getSema().StartOpenMPDSABlock(
9055       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
9056   auto Res = getDerived().TransformOMPExecutableDirective(D);
9057   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9058   return Res;
9059 }
9060 
9061 template <typename Derived>
9062 StmtResult
9063 TreeTransform<Derived>::TransformOMPInteropDirective(OMPInteropDirective *D) {
9064   DeclarationNameInfo DirName;
9065   getDerived().getSema().StartOpenMPDSABlock(OMPD_interop, DirName, nullptr,
9066                                              D->getBeginLoc());
9067   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
9068   getDerived().getSema().EndOpenMPDSABlock(Res.get());
9069   return Res;
9070 }
9071 
9072 //===----------------------------------------------------------------------===//
9073 // OpenMP clause transformation
9074 //===----------------------------------------------------------------------===//
9075 template <typename Derived>
9076 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9077   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9078   if (Cond.isInvalid())
9079     return nullptr;
9080   return getDerived().RebuildOMPIfClause(
9081       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9082       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9083 }
9084 
9085 template <typename Derived>
9086 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9087   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9088   if (Cond.isInvalid())
9089     return nullptr;
9090   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9091                                             C->getLParenLoc(), C->getEndLoc());
9092 }
9093 
9094 template <typename Derived>
9095 OMPClause *
9096 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9097   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9098   if (NumThreads.isInvalid())
9099     return nullptr;
9100   return getDerived().RebuildOMPNumThreadsClause(
9101       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9102 }
9103 
9104 template <typename Derived>
9105 OMPClause *
9106 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9107   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9108   if (E.isInvalid())
9109     return nullptr;
9110   return getDerived().RebuildOMPSafelenClause(
9111       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9112 }
9113 
9114 template <typename Derived>
9115 OMPClause *
9116 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9117   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9118   if (E.isInvalid())
9119     return nullptr;
9120   return getDerived().RebuildOMPAllocatorClause(
9121       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9122 }
9123 
9124 template <typename Derived>
9125 OMPClause *
9126 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9127   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9128   if (E.isInvalid())
9129     return nullptr;
9130   return getDerived().RebuildOMPSimdlenClause(
9131       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9132 }
9133 
9134 template <typename Derived>
9135 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9136   SmallVector<Expr *, 4> TransformedSizes;
9137   TransformedSizes.reserve(C->getNumSizes());
9138   bool Changed = false;
9139   for (Expr *E : C->getSizesRefs()) {
9140     if (!E) {
9141       TransformedSizes.push_back(nullptr);
9142       continue;
9143     }
9144 
9145     ExprResult T = getDerived().TransformExpr(E);
9146     if (T.isInvalid())
9147       return nullptr;
9148     if (E != T.get())
9149       Changed = true;
9150     TransformedSizes.push_back(T.get());
9151   }
9152 
9153   if (!Changed && !getDerived().AlwaysRebuild())
9154     return C;
9155   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9156                                C->getLParenLoc(), C->getEndLoc());
9157 }
9158 
9159 template <typename Derived>
9160 OMPClause *
9161 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9162   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9163   if (E.isInvalid())
9164     return nullptr;
9165   return getDerived().RebuildOMPCollapseClause(
9166       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9167 }
9168 
9169 template <typename Derived>
9170 OMPClause *
9171 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9172   return getDerived().RebuildOMPDefaultClause(
9173       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9174       C->getLParenLoc(), C->getEndLoc());
9175 }
9176 
9177 template <typename Derived>
9178 OMPClause *
9179 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9180   return getDerived().RebuildOMPProcBindClause(
9181       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9182       C->getLParenLoc(), C->getEndLoc());
9183 }
9184 
9185 template <typename Derived>
9186 OMPClause *
9187 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9188   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9189   if (E.isInvalid())
9190     return nullptr;
9191   return getDerived().RebuildOMPScheduleClause(
9192       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9193       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9194       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9195       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9196 }
9197 
9198 template <typename Derived>
9199 OMPClause *
9200 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9201   ExprResult E;
9202   if (auto *Num = C->getNumForLoops()) {
9203     E = getDerived().TransformExpr(Num);
9204     if (E.isInvalid())
9205       return nullptr;
9206   }
9207   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9208                                               C->getLParenLoc(), E.get());
9209 }
9210 
9211 template <typename Derived>
9212 OMPClause *
9213 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9214   ExprResult E;
9215   if (Expr *Evt = C->getEventHandler()) {
9216     E = getDerived().TransformExpr(Evt);
9217     if (E.isInvalid())
9218       return nullptr;
9219   }
9220   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9221                                              C->getLParenLoc(), C->getEndLoc());
9222 }
9223 
9224 template <typename Derived>
9225 OMPClause *
9226 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9227   // No need to rebuild this clause, no template-dependent parameters.
9228   return C;
9229 }
9230 
9231 template <typename Derived>
9232 OMPClause *
9233 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9234   // No need to rebuild this clause, no template-dependent parameters.
9235   return C;
9236 }
9237 
9238 template <typename Derived>
9239 OMPClause *
9240 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9241   // No need to rebuild this clause, no template-dependent parameters.
9242   return C;
9243 }
9244 
9245 template <typename Derived>
9246 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9247   // No need to rebuild this clause, no template-dependent parameters.
9248   return C;
9249 }
9250 
9251 template <typename Derived>
9252 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9253   // No need to rebuild this clause, no template-dependent parameters.
9254   return C;
9255 }
9256 
9257 template <typename Derived>
9258 OMPClause *
9259 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9260   // No need to rebuild this clause, no template-dependent parameters.
9261   return C;
9262 }
9263 
9264 template <typename Derived>
9265 OMPClause *
9266 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9267   // No need to rebuild this clause, no template-dependent parameters.
9268   return C;
9269 }
9270 
9271 template <typename Derived>
9272 OMPClause *
9273 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9274   // No need to rebuild this clause, no template-dependent parameters.
9275   return C;
9276 }
9277 
9278 template <typename Derived>
9279 OMPClause *
9280 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9281   // No need to rebuild this clause, no template-dependent parameters.
9282   return C;
9283 }
9284 
9285 template <typename Derived>
9286 OMPClause *
9287 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9288   // No need to rebuild this clause, no template-dependent parameters.
9289   return C;
9290 }
9291 
9292 template <typename Derived>
9293 OMPClause *
9294 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9295   // No need to rebuild this clause, no template-dependent parameters.
9296   return C;
9297 }
9298 
9299 template <typename Derived>
9300 OMPClause *
9301 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9302   // No need to rebuild this clause, no template-dependent parameters.
9303   return C;
9304 }
9305 
9306 template <typename Derived>
9307 OMPClause *
9308 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9309   // No need to rebuild this clause, no template-dependent parameters.
9310   return C;
9311 }
9312 
9313 template <typename Derived>
9314 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9315   // No need to rebuild this clause, no template-dependent parameters.
9316   return C;
9317 }
9318 
9319 template <typename Derived>
9320 OMPClause *
9321 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9322   // No need to rebuild this clause, no template-dependent parameters.
9323   return C;
9324 }
9325 
9326 template <typename Derived>
9327 OMPClause *TreeTransform<Derived>::TransformOMPInitClause(OMPInitClause *C) {
9328   ExprResult IVR = getDerived().TransformExpr(C->getInteropVar());
9329   if (IVR.isInvalid())
9330     return nullptr;
9331 
9332   llvm::SmallVector<Expr *, 8> PrefExprs;
9333   PrefExprs.reserve(C->varlist_size() - 1);
9334   for (Expr *E : llvm::drop_begin(C->varlists())) {
9335     ExprResult ER = getDerived().TransformExpr(cast<Expr>(E));
9336     if (ER.isInvalid())
9337       return nullptr;
9338     PrefExprs.push_back(ER.get());
9339   }
9340   return getDerived().RebuildOMPInitClause(
9341       IVR.get(), PrefExprs, C->getIsTarget(), C->getIsTargetSync(),
9342       C->getBeginLoc(), C->getLParenLoc(), C->getVarLoc(), C->getEndLoc());
9343 }
9344 
9345 template <typename Derived>
9346 OMPClause *TreeTransform<Derived>::TransformOMPUseClause(OMPUseClause *C) {
9347   ExprResult ER = getDerived().TransformExpr(C->getInteropVar());
9348   if (ER.isInvalid())
9349     return nullptr;
9350   return getDerived().RebuildOMPUseClause(ER.get(), C->getBeginLoc(),
9351                                           C->getLParenLoc(), C->getVarLoc(),
9352                                           C->getEndLoc());
9353 }
9354 
9355 template <typename Derived>
9356 OMPClause *
9357 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9358   ExprResult ER;
9359   if (Expr *IV = C->getInteropVar()) {
9360     ER = getDerived().TransformExpr(IV);
9361     if (ER.isInvalid())
9362       return nullptr;
9363   }
9364   return getDerived().RebuildOMPDestroyClause(ER.get(), C->getBeginLoc(),
9365                                               C->getLParenLoc(), C->getVarLoc(),
9366                                               C->getEndLoc());
9367 }
9368 
9369 template <typename Derived>
9370 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9371     OMPUnifiedAddressClause *C) {
9372   llvm_unreachable("unified_address clause cannot appear in dependent context");
9373 }
9374 
9375 template <typename Derived>
9376 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9377     OMPUnifiedSharedMemoryClause *C) {
9378   llvm_unreachable(
9379       "unified_shared_memory clause cannot appear in dependent context");
9380 }
9381 
9382 template <typename Derived>
9383 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9384     OMPReverseOffloadClause *C) {
9385   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9386 }
9387 
9388 template <typename Derived>
9389 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9390     OMPDynamicAllocatorsClause *C) {
9391   llvm_unreachable(
9392       "dynamic_allocators clause cannot appear in dependent context");
9393 }
9394 
9395 template <typename Derived>
9396 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9397     OMPAtomicDefaultMemOrderClause *C) {
9398   llvm_unreachable(
9399       "atomic_default_mem_order clause cannot appear in dependent context");
9400 }
9401 
9402 template <typename Derived>
9403 OMPClause *
9404 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9405   llvm::SmallVector<Expr *, 16> Vars;
9406   Vars.reserve(C->varlist_size());
9407   for (auto *VE : C->varlists()) {
9408     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9409     if (EVar.isInvalid())
9410       return nullptr;
9411     Vars.push_back(EVar.get());
9412   }
9413   return getDerived().RebuildOMPPrivateClause(
9414       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9415 }
9416 
9417 template <typename Derived>
9418 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9419     OMPFirstprivateClause *C) {
9420   llvm::SmallVector<Expr *, 16> Vars;
9421   Vars.reserve(C->varlist_size());
9422   for (auto *VE : C->varlists()) {
9423     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9424     if (EVar.isInvalid())
9425       return nullptr;
9426     Vars.push_back(EVar.get());
9427   }
9428   return getDerived().RebuildOMPFirstprivateClause(
9429       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9430 }
9431 
9432 template <typename Derived>
9433 OMPClause *
9434 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9435   llvm::SmallVector<Expr *, 16> Vars;
9436   Vars.reserve(C->varlist_size());
9437   for (auto *VE : C->varlists()) {
9438     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9439     if (EVar.isInvalid())
9440       return nullptr;
9441     Vars.push_back(EVar.get());
9442   }
9443   return getDerived().RebuildOMPLastprivateClause(
9444       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9445       C->getLParenLoc(), C->getEndLoc());
9446 }
9447 
9448 template <typename Derived>
9449 OMPClause *
9450 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9451   llvm::SmallVector<Expr *, 16> Vars;
9452   Vars.reserve(C->varlist_size());
9453   for (auto *VE : C->varlists()) {
9454     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9455     if (EVar.isInvalid())
9456       return nullptr;
9457     Vars.push_back(EVar.get());
9458   }
9459   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9460                                              C->getLParenLoc(), C->getEndLoc());
9461 }
9462 
9463 template <typename Derived>
9464 OMPClause *
9465 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9466   llvm::SmallVector<Expr *, 16> Vars;
9467   Vars.reserve(C->varlist_size());
9468   for (auto *VE : C->varlists()) {
9469     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9470     if (EVar.isInvalid())
9471       return nullptr;
9472     Vars.push_back(EVar.get());
9473   }
9474   CXXScopeSpec ReductionIdScopeSpec;
9475   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9476 
9477   DeclarationNameInfo NameInfo = C->getNameInfo();
9478   if (NameInfo.getName()) {
9479     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9480     if (!NameInfo.getName())
9481       return nullptr;
9482   }
9483   // Build a list of all UDR decls with the same names ranged by the Scopes.
9484   // The Scope boundary is a duplication of the previous decl.
9485   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9486   for (auto *E : C->reduction_ops()) {
9487     // Transform all the decls.
9488     if (E) {
9489       auto *ULE = cast<UnresolvedLookupExpr>(E);
9490       UnresolvedSet<8> Decls;
9491       for (auto *D : ULE->decls()) {
9492         NamedDecl *InstD =
9493             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9494         Decls.addDecl(InstD, InstD->getAccess());
9495       }
9496       UnresolvedReductions.push_back(
9497        UnresolvedLookupExpr::Create(
9498           SemaRef.Context, /*NamingClass=*/nullptr,
9499           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9500           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9501           Decls.begin(), Decls.end()));
9502     } else
9503       UnresolvedReductions.push_back(nullptr);
9504   }
9505   return getDerived().RebuildOMPReductionClause(
9506       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9507       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9508       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9509 }
9510 
9511 template <typename Derived>
9512 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9513     OMPTaskReductionClause *C) {
9514   llvm::SmallVector<Expr *, 16> Vars;
9515   Vars.reserve(C->varlist_size());
9516   for (auto *VE : C->varlists()) {
9517     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9518     if (EVar.isInvalid())
9519       return nullptr;
9520     Vars.push_back(EVar.get());
9521   }
9522   CXXScopeSpec ReductionIdScopeSpec;
9523   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9524 
9525   DeclarationNameInfo NameInfo = C->getNameInfo();
9526   if (NameInfo.getName()) {
9527     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9528     if (!NameInfo.getName())
9529       return nullptr;
9530   }
9531   // Build a list of all UDR decls with the same names ranged by the Scopes.
9532   // The Scope boundary is a duplication of the previous decl.
9533   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9534   for (auto *E : C->reduction_ops()) {
9535     // Transform all the decls.
9536     if (E) {
9537       auto *ULE = cast<UnresolvedLookupExpr>(E);
9538       UnresolvedSet<8> Decls;
9539       for (auto *D : ULE->decls()) {
9540         NamedDecl *InstD =
9541             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9542         Decls.addDecl(InstD, InstD->getAccess());
9543       }
9544       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9545           SemaRef.Context, /*NamingClass=*/nullptr,
9546           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9547           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9548     } else
9549       UnresolvedReductions.push_back(nullptr);
9550   }
9551   return getDerived().RebuildOMPTaskReductionClause(
9552       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9553       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9554 }
9555 
9556 template <typename Derived>
9557 OMPClause *
9558 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9559   llvm::SmallVector<Expr *, 16> Vars;
9560   Vars.reserve(C->varlist_size());
9561   for (auto *VE : C->varlists()) {
9562     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9563     if (EVar.isInvalid())
9564       return nullptr;
9565     Vars.push_back(EVar.get());
9566   }
9567   CXXScopeSpec ReductionIdScopeSpec;
9568   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9569 
9570   DeclarationNameInfo NameInfo = C->getNameInfo();
9571   if (NameInfo.getName()) {
9572     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9573     if (!NameInfo.getName())
9574       return nullptr;
9575   }
9576   // Build a list of all UDR decls with the same names ranged by the Scopes.
9577   // The Scope boundary is a duplication of the previous decl.
9578   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9579   for (auto *E : C->reduction_ops()) {
9580     // Transform all the decls.
9581     if (E) {
9582       auto *ULE = cast<UnresolvedLookupExpr>(E);
9583       UnresolvedSet<8> Decls;
9584       for (auto *D : ULE->decls()) {
9585         NamedDecl *InstD =
9586             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9587         Decls.addDecl(InstD, InstD->getAccess());
9588       }
9589       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9590           SemaRef.Context, /*NamingClass=*/nullptr,
9591           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9592           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9593     } else
9594       UnresolvedReductions.push_back(nullptr);
9595   }
9596   return getDerived().RebuildOMPInReductionClause(
9597       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9598       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9599 }
9600 
9601 template <typename Derived>
9602 OMPClause *
9603 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9604   llvm::SmallVector<Expr *, 16> Vars;
9605   Vars.reserve(C->varlist_size());
9606   for (auto *VE : C->varlists()) {
9607     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9608     if (EVar.isInvalid())
9609       return nullptr;
9610     Vars.push_back(EVar.get());
9611   }
9612   ExprResult Step = getDerived().TransformExpr(C->getStep());
9613   if (Step.isInvalid())
9614     return nullptr;
9615   return getDerived().RebuildOMPLinearClause(
9616       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9617       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9618 }
9619 
9620 template <typename Derived>
9621 OMPClause *
9622 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9623   llvm::SmallVector<Expr *, 16> Vars;
9624   Vars.reserve(C->varlist_size());
9625   for (auto *VE : C->varlists()) {
9626     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9627     if (EVar.isInvalid())
9628       return nullptr;
9629     Vars.push_back(EVar.get());
9630   }
9631   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9632   if (Alignment.isInvalid())
9633     return nullptr;
9634   return getDerived().RebuildOMPAlignedClause(
9635       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9636       C->getColonLoc(), C->getEndLoc());
9637 }
9638 
9639 template <typename Derived>
9640 OMPClause *
9641 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9642   llvm::SmallVector<Expr *, 16> Vars;
9643   Vars.reserve(C->varlist_size());
9644   for (auto *VE : C->varlists()) {
9645     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9646     if (EVar.isInvalid())
9647       return nullptr;
9648     Vars.push_back(EVar.get());
9649   }
9650   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9651                                              C->getLParenLoc(), C->getEndLoc());
9652 }
9653 
9654 template <typename Derived>
9655 OMPClause *
9656 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9657   llvm::SmallVector<Expr *, 16> Vars;
9658   Vars.reserve(C->varlist_size());
9659   for (auto *VE : C->varlists()) {
9660     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9661     if (EVar.isInvalid())
9662       return nullptr;
9663     Vars.push_back(EVar.get());
9664   }
9665   return getDerived().RebuildOMPCopyprivateClause(
9666       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9667 }
9668 
9669 template <typename Derived>
9670 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9671   llvm::SmallVector<Expr *, 16> Vars;
9672   Vars.reserve(C->varlist_size());
9673   for (auto *VE : C->varlists()) {
9674     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9675     if (EVar.isInvalid())
9676       return nullptr;
9677     Vars.push_back(EVar.get());
9678   }
9679   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9680                                             C->getLParenLoc(), C->getEndLoc());
9681 }
9682 
9683 template <typename Derived>
9684 OMPClause *
9685 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9686   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9687   if (E.isInvalid())
9688     return nullptr;
9689   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9690                                              C->getLParenLoc(), C->getEndLoc());
9691 }
9692 
9693 template <typename Derived>
9694 OMPClause *
9695 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9696   llvm::SmallVector<Expr *, 16> Vars;
9697   Expr *DepModifier = C->getModifier();
9698   if (DepModifier) {
9699     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9700     if (DepModRes.isInvalid())
9701       return nullptr;
9702     DepModifier = DepModRes.get();
9703   }
9704   Vars.reserve(C->varlist_size());
9705   for (auto *VE : C->varlists()) {
9706     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9707     if (EVar.isInvalid())
9708       return nullptr;
9709     Vars.push_back(EVar.get());
9710   }
9711   return getDerived().RebuildOMPDependClause(
9712       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9713       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9714       C->getEndLoc());
9715 }
9716 
9717 template <typename Derived>
9718 OMPClause *
9719 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9720   ExprResult E = getDerived().TransformExpr(C->getDevice());
9721   if (E.isInvalid())
9722     return nullptr;
9723   return getDerived().RebuildOMPDeviceClause(
9724       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9725       C->getModifierLoc(), C->getEndLoc());
9726 }
9727 
9728 template <typename Derived, class T>
9729 bool transformOMPMappableExprListClause(
9730     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9731     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9732     DeclarationNameInfo &MapperIdInfo,
9733     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9734   // Transform expressions in the list.
9735   Vars.reserve(C->varlist_size());
9736   for (auto *VE : C->varlists()) {
9737     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9738     if (EVar.isInvalid())
9739       return true;
9740     Vars.push_back(EVar.get());
9741   }
9742   // Transform mapper scope specifier and identifier.
9743   NestedNameSpecifierLoc QualifierLoc;
9744   if (C->getMapperQualifierLoc()) {
9745     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9746         C->getMapperQualifierLoc());
9747     if (!QualifierLoc)
9748       return true;
9749   }
9750   MapperIdScopeSpec.Adopt(QualifierLoc);
9751   MapperIdInfo = C->getMapperIdInfo();
9752   if (MapperIdInfo.getName()) {
9753     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9754     if (!MapperIdInfo.getName())
9755       return true;
9756   }
9757   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9758   // the previous user-defined mapper lookup in dependent environment.
9759   for (auto *E : C->mapperlists()) {
9760     // Transform all the decls.
9761     if (E) {
9762       auto *ULE = cast<UnresolvedLookupExpr>(E);
9763       UnresolvedSet<8> Decls;
9764       for (auto *D : ULE->decls()) {
9765         NamedDecl *InstD =
9766             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9767         Decls.addDecl(InstD, InstD->getAccess());
9768       }
9769       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9770           TT.getSema().Context, /*NamingClass=*/nullptr,
9771           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9772           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9773           Decls.end()));
9774     } else {
9775       UnresolvedMappers.push_back(nullptr);
9776     }
9777   }
9778   return false;
9779 }
9780 
9781 template <typename Derived>
9782 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9783   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9784   llvm::SmallVector<Expr *, 16> Vars;
9785   CXXScopeSpec MapperIdScopeSpec;
9786   DeclarationNameInfo MapperIdInfo;
9787   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9788   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9789           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9790     return nullptr;
9791   return getDerived().RebuildOMPMapClause(
9792       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9793       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9794       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9795 }
9796 
9797 template <typename Derived>
9798 OMPClause *
9799 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9800   Expr *Allocator = C->getAllocator();
9801   if (Allocator) {
9802     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9803     if (AllocatorRes.isInvalid())
9804       return nullptr;
9805     Allocator = AllocatorRes.get();
9806   }
9807   llvm::SmallVector<Expr *, 16> Vars;
9808   Vars.reserve(C->varlist_size());
9809   for (auto *VE : C->varlists()) {
9810     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9811     if (EVar.isInvalid())
9812       return nullptr;
9813     Vars.push_back(EVar.get());
9814   }
9815   return getDerived().RebuildOMPAllocateClause(
9816       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9817       C->getEndLoc());
9818 }
9819 
9820 template <typename Derived>
9821 OMPClause *
9822 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9823   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9824   if (E.isInvalid())
9825     return nullptr;
9826   return getDerived().RebuildOMPNumTeamsClause(
9827       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9828 }
9829 
9830 template <typename Derived>
9831 OMPClause *
9832 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9833   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9834   if (E.isInvalid())
9835     return nullptr;
9836   return getDerived().RebuildOMPThreadLimitClause(
9837       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9838 }
9839 
9840 template <typename Derived>
9841 OMPClause *
9842 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9843   ExprResult E = getDerived().TransformExpr(C->getPriority());
9844   if (E.isInvalid())
9845     return nullptr;
9846   return getDerived().RebuildOMPPriorityClause(
9847       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9848 }
9849 
9850 template <typename Derived>
9851 OMPClause *
9852 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9853   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9854   if (E.isInvalid())
9855     return nullptr;
9856   return getDerived().RebuildOMPGrainsizeClause(
9857       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9858 }
9859 
9860 template <typename Derived>
9861 OMPClause *
9862 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9863   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9864   if (E.isInvalid())
9865     return nullptr;
9866   return getDerived().RebuildOMPNumTasksClause(
9867       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9868 }
9869 
9870 template <typename Derived>
9871 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9872   ExprResult E = getDerived().TransformExpr(C->getHint());
9873   if (E.isInvalid())
9874     return nullptr;
9875   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9876                                            C->getLParenLoc(), C->getEndLoc());
9877 }
9878 
9879 template <typename Derived>
9880 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9881     OMPDistScheduleClause *C) {
9882   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9883   if (E.isInvalid())
9884     return nullptr;
9885   return getDerived().RebuildOMPDistScheduleClause(
9886       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9887       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9888 }
9889 
9890 template <typename Derived>
9891 OMPClause *
9892 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9893   // Rebuild Defaultmap Clause since we need to invoke the checking of
9894   // defaultmap(none:variable-category) after template initialization.
9895   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9896                                                  C->getDefaultmapKind(),
9897                                                  C->getBeginLoc(),
9898                                                  C->getLParenLoc(),
9899                                                  C->getDefaultmapModifierLoc(),
9900                                                  C->getDefaultmapKindLoc(),
9901                                                  C->getEndLoc());
9902 }
9903 
9904 template <typename Derived>
9905 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9906   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9907   llvm::SmallVector<Expr *, 16> Vars;
9908   CXXScopeSpec MapperIdScopeSpec;
9909   DeclarationNameInfo MapperIdInfo;
9910   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9911   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9912           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9913     return nullptr;
9914   return getDerived().RebuildOMPToClause(
9915       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9916       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9917 }
9918 
9919 template <typename Derived>
9920 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9921   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9922   llvm::SmallVector<Expr *, 16> Vars;
9923   CXXScopeSpec MapperIdScopeSpec;
9924   DeclarationNameInfo MapperIdInfo;
9925   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9926   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9927           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9928     return nullptr;
9929   return getDerived().RebuildOMPFromClause(
9930       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9931       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9932 }
9933 
9934 template <typename Derived>
9935 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9936     OMPUseDevicePtrClause *C) {
9937   llvm::SmallVector<Expr *, 16> Vars;
9938   Vars.reserve(C->varlist_size());
9939   for (auto *VE : C->varlists()) {
9940     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9941     if (EVar.isInvalid())
9942       return nullptr;
9943     Vars.push_back(EVar.get());
9944   }
9945   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9946   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9947 }
9948 
9949 template <typename Derived>
9950 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
9951     OMPUseDeviceAddrClause *C) {
9952   llvm::SmallVector<Expr *, 16> Vars;
9953   Vars.reserve(C->varlist_size());
9954   for (auto *VE : C->varlists()) {
9955     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9956     if (EVar.isInvalid())
9957       return nullptr;
9958     Vars.push_back(EVar.get());
9959   }
9960   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9961   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
9962 }
9963 
9964 template <typename Derived>
9965 OMPClause *
9966 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9967   llvm::SmallVector<Expr *, 16> Vars;
9968   Vars.reserve(C->varlist_size());
9969   for (auto *VE : C->varlists()) {
9970     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9971     if (EVar.isInvalid())
9972       return nullptr;
9973     Vars.push_back(EVar.get());
9974   }
9975   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9976   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9977 }
9978 
9979 template <typename Derived>
9980 OMPClause *
9981 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9982   llvm::SmallVector<Expr *, 16> Vars;
9983   Vars.reserve(C->varlist_size());
9984   for (auto *VE : C->varlists()) {
9985     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9986     if (EVar.isInvalid())
9987       return nullptr;
9988     Vars.push_back(EVar.get());
9989   }
9990   return getDerived().RebuildOMPNontemporalClause(
9991       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9992 }
9993 
9994 template <typename Derived>
9995 OMPClause *
9996 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
9997   llvm::SmallVector<Expr *, 16> Vars;
9998   Vars.reserve(C->varlist_size());
9999   for (auto *VE : C->varlists()) {
10000     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10001     if (EVar.isInvalid())
10002       return nullptr;
10003     Vars.push_back(EVar.get());
10004   }
10005   return getDerived().RebuildOMPInclusiveClause(
10006       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10007 }
10008 
10009 template <typename Derived>
10010 OMPClause *
10011 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
10012   llvm::SmallVector<Expr *, 16> Vars;
10013   Vars.reserve(C->varlist_size());
10014   for (auto *VE : C->varlists()) {
10015     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
10016     if (EVar.isInvalid())
10017       return nullptr;
10018     Vars.push_back(EVar.get());
10019   }
10020   return getDerived().RebuildOMPExclusiveClause(
10021       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10022 }
10023 
10024 template <typename Derived>
10025 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
10026     OMPUsesAllocatorsClause *C) {
10027   SmallVector<Sema::UsesAllocatorsData, 16> Data;
10028   Data.reserve(C->getNumberOfAllocators());
10029   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
10030     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
10031     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
10032     if (Allocator.isInvalid())
10033       continue;
10034     ExprResult AllocatorTraits;
10035     if (Expr *AT = D.AllocatorTraits) {
10036       AllocatorTraits = getDerived().TransformExpr(AT);
10037       if (AllocatorTraits.isInvalid())
10038         continue;
10039     }
10040     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
10041     NewD.Allocator = Allocator.get();
10042     NewD.AllocatorTraits = AllocatorTraits.get();
10043     NewD.LParenLoc = D.LParenLoc;
10044     NewD.RParenLoc = D.RParenLoc;
10045   }
10046   return getDerived().RebuildOMPUsesAllocatorsClause(
10047       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
10048 }
10049 
10050 template <typename Derived>
10051 OMPClause *
10052 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
10053   SmallVector<Expr *, 4> Locators;
10054   Locators.reserve(C->varlist_size());
10055   ExprResult ModifierRes;
10056   if (Expr *Modifier = C->getModifier()) {
10057     ModifierRes = getDerived().TransformExpr(Modifier);
10058     if (ModifierRes.isInvalid())
10059       return nullptr;
10060   }
10061   for (Expr *E : C->varlists()) {
10062     ExprResult Locator = getDerived().TransformExpr(E);
10063     if (Locator.isInvalid())
10064       continue;
10065     Locators.push_back(Locator.get());
10066   }
10067   return getDerived().RebuildOMPAffinityClause(
10068       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
10069       ModifierRes.get(), Locators);
10070 }
10071 
10072 template <typename Derived>
10073 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
10074   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
10075                                             C->getBeginLoc(), C->getLParenLoc(),
10076                                             C->getEndLoc());
10077 }
10078 
10079 //===----------------------------------------------------------------------===//
10080 // Expression transformation
10081 //===----------------------------------------------------------------------===//
10082 template<typename Derived>
10083 ExprResult
10084 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
10085   return TransformExpr(E->getSubExpr());
10086 }
10087 
10088 template<typename Derived>
10089 ExprResult
10090 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
10091   if (!E->isTypeDependent())
10092     return E;
10093 
10094   return getDerived().RebuildPredefinedExpr(E->getLocation(),
10095                                             E->getIdentKind());
10096 }
10097 
10098 template<typename Derived>
10099 ExprResult
10100 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
10101   NestedNameSpecifierLoc QualifierLoc;
10102   if (E->getQualifierLoc()) {
10103     QualifierLoc
10104       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10105     if (!QualifierLoc)
10106       return ExprError();
10107   }
10108 
10109   ValueDecl *ND
10110     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10111                                                          E->getDecl()));
10112   if (!ND)
10113     return ExprError();
10114 
10115   NamedDecl *Found = ND;
10116   if (E->getFoundDecl() != E->getDecl()) {
10117     Found = cast_or_null<NamedDecl>(
10118         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10119     if (!Found)
10120       return ExprError();
10121   }
10122 
10123   DeclarationNameInfo NameInfo = E->getNameInfo();
10124   if (NameInfo.getName()) {
10125     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10126     if (!NameInfo.getName())
10127       return ExprError();
10128   }
10129 
10130   if (!getDerived().AlwaysRebuild() &&
10131       QualifierLoc == E->getQualifierLoc() &&
10132       ND == E->getDecl() &&
10133       Found == E->getFoundDecl() &&
10134       NameInfo.getName() == E->getDecl()->getDeclName() &&
10135       !E->hasExplicitTemplateArgs()) {
10136 
10137     // Mark it referenced in the new context regardless.
10138     // FIXME: this is a bit instantiation-specific.
10139     SemaRef.MarkDeclRefReferenced(E);
10140 
10141     return E;
10142   }
10143 
10144   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10145   if (E->hasExplicitTemplateArgs()) {
10146     TemplateArgs = &TransArgs;
10147     TransArgs.setLAngleLoc(E->getLAngleLoc());
10148     TransArgs.setRAngleLoc(E->getRAngleLoc());
10149     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10150                                                 E->getNumTemplateArgs(),
10151                                                 TransArgs))
10152       return ExprError();
10153   }
10154 
10155   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10156                                          Found, TemplateArgs);
10157 }
10158 
10159 template<typename Derived>
10160 ExprResult
10161 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10162   return E;
10163 }
10164 
10165 template <typename Derived>
10166 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10167     FixedPointLiteral *E) {
10168   return E;
10169 }
10170 
10171 template<typename Derived>
10172 ExprResult
10173 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10174   return E;
10175 }
10176 
10177 template<typename Derived>
10178 ExprResult
10179 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10180   return E;
10181 }
10182 
10183 template<typename Derived>
10184 ExprResult
10185 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10186   return E;
10187 }
10188 
10189 template<typename Derived>
10190 ExprResult
10191 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10192   return E;
10193 }
10194 
10195 template<typename Derived>
10196 ExprResult
10197 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10198   if (FunctionDecl *FD = E->getDirectCallee())
10199     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10200   return SemaRef.MaybeBindToTemporary(E);
10201 }
10202 
10203 template<typename Derived>
10204 ExprResult
10205 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10206   ExprResult ControllingExpr =
10207     getDerived().TransformExpr(E->getControllingExpr());
10208   if (ControllingExpr.isInvalid())
10209     return ExprError();
10210 
10211   SmallVector<Expr *, 4> AssocExprs;
10212   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10213   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10214     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10215     if (TSI) {
10216       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10217       if (!AssocType)
10218         return ExprError();
10219       AssocTypes.push_back(AssocType);
10220     } else {
10221       AssocTypes.push_back(nullptr);
10222     }
10223 
10224     ExprResult AssocExpr =
10225         getDerived().TransformExpr(Assoc.getAssociationExpr());
10226     if (AssocExpr.isInvalid())
10227       return ExprError();
10228     AssocExprs.push_back(AssocExpr.get());
10229   }
10230 
10231   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10232                                                   E->getDefaultLoc(),
10233                                                   E->getRParenLoc(),
10234                                                   ControllingExpr.get(),
10235                                                   AssocTypes,
10236                                                   AssocExprs);
10237 }
10238 
10239 template<typename Derived>
10240 ExprResult
10241 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10242   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10243   if (SubExpr.isInvalid())
10244     return ExprError();
10245 
10246   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10247     return E;
10248 
10249   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10250                                        E->getRParen());
10251 }
10252 
10253 /// The operand of a unary address-of operator has special rules: it's
10254 /// allowed to refer to a non-static member of a class even if there's no 'this'
10255 /// object available.
10256 template<typename Derived>
10257 ExprResult
10258 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10259   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10260     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10261   else
10262     return getDerived().TransformExpr(E);
10263 }
10264 
10265 template<typename Derived>
10266 ExprResult
10267 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10268   ExprResult SubExpr;
10269   if (E->getOpcode() == UO_AddrOf)
10270     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10271   else
10272     SubExpr = TransformExpr(E->getSubExpr());
10273   if (SubExpr.isInvalid())
10274     return ExprError();
10275 
10276   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10277     return E;
10278 
10279   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10280                                            E->getOpcode(),
10281                                            SubExpr.get());
10282 }
10283 
10284 template<typename Derived>
10285 ExprResult
10286 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10287   // Transform the type.
10288   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10289   if (!Type)
10290     return ExprError();
10291 
10292   // Transform all of the components into components similar to what the
10293   // parser uses.
10294   // FIXME: It would be slightly more efficient in the non-dependent case to
10295   // just map FieldDecls, rather than requiring the rebuilder to look for
10296   // the fields again. However, __builtin_offsetof is rare enough in
10297   // template code that we don't care.
10298   bool ExprChanged = false;
10299   typedef Sema::OffsetOfComponent Component;
10300   SmallVector<Component, 4> Components;
10301   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10302     const OffsetOfNode &ON = E->getComponent(I);
10303     Component Comp;
10304     Comp.isBrackets = true;
10305     Comp.LocStart = ON.getSourceRange().getBegin();
10306     Comp.LocEnd = ON.getSourceRange().getEnd();
10307     switch (ON.getKind()) {
10308     case OffsetOfNode::Array: {
10309       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10310       ExprResult Index = getDerived().TransformExpr(FromIndex);
10311       if (Index.isInvalid())
10312         return ExprError();
10313 
10314       ExprChanged = ExprChanged || Index.get() != FromIndex;
10315       Comp.isBrackets = true;
10316       Comp.U.E = Index.get();
10317       break;
10318     }
10319 
10320     case OffsetOfNode::Field:
10321     case OffsetOfNode::Identifier:
10322       Comp.isBrackets = false;
10323       Comp.U.IdentInfo = ON.getFieldName();
10324       if (!Comp.U.IdentInfo)
10325         continue;
10326 
10327       break;
10328 
10329     case OffsetOfNode::Base:
10330       // Will be recomputed during the rebuild.
10331       continue;
10332     }
10333 
10334     Components.push_back(Comp);
10335   }
10336 
10337   // If nothing changed, retain the existing expression.
10338   if (!getDerived().AlwaysRebuild() &&
10339       Type == E->getTypeSourceInfo() &&
10340       !ExprChanged)
10341     return E;
10342 
10343   // Build a new offsetof expression.
10344   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10345                                           Components, E->getRParenLoc());
10346 }
10347 
10348 template<typename Derived>
10349 ExprResult
10350 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10351   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10352          "opaque value expression requires transformation");
10353   return E;
10354 }
10355 
10356 template<typename Derived>
10357 ExprResult
10358 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10359   return E;
10360 }
10361 
10362 template <typename Derived>
10363 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10364   llvm::SmallVector<Expr *, 8> Children;
10365   bool Changed = false;
10366   for (Expr *C : E->subExpressions()) {
10367     ExprResult NewC = getDerived().TransformExpr(C);
10368     if (NewC.isInvalid())
10369       return ExprError();
10370     Children.push_back(NewC.get());
10371 
10372     Changed |= NewC.get() != C;
10373   }
10374   if (!getDerived().AlwaysRebuild() && !Changed)
10375     return E;
10376   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10377                                           Children, E->getType());
10378 }
10379 
10380 template<typename Derived>
10381 ExprResult
10382 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10383   // Rebuild the syntactic form.  The original syntactic form has
10384   // opaque-value expressions in it, so strip those away and rebuild
10385   // the result.  This is a really awful way of doing this, but the
10386   // better solution (rebuilding the semantic expressions and
10387   // rebinding OVEs as necessary) doesn't work; we'd need
10388   // TreeTransform to not strip away implicit conversions.
10389   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10390   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10391   if (result.isInvalid()) return ExprError();
10392 
10393   // If that gives us a pseudo-object result back, the pseudo-object
10394   // expression must have been an lvalue-to-rvalue conversion which we
10395   // should reapply.
10396   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10397     result = SemaRef.checkPseudoObjectRValue(result.get());
10398 
10399   return result;
10400 }
10401 
10402 template<typename Derived>
10403 ExprResult
10404 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10405                                                 UnaryExprOrTypeTraitExpr *E) {
10406   if (E->isArgumentType()) {
10407     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10408 
10409     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10410     if (!NewT)
10411       return ExprError();
10412 
10413     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10414       return E;
10415 
10416     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10417                                                     E->getKind(),
10418                                                     E->getSourceRange());
10419   }
10420 
10421   // C++0x [expr.sizeof]p1:
10422   //   The operand is either an expression, which is an unevaluated operand
10423   //   [...]
10424   EnterExpressionEvaluationContext Unevaluated(
10425       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10426       Sema::ReuseLambdaContextDecl);
10427 
10428   // Try to recover if we have something like sizeof(T::X) where X is a type.
10429   // Notably, there must be *exactly* one set of parens if X is a type.
10430   TypeSourceInfo *RecoveryTSI = nullptr;
10431   ExprResult SubExpr;
10432   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10433   if (auto *DRE =
10434           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10435     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10436         PE, DRE, false, &RecoveryTSI);
10437   else
10438     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10439 
10440   if (RecoveryTSI) {
10441     return getDerived().RebuildUnaryExprOrTypeTrait(
10442         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10443   } else if (SubExpr.isInvalid())
10444     return ExprError();
10445 
10446   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10447     return E;
10448 
10449   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10450                                                   E->getOperatorLoc(),
10451                                                   E->getKind(),
10452                                                   E->getSourceRange());
10453 }
10454 
10455 template<typename Derived>
10456 ExprResult
10457 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10458   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10459   if (LHS.isInvalid())
10460     return ExprError();
10461 
10462   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10463   if (RHS.isInvalid())
10464     return ExprError();
10465 
10466 
10467   if (!getDerived().AlwaysRebuild() &&
10468       LHS.get() == E->getLHS() &&
10469       RHS.get() == E->getRHS())
10470     return E;
10471 
10472   return getDerived().RebuildArraySubscriptExpr(
10473       LHS.get(),
10474       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10475 }
10476 
10477 template <typename Derived>
10478 ExprResult
10479 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10480   ExprResult Base = getDerived().TransformExpr(E->getBase());
10481   if (Base.isInvalid())
10482     return ExprError();
10483 
10484   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10485   if (RowIdx.isInvalid())
10486     return ExprError();
10487 
10488   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10489   if (ColumnIdx.isInvalid())
10490     return ExprError();
10491 
10492   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10493       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10494     return E;
10495 
10496   return getDerived().RebuildMatrixSubscriptExpr(
10497       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10498 }
10499 
10500 template <typename Derived>
10501 ExprResult
10502 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10503   ExprResult Base = getDerived().TransformExpr(E->getBase());
10504   if (Base.isInvalid())
10505     return ExprError();
10506 
10507   ExprResult LowerBound;
10508   if (E->getLowerBound()) {
10509     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10510     if (LowerBound.isInvalid())
10511       return ExprError();
10512   }
10513 
10514   ExprResult Length;
10515   if (E->getLength()) {
10516     Length = getDerived().TransformExpr(E->getLength());
10517     if (Length.isInvalid())
10518       return ExprError();
10519   }
10520 
10521   ExprResult Stride;
10522   if (Expr *Str = E->getStride()) {
10523     Stride = getDerived().TransformExpr(Str);
10524     if (Stride.isInvalid())
10525       return ExprError();
10526   }
10527 
10528   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10529       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10530     return E;
10531 
10532   return getDerived().RebuildOMPArraySectionExpr(
10533       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10534       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10535       E->getRBracketLoc());
10536 }
10537 
10538 template <typename Derived>
10539 ExprResult
10540 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10541   ExprResult Base = getDerived().TransformExpr(E->getBase());
10542   if (Base.isInvalid())
10543     return ExprError();
10544 
10545   SmallVector<Expr *, 4> Dims;
10546   bool ErrorFound = false;
10547   for (Expr *Dim : E->getDimensions()) {
10548     ExprResult DimRes = getDerived().TransformExpr(Dim);
10549     if (DimRes.isInvalid()) {
10550       ErrorFound = true;
10551       continue;
10552     }
10553     Dims.push_back(DimRes.get());
10554   }
10555 
10556   if (ErrorFound)
10557     return ExprError();
10558   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10559                                                  E->getRParenLoc(), Dims,
10560                                                  E->getBracketsRanges());
10561 }
10562 
10563 template <typename Derived>
10564 ExprResult
10565 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10566   unsigned NumIterators = E->numOfIterators();
10567   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10568 
10569   bool ErrorFound = false;
10570   bool NeedToRebuild = getDerived().AlwaysRebuild();
10571   for (unsigned I = 0; I < NumIterators; ++I) {
10572     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10573     Data[I].DeclIdent = D->getIdentifier();
10574     Data[I].DeclIdentLoc = D->getLocation();
10575     if (D->getLocation() == D->getBeginLoc()) {
10576       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10577              "Implicit type must be int.");
10578     } else {
10579       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10580       QualType DeclTy = getDerived().TransformType(D->getType());
10581       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10582     }
10583     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10584     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10585     ExprResult End = getDerived().TransformExpr(Range.End);
10586     ExprResult Step = getDerived().TransformExpr(Range.Step);
10587     ErrorFound = ErrorFound ||
10588                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10589                                                !Data[I].Type.get().isNull())) ||
10590                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10591     if (ErrorFound)
10592       continue;
10593     Data[I].Range.Begin = Begin.get();
10594     Data[I].Range.End = End.get();
10595     Data[I].Range.Step = Step.get();
10596     Data[I].AssignLoc = E->getAssignLoc(I);
10597     Data[I].ColonLoc = E->getColonLoc(I);
10598     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10599     NeedToRebuild =
10600         NeedToRebuild ||
10601         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10602                                        D->getType().getTypePtrOrNull()) ||
10603         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10604         Range.Step != Data[I].Range.Step;
10605   }
10606   if (ErrorFound)
10607     return ExprError();
10608   if (!NeedToRebuild)
10609     return E;
10610 
10611   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10612       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10613   if (!Res.isUsable())
10614     return Res;
10615   auto *IE = cast<OMPIteratorExpr>(Res.get());
10616   for (unsigned I = 0; I < NumIterators; ++I)
10617     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10618                                       IE->getIteratorDecl(I));
10619   return Res;
10620 }
10621 
10622 template<typename Derived>
10623 ExprResult
10624 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10625   // Transform the callee.
10626   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10627   if (Callee.isInvalid())
10628     return ExprError();
10629 
10630   // Transform arguments.
10631   bool ArgChanged = false;
10632   SmallVector<Expr*, 8> Args;
10633   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10634                                   &ArgChanged))
10635     return ExprError();
10636 
10637   if (!getDerived().AlwaysRebuild() &&
10638       Callee.get() == E->getCallee() &&
10639       !ArgChanged)
10640     return SemaRef.MaybeBindToTemporary(E);
10641 
10642   // FIXME: Wrong source location information for the '('.
10643   SourceLocation FakeLParenLoc
10644     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10645 
10646   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10647   if (E->hasStoredFPFeatures()) {
10648     FPOptionsOverride NewOverrides = E->getFPFeatures();
10649     getSema().CurFPFeatures =
10650         NewOverrides.applyOverrides(getSema().getLangOpts());
10651     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10652   }
10653 
10654   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10655                                       Args,
10656                                       E->getRParenLoc());
10657 }
10658 
10659 template<typename Derived>
10660 ExprResult
10661 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10662   ExprResult Base = getDerived().TransformExpr(E->getBase());
10663   if (Base.isInvalid())
10664     return ExprError();
10665 
10666   NestedNameSpecifierLoc QualifierLoc;
10667   if (E->hasQualifier()) {
10668     QualifierLoc
10669       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10670 
10671     if (!QualifierLoc)
10672       return ExprError();
10673   }
10674   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10675 
10676   ValueDecl *Member
10677     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10678                                                          E->getMemberDecl()));
10679   if (!Member)
10680     return ExprError();
10681 
10682   NamedDecl *FoundDecl = E->getFoundDecl();
10683   if (FoundDecl == E->getMemberDecl()) {
10684     FoundDecl = Member;
10685   } else {
10686     FoundDecl = cast_or_null<NamedDecl>(
10687                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10688     if (!FoundDecl)
10689       return ExprError();
10690   }
10691 
10692   if (!getDerived().AlwaysRebuild() &&
10693       Base.get() == E->getBase() &&
10694       QualifierLoc == E->getQualifierLoc() &&
10695       Member == E->getMemberDecl() &&
10696       FoundDecl == E->getFoundDecl() &&
10697       !E->hasExplicitTemplateArgs()) {
10698 
10699     // Mark it referenced in the new context regardless.
10700     // FIXME: this is a bit instantiation-specific.
10701     SemaRef.MarkMemberReferenced(E);
10702 
10703     return E;
10704   }
10705 
10706   TemplateArgumentListInfo TransArgs;
10707   if (E->hasExplicitTemplateArgs()) {
10708     TransArgs.setLAngleLoc(E->getLAngleLoc());
10709     TransArgs.setRAngleLoc(E->getRAngleLoc());
10710     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10711                                                 E->getNumTemplateArgs(),
10712                                                 TransArgs))
10713       return ExprError();
10714   }
10715 
10716   // FIXME: Bogus source location for the operator
10717   SourceLocation FakeOperatorLoc =
10718       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10719 
10720   // FIXME: to do this check properly, we will need to preserve the
10721   // first-qualifier-in-scope here, just in case we had a dependent
10722   // base (and therefore couldn't do the check) and a
10723   // nested-name-qualifier (and therefore could do the lookup).
10724   NamedDecl *FirstQualifierInScope = nullptr;
10725   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10726   if (MemberNameInfo.getName()) {
10727     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10728     if (!MemberNameInfo.getName())
10729       return ExprError();
10730   }
10731 
10732   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10733                                         E->isArrow(),
10734                                         QualifierLoc,
10735                                         TemplateKWLoc,
10736                                         MemberNameInfo,
10737                                         Member,
10738                                         FoundDecl,
10739                                         (E->hasExplicitTemplateArgs()
10740                                            ? &TransArgs : nullptr),
10741                                         FirstQualifierInScope);
10742 }
10743 
10744 template<typename Derived>
10745 ExprResult
10746 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10747   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10748   if (LHS.isInvalid())
10749     return ExprError();
10750 
10751   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10752   if (RHS.isInvalid())
10753     return ExprError();
10754 
10755   if (!getDerived().AlwaysRebuild() &&
10756       LHS.get() == E->getLHS() &&
10757       RHS.get() == E->getRHS())
10758     return E;
10759 
10760   if (E->isCompoundAssignmentOp())
10761     // FPFeatures has already been established from trailing storage
10762     return getDerived().RebuildBinaryOperator(
10763         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10764   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10765   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10766   getSema().CurFPFeatures =
10767       NewOverrides.applyOverrides(getSema().getLangOpts());
10768   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10769   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10770                                             LHS.get(), RHS.get());
10771 }
10772 
10773 template <typename Derived>
10774 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10775     CXXRewrittenBinaryOperator *E) {
10776   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10777 
10778   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10779   if (LHS.isInvalid())
10780     return ExprError();
10781 
10782   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10783   if (RHS.isInvalid())
10784     return ExprError();
10785 
10786   if (!getDerived().AlwaysRebuild() &&
10787       LHS.get() == Decomp.LHS &&
10788       RHS.get() == Decomp.RHS)
10789     return E;
10790 
10791   // Extract the already-resolved callee declarations so that we can restrict
10792   // ourselves to using them as the unqualified lookup results when rebuilding.
10793   UnresolvedSet<2> UnqualLookups;
10794   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10795                             const_cast<Expr *>(Decomp.InnerBinOp)};
10796   for (Expr *PossibleBinOp : PossibleBinOps) {
10797     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10798     if (!Op)
10799       continue;
10800     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10801     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10802       continue;
10803 
10804     // Transform the callee in case we built a call to a local extern
10805     // declaration.
10806     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10807         E->getOperatorLoc(), Callee->getFoundDecl()));
10808     if (!Found)
10809       return ExprError();
10810     UnqualLookups.addDecl(Found);
10811   }
10812 
10813   return getDerived().RebuildCXXRewrittenBinaryOperator(
10814       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10815 }
10816 
10817 template<typename Derived>
10818 ExprResult
10819 TreeTransform<Derived>::TransformCompoundAssignOperator(
10820                                                       CompoundAssignOperator *E) {
10821   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10822   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10823   getSema().CurFPFeatures =
10824       NewOverrides.applyOverrides(getSema().getLangOpts());
10825   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10826   return getDerived().TransformBinaryOperator(E);
10827 }
10828 
10829 template<typename Derived>
10830 ExprResult TreeTransform<Derived>::
10831 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10832   // Just rebuild the common and RHS expressions and see whether we
10833   // get any changes.
10834 
10835   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10836   if (commonExpr.isInvalid())
10837     return ExprError();
10838 
10839   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10840   if (rhs.isInvalid())
10841     return ExprError();
10842 
10843   if (!getDerived().AlwaysRebuild() &&
10844       commonExpr.get() == e->getCommon() &&
10845       rhs.get() == e->getFalseExpr())
10846     return e;
10847 
10848   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10849                                                  e->getQuestionLoc(),
10850                                                  nullptr,
10851                                                  e->getColonLoc(),
10852                                                  rhs.get());
10853 }
10854 
10855 template<typename Derived>
10856 ExprResult
10857 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10858   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10859   if (Cond.isInvalid())
10860     return ExprError();
10861 
10862   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10863   if (LHS.isInvalid())
10864     return ExprError();
10865 
10866   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10867   if (RHS.isInvalid())
10868     return ExprError();
10869 
10870   if (!getDerived().AlwaysRebuild() &&
10871       Cond.get() == E->getCond() &&
10872       LHS.get() == E->getLHS() &&
10873       RHS.get() == E->getRHS())
10874     return E;
10875 
10876   return getDerived().RebuildConditionalOperator(Cond.get(),
10877                                                  E->getQuestionLoc(),
10878                                                  LHS.get(),
10879                                                  E->getColonLoc(),
10880                                                  RHS.get());
10881 }
10882 
10883 template<typename Derived>
10884 ExprResult
10885 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10886   // Implicit casts are eliminated during transformation, since they
10887   // will be recomputed by semantic analysis after transformation.
10888   return getDerived().TransformExpr(E->getSubExprAsWritten());
10889 }
10890 
10891 template<typename Derived>
10892 ExprResult
10893 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10894   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10895   if (!Type)
10896     return ExprError();
10897 
10898   ExprResult SubExpr
10899     = getDerived().TransformExpr(E->getSubExprAsWritten());
10900   if (SubExpr.isInvalid())
10901     return ExprError();
10902 
10903   if (!getDerived().AlwaysRebuild() &&
10904       Type == E->getTypeInfoAsWritten() &&
10905       SubExpr.get() == E->getSubExpr())
10906     return E;
10907 
10908   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10909                                             Type,
10910                                             E->getRParenLoc(),
10911                                             SubExpr.get());
10912 }
10913 
10914 template<typename Derived>
10915 ExprResult
10916 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10917   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10918   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10919   if (!NewT)
10920     return ExprError();
10921 
10922   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10923   if (Init.isInvalid())
10924     return ExprError();
10925 
10926   if (!getDerived().AlwaysRebuild() &&
10927       OldT == NewT &&
10928       Init.get() == E->getInitializer())
10929     return SemaRef.MaybeBindToTemporary(E);
10930 
10931   // Note: the expression type doesn't necessarily match the
10932   // type-as-written, but that's okay, because it should always be
10933   // derivable from the initializer.
10934 
10935   return getDerived().RebuildCompoundLiteralExpr(
10936       E->getLParenLoc(), NewT,
10937       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10938 }
10939 
10940 template<typename Derived>
10941 ExprResult
10942 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10943   ExprResult Base = getDerived().TransformExpr(E->getBase());
10944   if (Base.isInvalid())
10945     return ExprError();
10946 
10947   if (!getDerived().AlwaysRebuild() &&
10948       Base.get() == E->getBase())
10949     return E;
10950 
10951   // FIXME: Bad source location
10952   SourceLocation FakeOperatorLoc =
10953       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10954   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10955                                                   E->getAccessorLoc(),
10956                                                   E->getAccessor());
10957 }
10958 
10959 template<typename Derived>
10960 ExprResult
10961 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10962   if (InitListExpr *Syntactic = E->getSyntacticForm())
10963     E = Syntactic;
10964 
10965   bool InitChanged = false;
10966 
10967   EnterExpressionEvaluationContext Context(
10968       getSema(), EnterExpressionEvaluationContext::InitList);
10969 
10970   SmallVector<Expr*, 4> Inits;
10971   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10972                                   Inits, &InitChanged))
10973     return ExprError();
10974 
10975   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10976     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10977     // in some cases. We can't reuse it in general, because the syntactic and
10978     // semantic forms are linked, and we can't know that semantic form will
10979     // match even if the syntactic form does.
10980   }
10981 
10982   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10983                                       E->getRBraceLoc());
10984 }
10985 
10986 template<typename Derived>
10987 ExprResult
10988 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10989   Designation Desig;
10990 
10991   // transform the initializer value
10992   ExprResult Init = getDerived().TransformExpr(E->getInit());
10993   if (Init.isInvalid())
10994     return ExprError();
10995 
10996   // transform the designators.
10997   SmallVector<Expr*, 4> ArrayExprs;
10998   bool ExprChanged = false;
10999   for (const DesignatedInitExpr::Designator &D : E->designators()) {
11000     if (D.isFieldDesignator()) {
11001       Desig.AddDesignator(Designator::getField(D.getFieldName(),
11002                                                D.getDotLoc(),
11003                                                D.getFieldLoc()));
11004       if (D.getField()) {
11005         FieldDecl *Field = cast_or_null<FieldDecl>(
11006             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
11007         if (Field != D.getField())
11008           // Rebuild the expression when the transformed FieldDecl is
11009           // different to the already assigned FieldDecl.
11010           ExprChanged = true;
11011       } else {
11012         // Ensure that the designator expression is rebuilt when there isn't
11013         // a resolved FieldDecl in the designator as we don't want to assign
11014         // a FieldDecl to a pattern designator that will be instantiated again.
11015         ExprChanged = true;
11016       }
11017       continue;
11018     }
11019 
11020     if (D.isArrayDesignator()) {
11021       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
11022       if (Index.isInvalid())
11023         return ExprError();
11024 
11025       Desig.AddDesignator(
11026           Designator::getArray(Index.get(), D.getLBracketLoc()));
11027 
11028       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
11029       ArrayExprs.push_back(Index.get());
11030       continue;
11031     }
11032 
11033     assert(D.isArrayRangeDesignator() && "New kind of designator?");
11034     ExprResult Start
11035       = getDerived().TransformExpr(E->getArrayRangeStart(D));
11036     if (Start.isInvalid())
11037       return ExprError();
11038 
11039     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
11040     if (End.isInvalid())
11041       return ExprError();
11042 
11043     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
11044                                                   End.get(),
11045                                                   D.getLBracketLoc(),
11046                                                   D.getEllipsisLoc()));
11047 
11048     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
11049                   End.get() != E->getArrayRangeEnd(D);
11050 
11051     ArrayExprs.push_back(Start.get());
11052     ArrayExprs.push_back(End.get());
11053   }
11054 
11055   if (!getDerived().AlwaysRebuild() &&
11056       Init.get() == E->getInit() &&
11057       !ExprChanged)
11058     return E;
11059 
11060   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
11061                                                 E->getEqualOrColonLoc(),
11062                                                 E->usesGNUSyntax(), Init.get());
11063 }
11064 
11065 // Seems that if TransformInitListExpr() only works on the syntactic form of an
11066 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
11067 template<typename Derived>
11068 ExprResult
11069 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
11070     DesignatedInitUpdateExpr *E) {
11071   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
11072                    "initializer");
11073   return ExprError();
11074 }
11075 
11076 template<typename Derived>
11077 ExprResult
11078 TreeTransform<Derived>::TransformNoInitExpr(
11079     NoInitExpr *E) {
11080   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
11081   return ExprError();
11082 }
11083 
11084 template<typename Derived>
11085 ExprResult
11086 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
11087   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
11088   return ExprError();
11089 }
11090 
11091 template<typename Derived>
11092 ExprResult
11093 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
11094   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
11095   return ExprError();
11096 }
11097 
11098 template<typename Derived>
11099 ExprResult
11100 TreeTransform<Derived>::TransformImplicitValueInitExpr(
11101                                                      ImplicitValueInitExpr *E) {
11102   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
11103 
11104   // FIXME: Will we ever have proper type location here? Will we actually
11105   // need to transform the type?
11106   QualType T = getDerived().TransformType(E->getType());
11107   if (T.isNull())
11108     return ExprError();
11109 
11110   if (!getDerived().AlwaysRebuild() &&
11111       T == E->getType())
11112     return E;
11113 
11114   return getDerived().RebuildImplicitValueInitExpr(T);
11115 }
11116 
11117 template<typename Derived>
11118 ExprResult
11119 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11120   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11121   if (!TInfo)
11122     return ExprError();
11123 
11124   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11125   if (SubExpr.isInvalid())
11126     return ExprError();
11127 
11128   if (!getDerived().AlwaysRebuild() &&
11129       TInfo == E->getWrittenTypeInfo() &&
11130       SubExpr.get() == E->getSubExpr())
11131     return E;
11132 
11133   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11134                                        TInfo, E->getRParenLoc());
11135 }
11136 
11137 template<typename Derived>
11138 ExprResult
11139 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11140   bool ArgumentChanged = false;
11141   SmallVector<Expr*, 4> Inits;
11142   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11143                      &ArgumentChanged))
11144     return ExprError();
11145 
11146   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11147                                            Inits,
11148                                            E->getRParenLoc());
11149 }
11150 
11151 /// Transform an address-of-label expression.
11152 ///
11153 /// By default, the transformation of an address-of-label expression always
11154 /// rebuilds the expression, so that the label identifier can be resolved to
11155 /// the corresponding label statement by semantic analysis.
11156 template<typename Derived>
11157 ExprResult
11158 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11159   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11160                                         E->getLabel());
11161   if (!LD)
11162     return ExprError();
11163 
11164   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11165                                            cast<LabelDecl>(LD));
11166 }
11167 
11168 template<typename Derived>
11169 ExprResult
11170 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11171   SemaRef.ActOnStartStmtExpr();
11172   StmtResult SubStmt
11173     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11174   if (SubStmt.isInvalid()) {
11175     SemaRef.ActOnStmtExprError();
11176     return ExprError();
11177   }
11178 
11179   unsigned OldDepth = E->getTemplateDepth();
11180   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11181 
11182   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11183       SubStmt.get() == E->getSubStmt()) {
11184     // Calling this an 'error' is unintuitive, but it does the right thing.
11185     SemaRef.ActOnStmtExprError();
11186     return SemaRef.MaybeBindToTemporary(E);
11187   }
11188 
11189   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11190                                       E->getRParenLoc(), NewDepth);
11191 }
11192 
11193 template<typename Derived>
11194 ExprResult
11195 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11196   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11197   if (Cond.isInvalid())
11198     return ExprError();
11199 
11200   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11201   if (LHS.isInvalid())
11202     return ExprError();
11203 
11204   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11205   if (RHS.isInvalid())
11206     return ExprError();
11207 
11208   if (!getDerived().AlwaysRebuild() &&
11209       Cond.get() == E->getCond() &&
11210       LHS.get() == E->getLHS() &&
11211       RHS.get() == E->getRHS())
11212     return E;
11213 
11214   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11215                                         Cond.get(), LHS.get(), RHS.get(),
11216                                         E->getRParenLoc());
11217 }
11218 
11219 template<typename Derived>
11220 ExprResult
11221 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11222   return E;
11223 }
11224 
11225 template<typename Derived>
11226 ExprResult
11227 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11228   switch (E->getOperator()) {
11229   case OO_New:
11230   case OO_Delete:
11231   case OO_Array_New:
11232   case OO_Array_Delete:
11233     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11234 
11235   case OO_Call: {
11236     // This is a call to an object's operator().
11237     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11238 
11239     // Transform the object itself.
11240     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11241     if (Object.isInvalid())
11242       return ExprError();
11243 
11244     // FIXME: Poor location information
11245     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11246         static_cast<Expr *>(Object.get())->getEndLoc());
11247 
11248     // Transform the call arguments.
11249     SmallVector<Expr*, 8> Args;
11250     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11251                                     Args))
11252       return ExprError();
11253 
11254     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11255                                         E->getEndLoc());
11256   }
11257 
11258 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11259   case OO_##Name:
11260 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11261 #include "clang/Basic/OperatorKinds.def"
11262   case OO_Subscript:
11263     // Handled below.
11264     break;
11265 
11266   case OO_Conditional:
11267     llvm_unreachable("conditional operator is not actually overloadable");
11268 
11269   case OO_None:
11270   case NUM_OVERLOADED_OPERATORS:
11271     llvm_unreachable("not an overloaded operator?");
11272   }
11273 
11274   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11275   if (Callee.isInvalid())
11276     return ExprError();
11277 
11278   ExprResult First;
11279   if (E->getOperator() == OO_Amp)
11280     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11281   else
11282     First = getDerived().TransformExpr(E->getArg(0));
11283   if (First.isInvalid())
11284     return ExprError();
11285 
11286   ExprResult Second;
11287   if (E->getNumArgs() == 2) {
11288     Second = getDerived().TransformExpr(E->getArg(1));
11289     if (Second.isInvalid())
11290       return ExprError();
11291   }
11292 
11293   if (!getDerived().AlwaysRebuild() &&
11294       Callee.get() == E->getCallee() &&
11295       First.get() == E->getArg(0) &&
11296       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11297     return SemaRef.MaybeBindToTemporary(E);
11298 
11299   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11300   FPOptionsOverride NewOverrides(E->getFPFeatures());
11301   getSema().CurFPFeatures =
11302       NewOverrides.applyOverrides(getSema().getLangOpts());
11303   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11304 
11305   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11306                                                  E->getOperatorLoc(),
11307                                                  Callee.get(),
11308                                                  First.get(),
11309                                                  Second.get());
11310 }
11311 
11312 template<typename Derived>
11313 ExprResult
11314 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11315   return getDerived().TransformCallExpr(E);
11316 }
11317 
11318 template <typename Derived>
11319 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11320   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11321                          getSema().CurContext != E->getParentContext();
11322 
11323   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11324     return E;
11325 
11326   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11327                                            E->getEndLoc(),
11328                                            getSema().CurContext);
11329 }
11330 
11331 template<typename Derived>
11332 ExprResult
11333 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11334   // Transform the callee.
11335   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11336   if (Callee.isInvalid())
11337     return ExprError();
11338 
11339   // Transform exec config.
11340   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11341   if (EC.isInvalid())
11342     return ExprError();
11343 
11344   // Transform arguments.
11345   bool ArgChanged = false;
11346   SmallVector<Expr*, 8> Args;
11347   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11348                                   &ArgChanged))
11349     return ExprError();
11350 
11351   if (!getDerived().AlwaysRebuild() &&
11352       Callee.get() == E->getCallee() &&
11353       !ArgChanged)
11354     return SemaRef.MaybeBindToTemporary(E);
11355 
11356   // FIXME: Wrong source location information for the '('.
11357   SourceLocation FakeLParenLoc
11358     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11359   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11360                                       Args,
11361                                       E->getRParenLoc(), EC.get());
11362 }
11363 
11364 template<typename Derived>
11365 ExprResult
11366 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11367   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11368   if (!Type)
11369     return ExprError();
11370 
11371   ExprResult SubExpr
11372     = getDerived().TransformExpr(E->getSubExprAsWritten());
11373   if (SubExpr.isInvalid())
11374     return ExprError();
11375 
11376   if (!getDerived().AlwaysRebuild() &&
11377       Type == E->getTypeInfoAsWritten() &&
11378       SubExpr.get() == E->getSubExpr())
11379     return E;
11380   return getDerived().RebuildCXXNamedCastExpr(
11381       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11382       Type, E->getAngleBrackets().getEnd(),
11383       // FIXME. this should be '(' location
11384       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11385 }
11386 
11387 template<typename Derived>
11388 ExprResult
11389 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11390   TypeSourceInfo *TSI =
11391       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11392   if (!TSI)
11393     return ExprError();
11394 
11395   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11396   if (Sub.isInvalid())
11397     return ExprError();
11398 
11399   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11400                                                 Sub.get(), BCE->getEndLoc());
11401 }
11402 
11403 template<typename Derived>
11404 ExprResult
11405 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11406   return getDerived().TransformCXXNamedCastExpr(E);
11407 }
11408 
11409 template<typename Derived>
11410 ExprResult
11411 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11412   return getDerived().TransformCXXNamedCastExpr(E);
11413 }
11414 
11415 template<typename Derived>
11416 ExprResult
11417 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11418                                                       CXXReinterpretCastExpr *E) {
11419   return getDerived().TransformCXXNamedCastExpr(E);
11420 }
11421 
11422 template<typename Derived>
11423 ExprResult
11424 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11425   return getDerived().TransformCXXNamedCastExpr(E);
11426 }
11427 
11428 template<typename Derived>
11429 ExprResult
11430 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11431   return getDerived().TransformCXXNamedCastExpr(E);
11432 }
11433 
11434 template<typename Derived>
11435 ExprResult
11436 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11437                                                      CXXFunctionalCastExpr *E) {
11438   TypeSourceInfo *Type =
11439       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11440   if (!Type)
11441     return ExprError();
11442 
11443   ExprResult SubExpr
11444     = getDerived().TransformExpr(E->getSubExprAsWritten());
11445   if (SubExpr.isInvalid())
11446     return ExprError();
11447 
11448   if (!getDerived().AlwaysRebuild() &&
11449       Type == E->getTypeInfoAsWritten() &&
11450       SubExpr.get() == E->getSubExpr())
11451     return E;
11452 
11453   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11454                                                    E->getLParenLoc(),
11455                                                    SubExpr.get(),
11456                                                    E->getRParenLoc(),
11457                                                    E->isListInitialization());
11458 }
11459 
11460 template<typename Derived>
11461 ExprResult
11462 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11463   if (E->isTypeOperand()) {
11464     TypeSourceInfo *TInfo
11465       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11466     if (!TInfo)
11467       return ExprError();
11468 
11469     if (!getDerived().AlwaysRebuild() &&
11470         TInfo == E->getTypeOperandSourceInfo())
11471       return E;
11472 
11473     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11474                                              TInfo, E->getEndLoc());
11475   }
11476 
11477   // We don't know whether the subexpression is potentially evaluated until
11478   // after we perform semantic analysis.  We speculatively assume it is
11479   // unevaluated; it will get fixed later if the subexpression is in fact
11480   // potentially evaluated.
11481   EnterExpressionEvaluationContext Unevaluated(
11482       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11483       Sema::ReuseLambdaContextDecl);
11484 
11485   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11486   if (SubExpr.isInvalid())
11487     return ExprError();
11488 
11489   if (!getDerived().AlwaysRebuild() &&
11490       SubExpr.get() == E->getExprOperand())
11491     return E;
11492 
11493   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11494                                            SubExpr.get(), E->getEndLoc());
11495 }
11496 
11497 template<typename Derived>
11498 ExprResult
11499 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11500   if (E->isTypeOperand()) {
11501     TypeSourceInfo *TInfo
11502       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11503     if (!TInfo)
11504       return ExprError();
11505 
11506     if (!getDerived().AlwaysRebuild() &&
11507         TInfo == E->getTypeOperandSourceInfo())
11508       return E;
11509 
11510     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11511                                              TInfo, E->getEndLoc());
11512   }
11513 
11514   EnterExpressionEvaluationContext Unevaluated(
11515       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11516 
11517   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11518   if (SubExpr.isInvalid())
11519     return ExprError();
11520 
11521   if (!getDerived().AlwaysRebuild() &&
11522       SubExpr.get() == E->getExprOperand())
11523     return E;
11524 
11525   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11526                                            SubExpr.get(), E->getEndLoc());
11527 }
11528 
11529 template<typename Derived>
11530 ExprResult
11531 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11532   return E;
11533 }
11534 
11535 template<typename Derived>
11536 ExprResult
11537 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11538                                                      CXXNullPtrLiteralExpr *E) {
11539   return E;
11540 }
11541 
11542 template<typename Derived>
11543 ExprResult
11544 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11545   QualType T = getSema().getCurrentThisType();
11546 
11547   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11548     // Mark it referenced in the new context regardless.
11549     // FIXME: this is a bit instantiation-specific.
11550     getSema().MarkThisReferenced(E);
11551     return E;
11552   }
11553 
11554   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11555 }
11556 
11557 template<typename Derived>
11558 ExprResult
11559 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11560   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11561   if (SubExpr.isInvalid())
11562     return ExprError();
11563 
11564   if (!getDerived().AlwaysRebuild() &&
11565       SubExpr.get() == E->getSubExpr())
11566     return E;
11567 
11568   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11569                                           E->isThrownVariableInScope());
11570 }
11571 
11572 template<typename Derived>
11573 ExprResult
11574 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11575   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11576       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11577   if (!Param)
11578     return ExprError();
11579 
11580   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11581       E->getUsedContext() == SemaRef.CurContext)
11582     return E;
11583 
11584   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11585 }
11586 
11587 template<typename Derived>
11588 ExprResult
11589 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11590   FieldDecl *Field = cast_or_null<FieldDecl>(
11591       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11592   if (!Field)
11593     return ExprError();
11594 
11595   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11596       E->getUsedContext() == SemaRef.CurContext)
11597     return E;
11598 
11599   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11600 }
11601 
11602 template<typename Derived>
11603 ExprResult
11604 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11605                                                     CXXScalarValueInitExpr *E) {
11606   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11607   if (!T)
11608     return ExprError();
11609 
11610   if (!getDerived().AlwaysRebuild() &&
11611       T == E->getTypeSourceInfo())
11612     return E;
11613 
11614   return getDerived().RebuildCXXScalarValueInitExpr(T,
11615                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11616                                                     E->getRParenLoc());
11617 }
11618 
11619 template<typename Derived>
11620 ExprResult
11621 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11622   // Transform the type that we're allocating
11623   TypeSourceInfo *AllocTypeInfo =
11624       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11625   if (!AllocTypeInfo)
11626     return ExprError();
11627 
11628   // Transform the size of the array we're allocating (if any).
11629   Optional<Expr *> ArraySize;
11630   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11631     ExprResult NewArraySize;
11632     if (*OldArraySize) {
11633       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11634       if (NewArraySize.isInvalid())
11635         return ExprError();
11636     }
11637     ArraySize = NewArraySize.get();
11638   }
11639 
11640   // Transform the placement arguments (if any).
11641   bool ArgumentChanged = false;
11642   SmallVector<Expr*, 8> PlacementArgs;
11643   if (getDerived().TransformExprs(E->getPlacementArgs(),
11644                                   E->getNumPlacementArgs(), true,
11645                                   PlacementArgs, &ArgumentChanged))
11646     return ExprError();
11647 
11648   // Transform the initializer (if any).
11649   Expr *OldInit = E->getInitializer();
11650   ExprResult NewInit;
11651   if (OldInit)
11652     NewInit = getDerived().TransformInitializer(OldInit, true);
11653   if (NewInit.isInvalid())
11654     return ExprError();
11655 
11656   // Transform new operator and delete operator.
11657   FunctionDecl *OperatorNew = nullptr;
11658   if (E->getOperatorNew()) {
11659     OperatorNew = cast_or_null<FunctionDecl>(
11660         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11661     if (!OperatorNew)
11662       return ExprError();
11663   }
11664 
11665   FunctionDecl *OperatorDelete = nullptr;
11666   if (E->getOperatorDelete()) {
11667     OperatorDelete = cast_or_null<FunctionDecl>(
11668         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11669     if (!OperatorDelete)
11670       return ExprError();
11671   }
11672 
11673   if (!getDerived().AlwaysRebuild() &&
11674       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11675       ArraySize == E->getArraySize() &&
11676       NewInit.get() == OldInit &&
11677       OperatorNew == E->getOperatorNew() &&
11678       OperatorDelete == E->getOperatorDelete() &&
11679       !ArgumentChanged) {
11680     // Mark any declarations we need as referenced.
11681     // FIXME: instantiation-specific.
11682     if (OperatorNew)
11683       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11684     if (OperatorDelete)
11685       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11686 
11687     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11688       QualType ElementType
11689         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11690       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11691         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11692         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11693           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11694         }
11695       }
11696     }
11697 
11698     return E;
11699   }
11700 
11701   QualType AllocType = AllocTypeInfo->getType();
11702   if (!ArraySize) {
11703     // If no array size was specified, but the new expression was
11704     // instantiated with an array type (e.g., "new T" where T is
11705     // instantiated with "int[4]"), extract the outer bound from the
11706     // array type as our array size. We do this with constant and
11707     // dependently-sized array types.
11708     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11709     if (!ArrayT) {
11710       // Do nothing
11711     } else if (const ConstantArrayType *ConsArrayT
11712                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11713       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11714                                          SemaRef.Context.getSizeType(),
11715                                          /*FIXME:*/ E->getBeginLoc());
11716       AllocType = ConsArrayT->getElementType();
11717     } else if (const DependentSizedArrayType *DepArrayT
11718                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11719       if (DepArrayT->getSizeExpr()) {
11720         ArraySize = DepArrayT->getSizeExpr();
11721         AllocType = DepArrayT->getElementType();
11722       }
11723     }
11724   }
11725 
11726   return getDerived().RebuildCXXNewExpr(
11727       E->getBeginLoc(), E->isGlobalNew(),
11728       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11729       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11730       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11731 }
11732 
11733 template<typename Derived>
11734 ExprResult
11735 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11736   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11737   if (Operand.isInvalid())
11738     return ExprError();
11739 
11740   // Transform the delete operator, if known.
11741   FunctionDecl *OperatorDelete = nullptr;
11742   if (E->getOperatorDelete()) {
11743     OperatorDelete = cast_or_null<FunctionDecl>(
11744         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11745     if (!OperatorDelete)
11746       return ExprError();
11747   }
11748 
11749   if (!getDerived().AlwaysRebuild() &&
11750       Operand.get() == E->getArgument() &&
11751       OperatorDelete == E->getOperatorDelete()) {
11752     // Mark any declarations we need as referenced.
11753     // FIXME: instantiation-specific.
11754     if (OperatorDelete)
11755       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11756 
11757     if (!E->getArgument()->isTypeDependent()) {
11758       QualType Destroyed = SemaRef.Context.getBaseElementType(
11759                                                          E->getDestroyedType());
11760       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11761         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11762         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11763                                        SemaRef.LookupDestructor(Record));
11764       }
11765     }
11766 
11767     return E;
11768   }
11769 
11770   return getDerived().RebuildCXXDeleteExpr(
11771       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11772 }
11773 
11774 template<typename Derived>
11775 ExprResult
11776 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11777                                                      CXXPseudoDestructorExpr *E) {
11778   ExprResult Base = getDerived().TransformExpr(E->getBase());
11779   if (Base.isInvalid())
11780     return ExprError();
11781 
11782   ParsedType ObjectTypePtr;
11783   bool MayBePseudoDestructor = false;
11784   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11785                                               E->getOperatorLoc(),
11786                                         E->isArrow()? tok::arrow : tok::period,
11787                                               ObjectTypePtr,
11788                                               MayBePseudoDestructor);
11789   if (Base.isInvalid())
11790     return ExprError();
11791 
11792   QualType ObjectType = ObjectTypePtr.get();
11793   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11794   if (QualifierLoc) {
11795     QualifierLoc
11796       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11797     if (!QualifierLoc)
11798       return ExprError();
11799   }
11800   CXXScopeSpec SS;
11801   SS.Adopt(QualifierLoc);
11802 
11803   PseudoDestructorTypeStorage Destroyed;
11804   if (E->getDestroyedTypeInfo()) {
11805     TypeSourceInfo *DestroyedTypeInfo
11806       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11807                                                 ObjectType, nullptr, SS);
11808     if (!DestroyedTypeInfo)
11809       return ExprError();
11810     Destroyed = DestroyedTypeInfo;
11811   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11812     // We aren't likely to be able to resolve the identifier down to a type
11813     // now anyway, so just retain the identifier.
11814     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11815                                             E->getDestroyedTypeLoc());
11816   } else {
11817     // Look for a destructor known with the given name.
11818     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11819                                               *E->getDestroyedTypeIdentifier(),
11820                                                 E->getDestroyedTypeLoc(),
11821                                                 /*Scope=*/nullptr,
11822                                                 SS, ObjectTypePtr,
11823                                                 false);
11824     if (!T)
11825       return ExprError();
11826 
11827     Destroyed
11828       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11829                                                  E->getDestroyedTypeLoc());
11830   }
11831 
11832   TypeSourceInfo *ScopeTypeInfo = nullptr;
11833   if (E->getScopeTypeInfo()) {
11834     CXXScopeSpec EmptySS;
11835     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11836                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11837     if (!ScopeTypeInfo)
11838       return ExprError();
11839   }
11840 
11841   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11842                                                      E->getOperatorLoc(),
11843                                                      E->isArrow(),
11844                                                      SS,
11845                                                      ScopeTypeInfo,
11846                                                      E->getColonColonLoc(),
11847                                                      E->getTildeLoc(),
11848                                                      Destroyed);
11849 }
11850 
11851 template <typename Derived>
11852 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11853                                                         bool RequiresADL,
11854                                                         LookupResult &R) {
11855   // Transform all the decls.
11856   bool AllEmptyPacks = true;
11857   for (auto *OldD : Old->decls()) {
11858     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11859     if (!InstD) {
11860       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11861       // This can happen because of dependent hiding.
11862       if (isa<UsingShadowDecl>(OldD))
11863         continue;
11864       else {
11865         R.clear();
11866         return true;
11867       }
11868     }
11869 
11870     // Expand using pack declarations.
11871     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11872     ArrayRef<NamedDecl*> Decls = SingleDecl;
11873     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11874       Decls = UPD->expansions();
11875 
11876     // Expand using declarations.
11877     for (auto *D : Decls) {
11878       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11879         for (auto *SD : UD->shadows())
11880           R.addDecl(SD);
11881       } else {
11882         R.addDecl(D);
11883       }
11884     }
11885 
11886     AllEmptyPacks &= Decls.empty();
11887   };
11888 
11889   // C++ [temp.res]/8.4.2:
11890   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11891   //   a name in the template definition found a using-declaration, but the
11892   //   lookup in the corresponding scope in the instantiation odoes not find
11893   //   any declarations because the using-declaration was a pack expansion and
11894   //   the corresponding pack is empty
11895   if (AllEmptyPacks && !RequiresADL) {
11896     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11897         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11898     return true;
11899   }
11900 
11901   // Resolve a kind, but don't do any further analysis.  If it's
11902   // ambiguous, the callee needs to deal with it.
11903   R.resolveKind();
11904   return false;
11905 }
11906 
11907 template<typename Derived>
11908 ExprResult
11909 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11910                                                   UnresolvedLookupExpr *Old) {
11911   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11912                  Sema::LookupOrdinaryName);
11913 
11914   // Transform the declaration set.
11915   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11916     return ExprError();
11917 
11918   // Rebuild the nested-name qualifier, if present.
11919   CXXScopeSpec SS;
11920   if (Old->getQualifierLoc()) {
11921     NestedNameSpecifierLoc QualifierLoc
11922       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11923     if (!QualifierLoc)
11924       return ExprError();
11925 
11926     SS.Adopt(QualifierLoc);
11927   }
11928 
11929   if (Old->getNamingClass()) {
11930     CXXRecordDecl *NamingClass
11931       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11932                                                             Old->getNameLoc(),
11933                                                         Old->getNamingClass()));
11934     if (!NamingClass) {
11935       R.clear();
11936       return ExprError();
11937     }
11938 
11939     R.setNamingClass(NamingClass);
11940   }
11941 
11942   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11943 
11944   // If we have neither explicit template arguments, nor the template keyword,
11945   // it's a normal declaration name or member reference.
11946   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11947     NamedDecl *D = R.getAsSingle<NamedDecl>();
11948     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11949     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11950     // give a good diagnostic.
11951     if (D && D->isCXXInstanceMember()) {
11952       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11953                                                      /*TemplateArgs=*/nullptr,
11954                                                      /*Scope=*/nullptr);
11955     }
11956 
11957     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11958   }
11959 
11960   // If we have template arguments, rebuild them, then rebuild the
11961   // templateid expression.
11962   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11963   if (Old->hasExplicitTemplateArgs() &&
11964       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11965                                               Old->getNumTemplateArgs(),
11966                                               TransArgs)) {
11967     R.clear();
11968     return ExprError();
11969   }
11970 
11971   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11972                                             Old->requiresADL(), &TransArgs);
11973 }
11974 
11975 template<typename Derived>
11976 ExprResult
11977 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11978   bool ArgChanged = false;
11979   SmallVector<TypeSourceInfo *, 4> Args;
11980   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11981     TypeSourceInfo *From = E->getArg(I);
11982     TypeLoc FromTL = From->getTypeLoc();
11983     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11984       TypeLocBuilder TLB;
11985       TLB.reserve(FromTL.getFullDataSize());
11986       QualType To = getDerived().TransformType(TLB, FromTL);
11987       if (To.isNull())
11988         return ExprError();
11989 
11990       if (To == From->getType())
11991         Args.push_back(From);
11992       else {
11993         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11994         ArgChanged = true;
11995       }
11996       continue;
11997     }
11998 
11999     ArgChanged = true;
12000 
12001     // We have a pack expansion. Instantiate it.
12002     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
12003     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
12004     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12005     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
12006 
12007     // Determine whether the set of unexpanded parameter packs can and should
12008     // be expanded.
12009     bool Expand = true;
12010     bool RetainExpansion = false;
12011     Optional<unsigned> OrigNumExpansions =
12012         ExpansionTL.getTypePtr()->getNumExpansions();
12013     Optional<unsigned> NumExpansions = OrigNumExpansions;
12014     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
12015                                              PatternTL.getSourceRange(),
12016                                              Unexpanded,
12017                                              Expand, RetainExpansion,
12018                                              NumExpansions))
12019       return ExprError();
12020 
12021     if (!Expand) {
12022       // The transform has determined that we should perform a simple
12023       // transformation on the pack expansion, producing another pack
12024       // expansion.
12025       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
12026 
12027       TypeLocBuilder TLB;
12028       TLB.reserve(From->getTypeLoc().getFullDataSize());
12029 
12030       QualType To = getDerived().TransformType(TLB, PatternTL);
12031       if (To.isNull())
12032         return ExprError();
12033 
12034       To = getDerived().RebuildPackExpansionType(To,
12035                                                  PatternTL.getSourceRange(),
12036                                                  ExpansionTL.getEllipsisLoc(),
12037                                                  NumExpansions);
12038       if (To.isNull())
12039         return ExprError();
12040 
12041       PackExpansionTypeLoc ToExpansionTL
12042         = TLB.push<PackExpansionTypeLoc>(To);
12043       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12044       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12045       continue;
12046     }
12047 
12048     // Expand the pack expansion by substituting for each argument in the
12049     // pack(s).
12050     for (unsigned I = 0; I != *NumExpansions; ++I) {
12051       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
12052       TypeLocBuilder TLB;
12053       TLB.reserve(PatternTL.getFullDataSize());
12054       QualType To = getDerived().TransformType(TLB, PatternTL);
12055       if (To.isNull())
12056         return ExprError();
12057 
12058       if (To->containsUnexpandedParameterPack()) {
12059         To = getDerived().RebuildPackExpansionType(To,
12060                                                    PatternTL.getSourceRange(),
12061                                                    ExpansionTL.getEllipsisLoc(),
12062                                                    NumExpansions);
12063         if (To.isNull())
12064           return ExprError();
12065 
12066         PackExpansionTypeLoc ToExpansionTL
12067           = TLB.push<PackExpansionTypeLoc>(To);
12068         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12069       }
12070 
12071       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12072     }
12073 
12074     if (!RetainExpansion)
12075       continue;
12076 
12077     // If we're supposed to retain a pack expansion, do so by temporarily
12078     // forgetting the partially-substituted parameter pack.
12079     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12080 
12081     TypeLocBuilder TLB;
12082     TLB.reserve(From->getTypeLoc().getFullDataSize());
12083 
12084     QualType To = getDerived().TransformType(TLB, PatternTL);
12085     if (To.isNull())
12086       return ExprError();
12087 
12088     To = getDerived().RebuildPackExpansionType(To,
12089                                                PatternTL.getSourceRange(),
12090                                                ExpansionTL.getEllipsisLoc(),
12091                                                NumExpansions);
12092     if (To.isNull())
12093       return ExprError();
12094 
12095     PackExpansionTypeLoc ToExpansionTL
12096       = TLB.push<PackExpansionTypeLoc>(To);
12097     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
12098     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
12099   }
12100 
12101   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12102     return E;
12103 
12104   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
12105                                        E->getEndLoc());
12106 }
12107 
12108 template<typename Derived>
12109 ExprResult
12110 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12111                                                  ConceptSpecializationExpr *E) {
12112   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12113   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12114   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12115                                               Old->NumTemplateArgs, TransArgs))
12116     return ExprError();
12117 
12118   return getDerived().RebuildConceptSpecializationExpr(
12119       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12120       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12121       &TransArgs);
12122 }
12123 
12124 template<typename Derived>
12125 ExprResult
12126 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12127   SmallVector<ParmVarDecl*, 4> TransParams;
12128   SmallVector<QualType, 4> TransParamTypes;
12129   Sema::ExtParameterInfoBuilder ExtParamInfos;
12130 
12131   // C++2a [expr.prim.req]p2
12132   // Expressions appearing within a requirement-body are unevaluated operands.
12133   EnterExpressionEvaluationContext Ctx(
12134       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12135 
12136   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12137       getSema().Context, getSema().CurContext,
12138       E->getBody()->getBeginLoc());
12139 
12140   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12141 
12142   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12143                                                E->getLocalParameters(),
12144                                                /*ParamTypes=*/nullptr,
12145                                                /*ParamInfos=*/nullptr,
12146                                                TransParamTypes, &TransParams,
12147                                                ExtParamInfos))
12148     return ExprError();
12149 
12150   for (ParmVarDecl *Param : TransParams)
12151     Param->setDeclContext(Body);
12152 
12153   SmallVector<concepts::Requirement *, 4> TransReqs;
12154   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12155                                                      TransReqs))
12156     return ExprError();
12157 
12158   for (concepts::Requirement *Req : TransReqs) {
12159     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12160       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12161         ER->getReturnTypeRequirement()
12162                 .getTypeConstraintTemplateParameterList()->getParam(0)
12163                 ->setDeclContext(Body);
12164       }
12165     }
12166   }
12167 
12168   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12169                                           TransParams, TransReqs,
12170                                           E->getRBraceLoc());
12171 }
12172 
12173 template<typename Derived>
12174 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12175     ArrayRef<concepts::Requirement *> Reqs,
12176     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12177   for (concepts::Requirement *Req : Reqs) {
12178     concepts::Requirement *TransReq = nullptr;
12179     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12180       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12181     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12182       TransReq = getDerived().TransformExprRequirement(ExprReq);
12183     else
12184       TransReq = getDerived().TransformNestedRequirement(
12185                      cast<concepts::NestedRequirement>(Req));
12186     if (!TransReq)
12187       return true;
12188     Transformed.push_back(TransReq);
12189   }
12190   return false;
12191 }
12192 
12193 template<typename Derived>
12194 concepts::TypeRequirement *
12195 TreeTransform<Derived>::TransformTypeRequirement(
12196     concepts::TypeRequirement *Req) {
12197   if (Req->isSubstitutionFailure()) {
12198     if (getDerived().AlwaysRebuild())
12199       return getDerived().RebuildTypeRequirement(
12200               Req->getSubstitutionDiagnostic());
12201     return Req;
12202   }
12203   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12204   if (!TransType)
12205     return nullptr;
12206   return getDerived().RebuildTypeRequirement(TransType);
12207 }
12208 
12209 template<typename Derived>
12210 concepts::ExprRequirement *
12211 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12212   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12213   if (Req->isExprSubstitutionFailure())
12214     TransExpr = Req->getExprSubstitutionDiagnostic();
12215   else {
12216     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12217     if (TransExprRes.isInvalid())
12218       return nullptr;
12219     TransExpr = TransExprRes.get();
12220   }
12221 
12222   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12223   const auto &RetReq = Req->getReturnTypeRequirement();
12224   if (RetReq.isEmpty())
12225     TransRetReq.emplace();
12226   else if (RetReq.isSubstitutionFailure())
12227     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12228   else if (RetReq.isTypeConstraint()) {
12229     TemplateParameterList *OrigTPL =
12230         RetReq.getTypeConstraintTemplateParameterList();
12231     TemplateParameterList *TPL =
12232         getDerived().TransformTemplateParameterList(OrigTPL);
12233     if (!TPL)
12234       return nullptr;
12235     TransRetReq.emplace(TPL);
12236   }
12237   assert(TransRetReq.hasValue() &&
12238          "All code paths leading here must set TransRetReq");
12239   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12240     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12241                                                Req->getNoexceptLoc(),
12242                                                std::move(*TransRetReq));
12243   return getDerived().RebuildExprRequirement(
12244       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12245       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12246 }
12247 
12248 template<typename Derived>
12249 concepts::NestedRequirement *
12250 TreeTransform<Derived>::TransformNestedRequirement(
12251     concepts::NestedRequirement *Req) {
12252   if (Req->isSubstitutionFailure()) {
12253     if (getDerived().AlwaysRebuild())
12254       return getDerived().RebuildNestedRequirement(
12255           Req->getSubstitutionDiagnostic());
12256     return Req;
12257   }
12258   ExprResult TransConstraint =
12259       getDerived().TransformExpr(Req->getConstraintExpr());
12260   if (TransConstraint.isInvalid())
12261     return nullptr;
12262   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12263 }
12264 
12265 template<typename Derived>
12266 ExprResult
12267 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12268   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12269   if (!T)
12270     return ExprError();
12271 
12272   if (!getDerived().AlwaysRebuild() &&
12273       T == E->getQueriedTypeSourceInfo())
12274     return E;
12275 
12276   ExprResult SubExpr;
12277   {
12278     EnterExpressionEvaluationContext Unevaluated(
12279         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12280     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12281     if (SubExpr.isInvalid())
12282       return ExprError();
12283 
12284     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12285       return E;
12286   }
12287 
12288   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12289                                             SubExpr.get(), E->getEndLoc());
12290 }
12291 
12292 template<typename Derived>
12293 ExprResult
12294 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12295   ExprResult SubExpr;
12296   {
12297     EnterExpressionEvaluationContext Unevaluated(
12298         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12299     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12300     if (SubExpr.isInvalid())
12301       return ExprError();
12302 
12303     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12304       return E;
12305   }
12306 
12307   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12308                                              SubExpr.get(), E->getEndLoc());
12309 }
12310 
12311 template <typename Derived>
12312 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12313     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12314     TypeSourceInfo **RecoveryTSI) {
12315   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12316       DRE, AddrTaken, RecoveryTSI);
12317 
12318   // Propagate both errors and recovered types, which return ExprEmpty.
12319   if (!NewDRE.isUsable())
12320     return NewDRE;
12321 
12322   // We got an expr, wrap it up in parens.
12323   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12324     return PE;
12325   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12326                                        PE->getRParen());
12327 }
12328 
12329 template <typename Derived>
12330 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12331     DependentScopeDeclRefExpr *E) {
12332   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12333                                             nullptr);
12334 }
12335 
12336 template<typename Derived>
12337 ExprResult
12338 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12339                                                DependentScopeDeclRefExpr *E,
12340                                                bool IsAddressOfOperand,
12341                                                TypeSourceInfo **RecoveryTSI) {
12342   assert(E->getQualifierLoc());
12343   NestedNameSpecifierLoc QualifierLoc
12344   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12345   if (!QualifierLoc)
12346     return ExprError();
12347   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12348 
12349   // TODO: If this is a conversion-function-id, verify that the
12350   // destination type name (if present) resolves the same way after
12351   // instantiation as it did in the local scope.
12352 
12353   DeclarationNameInfo NameInfo
12354     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12355   if (!NameInfo.getName())
12356     return ExprError();
12357 
12358   if (!E->hasExplicitTemplateArgs()) {
12359     if (!getDerived().AlwaysRebuild() &&
12360         QualifierLoc == E->getQualifierLoc() &&
12361         // Note: it is sufficient to compare the Name component of NameInfo:
12362         // if name has not changed, DNLoc has not changed either.
12363         NameInfo.getName() == E->getDeclName())
12364       return E;
12365 
12366     return getDerived().RebuildDependentScopeDeclRefExpr(
12367         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12368         IsAddressOfOperand, RecoveryTSI);
12369   }
12370 
12371   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12372   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12373                                               E->getNumTemplateArgs(),
12374                                               TransArgs))
12375     return ExprError();
12376 
12377   return getDerived().RebuildDependentScopeDeclRefExpr(
12378       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12379       RecoveryTSI);
12380 }
12381 
12382 template<typename Derived>
12383 ExprResult
12384 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12385   // CXXConstructExprs other than for list-initialization and
12386   // CXXTemporaryObjectExpr are always implicit, so when we have
12387   // a 1-argument construction we just transform that argument.
12388   if (getDerived().AllowSkippingCXXConstructExpr() &&
12389       ((E->getNumArgs() == 1 ||
12390         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12391        (!getDerived().DropCallArgument(E->getArg(0))) &&
12392        !E->isListInitialization()))
12393     return getDerived().TransformInitializer(E->getArg(0),
12394                                              /*DirectInit*/ false);
12395 
12396   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12397 
12398   QualType T = getDerived().TransformType(E->getType());
12399   if (T.isNull())
12400     return ExprError();
12401 
12402   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12403       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12404   if (!Constructor)
12405     return ExprError();
12406 
12407   bool ArgumentChanged = false;
12408   SmallVector<Expr*, 8> Args;
12409   {
12410     EnterExpressionEvaluationContext Context(
12411         getSema(), EnterExpressionEvaluationContext::InitList,
12412         E->isListInitialization());
12413     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12414                                     &ArgumentChanged))
12415       return ExprError();
12416   }
12417 
12418   if (!getDerived().AlwaysRebuild() &&
12419       T == E->getType() &&
12420       Constructor == E->getConstructor() &&
12421       !ArgumentChanged) {
12422     // Mark the constructor as referenced.
12423     // FIXME: Instantiation-specific
12424     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12425     return E;
12426   }
12427 
12428   return getDerived().RebuildCXXConstructExpr(
12429       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12430       E->hadMultipleCandidates(), E->isListInitialization(),
12431       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12432       E->getConstructionKind(), E->getParenOrBraceRange());
12433 }
12434 
12435 template<typename Derived>
12436 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12437     CXXInheritedCtorInitExpr *E) {
12438   QualType T = getDerived().TransformType(E->getType());
12439   if (T.isNull())
12440     return ExprError();
12441 
12442   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12443       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12444   if (!Constructor)
12445     return ExprError();
12446 
12447   if (!getDerived().AlwaysRebuild() &&
12448       T == E->getType() &&
12449       Constructor == E->getConstructor()) {
12450     // Mark the constructor as referenced.
12451     // FIXME: Instantiation-specific
12452     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12453     return E;
12454   }
12455 
12456   return getDerived().RebuildCXXInheritedCtorInitExpr(
12457       T, E->getLocation(), Constructor,
12458       E->constructsVBase(), E->inheritedFromVBase());
12459 }
12460 
12461 /// Transform a C++ temporary-binding expression.
12462 ///
12463 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12464 /// transform the subexpression and return that.
12465 template<typename Derived>
12466 ExprResult
12467 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12468   return getDerived().TransformExpr(E->getSubExpr());
12469 }
12470 
12471 /// Transform a C++ expression that contains cleanups that should
12472 /// be run after the expression is evaluated.
12473 ///
12474 /// Since ExprWithCleanups nodes are implicitly generated, we
12475 /// just transform the subexpression and return that.
12476 template<typename Derived>
12477 ExprResult
12478 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12479   return getDerived().TransformExpr(E->getSubExpr());
12480 }
12481 
12482 template<typename Derived>
12483 ExprResult
12484 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12485                                                     CXXTemporaryObjectExpr *E) {
12486   TypeSourceInfo *T =
12487       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12488   if (!T)
12489     return ExprError();
12490 
12491   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12492       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12493   if (!Constructor)
12494     return ExprError();
12495 
12496   bool ArgumentChanged = false;
12497   SmallVector<Expr*, 8> Args;
12498   Args.reserve(E->getNumArgs());
12499   {
12500     EnterExpressionEvaluationContext Context(
12501         getSema(), EnterExpressionEvaluationContext::InitList,
12502         E->isListInitialization());
12503     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12504                        &ArgumentChanged))
12505       return ExprError();
12506   }
12507 
12508   if (!getDerived().AlwaysRebuild() &&
12509       T == E->getTypeSourceInfo() &&
12510       Constructor == E->getConstructor() &&
12511       !ArgumentChanged) {
12512     // FIXME: Instantiation-specific
12513     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12514     return SemaRef.MaybeBindToTemporary(E);
12515   }
12516 
12517   // FIXME: We should just pass E->isListInitialization(), but we're not
12518   // prepared to handle list-initialization without a child InitListExpr.
12519   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12520   return getDerived().RebuildCXXTemporaryObjectExpr(
12521       T, LParenLoc, Args, E->getEndLoc(),
12522       /*ListInitialization=*/LParenLoc.isInvalid());
12523 }
12524 
12525 template<typename Derived>
12526 ExprResult
12527 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12528   // Transform any init-capture expressions before entering the scope of the
12529   // lambda body, because they are not semantically within that scope.
12530   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12531   struct TransformedInitCapture {
12532     // The location of the ... if the result is retaining a pack expansion.
12533     SourceLocation EllipsisLoc;
12534     // Zero or more expansions of the init-capture.
12535     SmallVector<InitCaptureInfoTy, 4> Expansions;
12536   };
12537   SmallVector<TransformedInitCapture, 4> InitCaptures;
12538   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12539   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12540                                     CEnd = E->capture_end();
12541        C != CEnd; ++C) {
12542     if (!E->isInitCapture(C))
12543       continue;
12544 
12545     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12546     VarDecl *OldVD = C->getCapturedVar();
12547 
12548     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12549                                 Optional<unsigned> NumExpansions) {
12550       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12551           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12552 
12553       if (NewExprInitResult.isInvalid()) {
12554         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12555         return;
12556       }
12557       Expr *NewExprInit = NewExprInitResult.get();
12558 
12559       QualType NewInitCaptureType =
12560           getSema().buildLambdaInitCaptureInitialization(
12561               C->getLocation(), OldVD->getType()->isReferenceType(),
12562               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12563               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12564               NewExprInit);
12565       Result.Expansions.push_back(
12566           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12567     };
12568 
12569     // If this is an init-capture pack, consider expanding the pack now.
12570     if (OldVD->isParameterPack()) {
12571       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12572                                              ->getTypeLoc()
12573                                              .castAs<PackExpansionTypeLoc>();
12574       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12575       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12576 
12577       // Determine whether the set of unexpanded parameter packs can and should
12578       // be expanded.
12579       bool Expand = true;
12580       bool RetainExpansion = false;
12581       Optional<unsigned> OrigNumExpansions =
12582           ExpansionTL.getTypePtr()->getNumExpansions();
12583       Optional<unsigned> NumExpansions = OrigNumExpansions;
12584       if (getDerived().TryExpandParameterPacks(
12585               ExpansionTL.getEllipsisLoc(),
12586               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12587               RetainExpansion, NumExpansions))
12588         return ExprError();
12589       if (Expand) {
12590         for (unsigned I = 0; I != *NumExpansions; ++I) {
12591           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12592           SubstInitCapture(SourceLocation(), None);
12593         }
12594       }
12595       if (!Expand || RetainExpansion) {
12596         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12597         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12598         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12599       }
12600     } else {
12601       SubstInitCapture(SourceLocation(), None);
12602     }
12603   }
12604 
12605   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12606   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12607 
12608   // Transform the template parameters, and add them to the current
12609   // instantiation scope. The null case is handled correctly.
12610   auto TPL = getDerived().TransformTemplateParameterList(
12611       E->getTemplateParameterList());
12612   LSI->GLTemplateParameterList = TPL;
12613 
12614   // Transform the type of the original lambda's call operator.
12615   // The transformation MUST be done in the CurrentInstantiationScope since
12616   // it introduces a mapping of the original to the newly created
12617   // transformed parameters.
12618   TypeSourceInfo *NewCallOpTSI = nullptr;
12619   {
12620     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12621     FunctionProtoTypeLoc OldCallOpFPTL =
12622         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12623 
12624     TypeLocBuilder NewCallOpTLBuilder;
12625     SmallVector<QualType, 4> ExceptionStorage;
12626     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12627     QualType NewCallOpType = TransformFunctionProtoType(
12628         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12629         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12630           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12631                                               ExceptionStorage, Changed);
12632         });
12633     if (NewCallOpType.isNull())
12634       return ExprError();
12635     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12636                                                         NewCallOpType);
12637   }
12638 
12639   // Transform the trailing requires clause
12640   ExprResult NewTrailingRequiresClause;
12641   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12642     // FIXME: Concepts: Substitution into requires clause should only happen
12643     //                  when checking satisfaction.
12644     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12645 
12646   // Create the local class that will describe the lambda.
12647   // FIXME: KnownDependent below is wrong when substituting inside a templated
12648   // context that isn't a DeclContext (such as a variable template).
12649   CXXRecordDecl *OldClass = E->getLambdaClass();
12650   CXXRecordDecl *Class
12651     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12652                                         NewCallOpTSI,
12653                                         /*KnownDependent=*/false,
12654                                         E->getCaptureDefault());
12655   getDerived().transformedLocalDecl(OldClass, {Class});
12656 
12657   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12658   if (getDerived().ReplacingOriginal())
12659     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12660                                OldClass->getLambdaManglingNumber(),
12661                                OldClass->getDeviceLambdaManglingNumber(),
12662                                OldClass->getLambdaContextDecl());
12663 
12664   // Build the call operator.
12665   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12666       Class, E->getIntroducerRange(), NewCallOpTSI,
12667       E->getCallOperator()->getEndLoc(),
12668       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12669       E->getCallOperator()->getConstexprKind(),
12670       NewTrailingRequiresClause.get());
12671 
12672   LSI->CallOperator = NewCallOperator;
12673 
12674   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12675   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12676 
12677   // Number the lambda for linkage purposes if necessary.
12678   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12679 
12680   // Introduce the context of the call operator.
12681   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12682                                  /*NewThisContext*/false);
12683 
12684   // Enter the scope of the lambda.
12685   getSema().buildLambdaScope(LSI, NewCallOperator,
12686                              E->getIntroducerRange(),
12687                              E->getCaptureDefault(),
12688                              E->getCaptureDefaultLoc(),
12689                              E->hasExplicitParameters(),
12690                              E->hasExplicitResultType(),
12691                              E->isMutable());
12692 
12693   bool Invalid = false;
12694 
12695   // Transform captures.
12696   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12697                                  CEnd = E->capture_end();
12698        C != CEnd; ++C) {
12699     // When we hit the first implicit capture, tell Sema that we've finished
12700     // the list of explicit captures.
12701     if (C->isImplicit())
12702       break;
12703 
12704     // Capturing 'this' is trivial.
12705     if (C->capturesThis()) {
12706       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12707                                     /*BuildAndDiagnose*/ true, nullptr,
12708                                     C->getCaptureKind() == LCK_StarThis);
12709       continue;
12710     }
12711     // Captured expression will be recaptured during captured variables
12712     // rebuilding.
12713     if (C->capturesVLAType())
12714       continue;
12715 
12716     // Rebuild init-captures, including the implied field declaration.
12717     if (E->isInitCapture(C)) {
12718       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12719 
12720       VarDecl *OldVD = C->getCapturedVar();
12721       llvm::SmallVector<Decl*, 4> NewVDs;
12722 
12723       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12724         ExprResult Init = Info.first;
12725         QualType InitQualType = Info.second;
12726         if (Init.isInvalid() || InitQualType.isNull()) {
12727           Invalid = true;
12728           break;
12729         }
12730         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12731             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12732             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12733         if (!NewVD) {
12734           Invalid = true;
12735           break;
12736         }
12737         NewVDs.push_back(NewVD);
12738         getSema().addInitCapture(LSI, NewVD);
12739       }
12740 
12741       if (Invalid)
12742         break;
12743 
12744       getDerived().transformedLocalDecl(OldVD, NewVDs);
12745       continue;
12746     }
12747 
12748     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12749 
12750     // Determine the capture kind for Sema.
12751     Sema::TryCaptureKind Kind
12752       = C->isImplicit()? Sema::TryCapture_Implicit
12753                        : C->getCaptureKind() == LCK_ByCopy
12754                            ? Sema::TryCapture_ExplicitByVal
12755                            : Sema::TryCapture_ExplicitByRef;
12756     SourceLocation EllipsisLoc;
12757     if (C->isPackExpansion()) {
12758       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12759       bool ShouldExpand = false;
12760       bool RetainExpansion = false;
12761       Optional<unsigned> NumExpansions;
12762       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12763                                                C->getLocation(),
12764                                                Unexpanded,
12765                                                ShouldExpand, RetainExpansion,
12766                                                NumExpansions)) {
12767         Invalid = true;
12768         continue;
12769       }
12770 
12771       if (ShouldExpand) {
12772         // The transform has determined that we should perform an expansion;
12773         // transform and capture each of the arguments.
12774         // expansion of the pattern. Do so.
12775         VarDecl *Pack = C->getCapturedVar();
12776         for (unsigned I = 0; I != *NumExpansions; ++I) {
12777           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12778           VarDecl *CapturedVar
12779             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12780                                                                Pack));
12781           if (!CapturedVar) {
12782             Invalid = true;
12783             continue;
12784           }
12785 
12786           // Capture the transformed variable.
12787           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12788         }
12789 
12790         // FIXME: Retain a pack expansion if RetainExpansion is true.
12791 
12792         continue;
12793       }
12794 
12795       EllipsisLoc = C->getEllipsisLoc();
12796     }
12797 
12798     // Transform the captured variable.
12799     VarDecl *CapturedVar
12800       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12801                                                          C->getCapturedVar()));
12802     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12803       Invalid = true;
12804       continue;
12805     }
12806 
12807     // Capture the transformed variable.
12808     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12809                                  EllipsisLoc);
12810   }
12811   getSema().finishLambdaExplicitCaptures(LSI);
12812 
12813   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12814   // evaluation context even if we're not transforming the function body.
12815   getSema().PushExpressionEvaluationContext(
12816       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12817 
12818   // Instantiate the body of the lambda expression.
12819   StmtResult Body =
12820       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12821 
12822   // ActOnLambda* will pop the function scope for us.
12823   FuncScopeCleanup.disable();
12824 
12825   if (Body.isInvalid()) {
12826     SavedContext.pop();
12827     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12828                                /*IsInstantiation=*/true);
12829     return ExprError();
12830   }
12831 
12832   // Copy the LSI before ActOnFinishFunctionBody removes it.
12833   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12834   // the call operator.
12835   auto LSICopy = *LSI;
12836   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12837                                     /*IsInstantiation*/ true);
12838   SavedContext.pop();
12839 
12840   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12841                                    &LSICopy);
12842 }
12843 
12844 template<typename Derived>
12845 StmtResult
12846 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12847   return TransformStmt(S);
12848 }
12849 
12850 template<typename Derived>
12851 StmtResult
12852 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12853   // Transform captures.
12854   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12855                                  CEnd = E->capture_end();
12856        C != CEnd; ++C) {
12857     // When we hit the first implicit capture, tell Sema that we've finished
12858     // the list of explicit captures.
12859     if (!C->isImplicit())
12860       continue;
12861 
12862     // Capturing 'this' is trivial.
12863     if (C->capturesThis()) {
12864       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12865                                     /*BuildAndDiagnose*/ true, nullptr,
12866                                     C->getCaptureKind() == LCK_StarThis);
12867       continue;
12868     }
12869     // Captured expression will be recaptured during captured variables
12870     // rebuilding.
12871     if (C->capturesVLAType())
12872       continue;
12873 
12874     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12875     assert(!E->isInitCapture(C) && "implicit init-capture?");
12876 
12877     // Transform the captured variable.
12878     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12879         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12880     if (!CapturedVar || CapturedVar->isInvalidDecl())
12881       return StmtError();
12882 
12883     // Capture the transformed variable.
12884     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12885   }
12886 
12887   return S;
12888 }
12889 
12890 template<typename Derived>
12891 ExprResult
12892 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12893                                                   CXXUnresolvedConstructExpr *E) {
12894   TypeSourceInfo *T =
12895       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12896   if (!T)
12897     return ExprError();
12898 
12899   bool ArgumentChanged = false;
12900   SmallVector<Expr*, 8> Args;
12901   Args.reserve(E->getNumArgs());
12902   {
12903     EnterExpressionEvaluationContext Context(
12904         getSema(), EnterExpressionEvaluationContext::InitList,
12905         E->isListInitialization());
12906     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
12907                                     &ArgumentChanged))
12908       return ExprError();
12909   }
12910 
12911   if (!getDerived().AlwaysRebuild() &&
12912       T == E->getTypeSourceInfo() &&
12913       !ArgumentChanged)
12914     return E;
12915 
12916   // FIXME: we're faking the locations of the commas
12917   return getDerived().RebuildCXXUnresolvedConstructExpr(
12918       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12919 }
12920 
12921 template<typename Derived>
12922 ExprResult
12923 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12924                                              CXXDependentScopeMemberExpr *E) {
12925   // Transform the base of the expression.
12926   ExprResult Base((Expr*) nullptr);
12927   Expr *OldBase;
12928   QualType BaseType;
12929   QualType ObjectType;
12930   if (!E->isImplicitAccess()) {
12931     OldBase = E->getBase();
12932     Base = getDerived().TransformExpr(OldBase);
12933     if (Base.isInvalid())
12934       return ExprError();
12935 
12936     // Start the member reference and compute the object's type.
12937     ParsedType ObjectTy;
12938     bool MayBePseudoDestructor = false;
12939     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12940                                                 E->getOperatorLoc(),
12941                                       E->isArrow()? tok::arrow : tok::period,
12942                                                 ObjectTy,
12943                                                 MayBePseudoDestructor);
12944     if (Base.isInvalid())
12945       return ExprError();
12946 
12947     ObjectType = ObjectTy.get();
12948     BaseType = ((Expr*) Base.get())->getType();
12949   } else {
12950     OldBase = nullptr;
12951     BaseType = getDerived().TransformType(E->getBaseType());
12952     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12953   }
12954 
12955   // Transform the first part of the nested-name-specifier that qualifies
12956   // the member name.
12957   NamedDecl *FirstQualifierInScope
12958     = getDerived().TransformFirstQualifierInScope(
12959                                             E->getFirstQualifierFoundInScope(),
12960                                             E->getQualifierLoc().getBeginLoc());
12961 
12962   NestedNameSpecifierLoc QualifierLoc;
12963   if (E->getQualifier()) {
12964     QualifierLoc
12965       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12966                                                      ObjectType,
12967                                                      FirstQualifierInScope);
12968     if (!QualifierLoc)
12969       return ExprError();
12970   }
12971 
12972   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12973 
12974   // TODO: If this is a conversion-function-id, verify that the
12975   // destination type name (if present) resolves the same way after
12976   // instantiation as it did in the local scope.
12977 
12978   DeclarationNameInfo NameInfo
12979     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12980   if (!NameInfo.getName())
12981     return ExprError();
12982 
12983   if (!E->hasExplicitTemplateArgs()) {
12984     // This is a reference to a member without an explicitly-specified
12985     // template argument list. Optimize for this common case.
12986     if (!getDerived().AlwaysRebuild() &&
12987         Base.get() == OldBase &&
12988         BaseType == E->getBaseType() &&
12989         QualifierLoc == E->getQualifierLoc() &&
12990         NameInfo.getName() == E->getMember() &&
12991         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12992       return E;
12993 
12994     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12995                                                        BaseType,
12996                                                        E->isArrow(),
12997                                                        E->getOperatorLoc(),
12998                                                        QualifierLoc,
12999                                                        TemplateKWLoc,
13000                                                        FirstQualifierInScope,
13001                                                        NameInfo,
13002                                                        /*TemplateArgs*/nullptr);
13003   }
13004 
13005   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
13006   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
13007                                               E->getNumTemplateArgs(),
13008                                               TransArgs))
13009     return ExprError();
13010 
13011   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
13012                                                      BaseType,
13013                                                      E->isArrow(),
13014                                                      E->getOperatorLoc(),
13015                                                      QualifierLoc,
13016                                                      TemplateKWLoc,
13017                                                      FirstQualifierInScope,
13018                                                      NameInfo,
13019                                                      &TransArgs);
13020 }
13021 
13022 template<typename Derived>
13023 ExprResult
13024 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
13025   // Transform the base of the expression.
13026   ExprResult Base((Expr*) nullptr);
13027   QualType BaseType;
13028   if (!Old->isImplicitAccess()) {
13029     Base = getDerived().TransformExpr(Old->getBase());
13030     if (Base.isInvalid())
13031       return ExprError();
13032     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
13033                                                      Old->isArrow());
13034     if (Base.isInvalid())
13035       return ExprError();
13036     BaseType = Base.get()->getType();
13037   } else {
13038     BaseType = getDerived().TransformType(Old->getBaseType());
13039   }
13040 
13041   NestedNameSpecifierLoc QualifierLoc;
13042   if (Old->getQualifierLoc()) {
13043     QualifierLoc
13044     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
13045     if (!QualifierLoc)
13046       return ExprError();
13047   }
13048 
13049   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
13050 
13051   LookupResult R(SemaRef, Old->getMemberNameInfo(),
13052                  Sema::LookupOrdinaryName);
13053 
13054   // Transform the declaration set.
13055   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
13056     return ExprError();
13057 
13058   // Determine the naming class.
13059   if (Old->getNamingClass()) {
13060     CXXRecordDecl *NamingClass
13061       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
13062                                                           Old->getMemberLoc(),
13063                                                         Old->getNamingClass()));
13064     if (!NamingClass)
13065       return ExprError();
13066 
13067     R.setNamingClass(NamingClass);
13068   }
13069 
13070   TemplateArgumentListInfo TransArgs;
13071   if (Old->hasExplicitTemplateArgs()) {
13072     TransArgs.setLAngleLoc(Old->getLAngleLoc());
13073     TransArgs.setRAngleLoc(Old->getRAngleLoc());
13074     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
13075                                                 Old->getNumTemplateArgs(),
13076                                                 TransArgs))
13077       return ExprError();
13078   }
13079 
13080   // FIXME: to do this check properly, we will need to preserve the
13081   // first-qualifier-in-scope here, just in case we had a dependent
13082   // base (and therefore couldn't do the check) and a
13083   // nested-name-qualifier (and therefore could do the lookup).
13084   NamedDecl *FirstQualifierInScope = nullptr;
13085 
13086   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
13087                                                   BaseType,
13088                                                   Old->getOperatorLoc(),
13089                                                   Old->isArrow(),
13090                                                   QualifierLoc,
13091                                                   TemplateKWLoc,
13092                                                   FirstQualifierInScope,
13093                                                   R,
13094                                               (Old->hasExplicitTemplateArgs()
13095                                                   ? &TransArgs : nullptr));
13096 }
13097 
13098 template<typename Derived>
13099 ExprResult
13100 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
13101   EnterExpressionEvaluationContext Unevaluated(
13102       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
13103   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
13104   if (SubExpr.isInvalid())
13105     return ExprError();
13106 
13107   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13108     return E;
13109 
13110   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13111 }
13112 
13113 template<typename Derived>
13114 ExprResult
13115 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13116   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13117   if (Pattern.isInvalid())
13118     return ExprError();
13119 
13120   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13121     return E;
13122 
13123   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13124                                            E->getNumExpansions());
13125 }
13126 
13127 template<typename Derived>
13128 ExprResult
13129 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13130   // If E is not value-dependent, then nothing will change when we transform it.
13131   // Note: This is an instantiation-centric view.
13132   if (!E->isValueDependent())
13133     return E;
13134 
13135   EnterExpressionEvaluationContext Unevaluated(
13136       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13137 
13138   ArrayRef<TemplateArgument> PackArgs;
13139   TemplateArgument ArgStorage;
13140 
13141   // Find the argument list to transform.
13142   if (E->isPartiallySubstituted()) {
13143     PackArgs = E->getPartialArguments();
13144   } else if (E->isValueDependent()) {
13145     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13146     bool ShouldExpand = false;
13147     bool RetainExpansion = false;
13148     Optional<unsigned> NumExpansions;
13149     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13150                                              Unexpanded,
13151                                              ShouldExpand, RetainExpansion,
13152                                              NumExpansions))
13153       return ExprError();
13154 
13155     // If we need to expand the pack, build a template argument from it and
13156     // expand that.
13157     if (ShouldExpand) {
13158       auto *Pack = E->getPack();
13159       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13160         ArgStorage = getSema().Context.getPackExpansionType(
13161             getSema().Context.getTypeDeclType(TTPD), None);
13162       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13163         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13164       } else {
13165         auto *VD = cast<ValueDecl>(Pack);
13166         ExprResult DRE = getSema().BuildDeclRefExpr(
13167             VD, VD->getType().getNonLValueExprType(getSema().Context),
13168             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13169             E->getPackLoc());
13170         if (DRE.isInvalid())
13171           return ExprError();
13172         ArgStorage = new (getSema().Context) PackExpansionExpr(
13173             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13174       }
13175       PackArgs = ArgStorage;
13176     }
13177   }
13178 
13179   // If we're not expanding the pack, just transform the decl.
13180   if (!PackArgs.size()) {
13181     auto *Pack = cast_or_null<NamedDecl>(
13182         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13183     if (!Pack)
13184       return ExprError();
13185     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13186                                               E->getPackLoc(),
13187                                               E->getRParenLoc(), None, None);
13188   }
13189 
13190   // Try to compute the result without performing a partial substitution.
13191   Optional<unsigned> Result = 0;
13192   for (const TemplateArgument &Arg : PackArgs) {
13193     if (!Arg.isPackExpansion()) {
13194       Result = *Result + 1;
13195       continue;
13196     }
13197 
13198     TemplateArgumentLoc ArgLoc;
13199     InventTemplateArgumentLoc(Arg, ArgLoc);
13200 
13201     // Find the pattern of the pack expansion.
13202     SourceLocation Ellipsis;
13203     Optional<unsigned> OrigNumExpansions;
13204     TemplateArgumentLoc Pattern =
13205         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13206                                                           OrigNumExpansions);
13207 
13208     // Substitute under the pack expansion. Do not expand the pack (yet).
13209     TemplateArgumentLoc OutPattern;
13210     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13211     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13212                                                /*Uneval*/ true))
13213       return true;
13214 
13215     // See if we can determine the number of arguments from the result.
13216     Optional<unsigned> NumExpansions =
13217         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13218     if (!NumExpansions) {
13219       // No: we must be in an alias template expansion, and we're going to need
13220       // to actually expand the packs.
13221       Result = None;
13222       break;
13223     }
13224 
13225     Result = *Result + *NumExpansions;
13226   }
13227 
13228   // Common case: we could determine the number of expansions without
13229   // substituting.
13230   if (Result)
13231     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13232                                               E->getPackLoc(),
13233                                               E->getRParenLoc(), *Result, None);
13234 
13235   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13236                                                E->getPackLoc());
13237   {
13238     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13239     typedef TemplateArgumentLocInventIterator<
13240         Derived, const TemplateArgument*> PackLocIterator;
13241     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13242                                    PackLocIterator(*this, PackArgs.end()),
13243                                    TransformedPackArgs, /*Uneval*/true))
13244       return ExprError();
13245   }
13246 
13247   // Check whether we managed to fully-expand the pack.
13248   // FIXME: Is it possible for us to do so and not hit the early exit path?
13249   SmallVector<TemplateArgument, 8> Args;
13250   bool PartialSubstitution = false;
13251   for (auto &Loc : TransformedPackArgs.arguments()) {
13252     Args.push_back(Loc.getArgument());
13253     if (Loc.getArgument().isPackExpansion())
13254       PartialSubstitution = true;
13255   }
13256 
13257   if (PartialSubstitution)
13258     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13259                                               E->getPackLoc(),
13260                                               E->getRParenLoc(), None, Args);
13261 
13262   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13263                                             E->getPackLoc(), E->getRParenLoc(),
13264                                             Args.size(), None);
13265 }
13266 
13267 template<typename Derived>
13268 ExprResult
13269 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13270                                           SubstNonTypeTemplateParmPackExpr *E) {
13271   // Default behavior is to do nothing with this transformation.
13272   return E;
13273 }
13274 
13275 template<typename Derived>
13276 ExprResult
13277 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13278                                           SubstNonTypeTemplateParmExpr *E) {
13279   // Default behavior is to do nothing with this transformation.
13280   return E;
13281 }
13282 
13283 template<typename Derived>
13284 ExprResult
13285 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13286   // Default behavior is to do nothing with this transformation.
13287   return E;
13288 }
13289 
13290 template<typename Derived>
13291 ExprResult
13292 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13293                                                   MaterializeTemporaryExpr *E) {
13294   return getDerived().TransformExpr(E->getSubExpr());
13295 }
13296 
13297 template<typename Derived>
13298 ExprResult
13299 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13300   UnresolvedLookupExpr *Callee = nullptr;
13301   if (Expr *OldCallee = E->getCallee()) {
13302     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13303     if (CalleeResult.isInvalid())
13304       return ExprError();
13305     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13306   }
13307 
13308   Expr *Pattern = E->getPattern();
13309 
13310   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13311   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13312   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13313 
13314   // Determine whether the set of unexpanded parameter packs can and should
13315   // be expanded.
13316   bool Expand = true;
13317   bool RetainExpansion = false;
13318   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13319                      NumExpansions = OrigNumExpansions;
13320   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13321                                            Pattern->getSourceRange(),
13322                                            Unexpanded,
13323                                            Expand, RetainExpansion,
13324                                            NumExpansions))
13325     return true;
13326 
13327   if (!Expand) {
13328     // Do not expand any packs here, just transform and rebuild a fold
13329     // expression.
13330     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13331 
13332     ExprResult LHS =
13333         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13334     if (LHS.isInvalid())
13335       return true;
13336 
13337     ExprResult RHS =
13338         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13339     if (RHS.isInvalid())
13340       return true;
13341 
13342     if (!getDerived().AlwaysRebuild() &&
13343         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13344       return E;
13345 
13346     return getDerived().RebuildCXXFoldExpr(
13347         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13348         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13349   }
13350 
13351   // Formally a fold expression expands to nested parenthesized expressions.
13352   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13353   // them.
13354   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13355     SemaRef.Diag(E->getEllipsisLoc(),
13356                  clang::diag::err_fold_expression_limit_exceeded)
13357         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13358         << E->getSourceRange();
13359     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13360     return ExprError();
13361   }
13362 
13363   // The transform has determined that we should perform an elementwise
13364   // expansion of the pattern. Do so.
13365   ExprResult Result = getDerived().TransformExpr(E->getInit());
13366   if (Result.isInvalid())
13367     return true;
13368   bool LeftFold = E->isLeftFold();
13369 
13370   // If we're retaining an expansion for a right fold, it is the innermost
13371   // component and takes the init (if any).
13372   if (!LeftFold && RetainExpansion) {
13373     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13374 
13375     ExprResult Out = getDerived().TransformExpr(Pattern);
13376     if (Out.isInvalid())
13377       return true;
13378 
13379     Result = getDerived().RebuildCXXFoldExpr(
13380         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13381         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13382     if (Result.isInvalid())
13383       return true;
13384   }
13385 
13386   for (unsigned I = 0; I != *NumExpansions; ++I) {
13387     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13388         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13389     ExprResult Out = getDerived().TransformExpr(Pattern);
13390     if (Out.isInvalid())
13391       return true;
13392 
13393     if (Out.get()->containsUnexpandedParameterPack()) {
13394       // We still have a pack; retain a pack expansion for this slice.
13395       Result = getDerived().RebuildCXXFoldExpr(
13396           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13397           E->getOperator(), E->getEllipsisLoc(),
13398           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13399           OrigNumExpansions);
13400     } else if (Result.isUsable()) {
13401       // We've got down to a single element; build a binary operator.
13402       Expr *LHS = LeftFold ? Result.get() : Out.get();
13403       Expr *RHS = LeftFold ? Out.get() : Result.get();
13404       if (Callee)
13405         Result = getDerived().RebuildCXXOperatorCallExpr(
13406             BinaryOperator::getOverloadedOperator(E->getOperator()),
13407             E->getEllipsisLoc(), Callee, LHS, RHS);
13408       else
13409         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13410                                                     E->getOperator(), LHS, RHS);
13411     } else
13412       Result = Out;
13413 
13414     if (Result.isInvalid())
13415       return true;
13416   }
13417 
13418   // If we're retaining an expansion for a left fold, it is the outermost
13419   // component and takes the complete expansion so far as its init (if any).
13420   if (LeftFold && RetainExpansion) {
13421     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13422 
13423     ExprResult Out = getDerived().TransformExpr(Pattern);
13424     if (Out.isInvalid())
13425       return true;
13426 
13427     Result = getDerived().RebuildCXXFoldExpr(
13428         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13429         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13430     if (Result.isInvalid())
13431       return true;
13432   }
13433 
13434   // If we had no init and an empty pack, and we're not retaining an expansion,
13435   // then produce a fallback value or error.
13436   if (Result.isUnset())
13437     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13438                                                 E->getOperator());
13439 
13440   return Result;
13441 }
13442 
13443 template<typename Derived>
13444 ExprResult
13445 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13446     CXXStdInitializerListExpr *E) {
13447   return getDerived().TransformExpr(E->getSubExpr());
13448 }
13449 
13450 template<typename Derived>
13451 ExprResult
13452 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13453   return SemaRef.MaybeBindToTemporary(E);
13454 }
13455 
13456 template<typename Derived>
13457 ExprResult
13458 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13459   return E;
13460 }
13461 
13462 template<typename Derived>
13463 ExprResult
13464 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13465   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13466   if (SubExpr.isInvalid())
13467     return ExprError();
13468 
13469   if (!getDerived().AlwaysRebuild() &&
13470       SubExpr.get() == E->getSubExpr())
13471     return E;
13472 
13473   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13474 }
13475 
13476 template<typename Derived>
13477 ExprResult
13478 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13479   // Transform each of the elements.
13480   SmallVector<Expr *, 8> Elements;
13481   bool ArgChanged = false;
13482   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13483                                   /*IsCall=*/false, Elements, &ArgChanged))
13484     return ExprError();
13485 
13486   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13487     return SemaRef.MaybeBindToTemporary(E);
13488 
13489   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13490                                               Elements.data(),
13491                                               Elements.size());
13492 }
13493 
13494 template<typename Derived>
13495 ExprResult
13496 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13497                                                     ObjCDictionaryLiteral *E) {
13498   // Transform each of the elements.
13499   SmallVector<ObjCDictionaryElement, 8> Elements;
13500   bool ArgChanged = false;
13501   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13502     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13503 
13504     if (OrigElement.isPackExpansion()) {
13505       // This key/value element is a pack expansion.
13506       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13507       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13508       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13509       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13510 
13511       // Determine whether the set of unexpanded parameter packs can
13512       // and should be expanded.
13513       bool Expand = true;
13514       bool RetainExpansion = false;
13515       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13516       Optional<unsigned> NumExpansions = OrigNumExpansions;
13517       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13518                                OrigElement.Value->getEndLoc());
13519       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13520                                                PatternRange, Unexpanded, Expand,
13521                                                RetainExpansion, NumExpansions))
13522         return ExprError();
13523 
13524       if (!Expand) {
13525         // The transform has determined that we should perform a simple
13526         // transformation on the pack expansion, producing another pack
13527         // expansion.
13528         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13529         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13530         if (Key.isInvalid())
13531           return ExprError();
13532 
13533         if (Key.get() != OrigElement.Key)
13534           ArgChanged = true;
13535 
13536         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13537         if (Value.isInvalid())
13538           return ExprError();
13539 
13540         if (Value.get() != OrigElement.Value)
13541           ArgChanged = true;
13542 
13543         ObjCDictionaryElement Expansion = {
13544           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13545         };
13546         Elements.push_back(Expansion);
13547         continue;
13548       }
13549 
13550       // Record right away that the argument was changed.  This needs
13551       // to happen even if the array expands to nothing.
13552       ArgChanged = true;
13553 
13554       // The transform has determined that we should perform an elementwise
13555       // expansion of the pattern. Do so.
13556       for (unsigned I = 0; I != *NumExpansions; ++I) {
13557         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13558         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13559         if (Key.isInvalid())
13560           return ExprError();
13561 
13562         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13563         if (Value.isInvalid())
13564           return ExprError();
13565 
13566         ObjCDictionaryElement Element = {
13567           Key.get(), Value.get(), SourceLocation(), NumExpansions
13568         };
13569 
13570         // If any unexpanded parameter packs remain, we still have a
13571         // pack expansion.
13572         // FIXME: Can this really happen?
13573         if (Key.get()->containsUnexpandedParameterPack() ||
13574             Value.get()->containsUnexpandedParameterPack())
13575           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13576 
13577         Elements.push_back(Element);
13578       }
13579 
13580       // FIXME: Retain a pack expansion if RetainExpansion is true.
13581 
13582       // We've finished with this pack expansion.
13583       continue;
13584     }
13585 
13586     // Transform and check key.
13587     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13588     if (Key.isInvalid())
13589       return ExprError();
13590 
13591     if (Key.get() != OrigElement.Key)
13592       ArgChanged = true;
13593 
13594     // Transform and check value.
13595     ExprResult Value
13596       = getDerived().TransformExpr(OrigElement.Value);
13597     if (Value.isInvalid())
13598       return ExprError();
13599 
13600     if (Value.get() != OrigElement.Value)
13601       ArgChanged = true;
13602 
13603     ObjCDictionaryElement Element = {
13604       Key.get(), Value.get(), SourceLocation(), None
13605     };
13606     Elements.push_back(Element);
13607   }
13608 
13609   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13610     return SemaRef.MaybeBindToTemporary(E);
13611 
13612   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13613                                                    Elements);
13614 }
13615 
13616 template<typename Derived>
13617 ExprResult
13618 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13619   TypeSourceInfo *EncodedTypeInfo
13620     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13621   if (!EncodedTypeInfo)
13622     return ExprError();
13623 
13624   if (!getDerived().AlwaysRebuild() &&
13625       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13626     return E;
13627 
13628   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13629                                             EncodedTypeInfo,
13630                                             E->getRParenLoc());
13631 }
13632 
13633 template<typename Derived>
13634 ExprResult TreeTransform<Derived>::
13635 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13636   // This is a kind of implicit conversion, and it needs to get dropped
13637   // and recomputed for the same general reasons that ImplicitCastExprs
13638   // do, as well a more specific one: this expression is only valid when
13639   // it appears *immediately* as an argument expression.
13640   return getDerived().TransformExpr(E->getSubExpr());
13641 }
13642 
13643 template<typename Derived>
13644 ExprResult TreeTransform<Derived>::
13645 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13646   TypeSourceInfo *TSInfo
13647     = getDerived().TransformType(E->getTypeInfoAsWritten());
13648   if (!TSInfo)
13649     return ExprError();
13650 
13651   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13652   if (Result.isInvalid())
13653     return ExprError();
13654 
13655   if (!getDerived().AlwaysRebuild() &&
13656       TSInfo == E->getTypeInfoAsWritten() &&
13657       Result.get() == E->getSubExpr())
13658     return E;
13659 
13660   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13661                                       E->getBridgeKeywordLoc(), TSInfo,
13662                                       Result.get());
13663 }
13664 
13665 template <typename Derived>
13666 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13667     ObjCAvailabilityCheckExpr *E) {
13668   return E;
13669 }
13670 
13671 template<typename Derived>
13672 ExprResult
13673 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13674   // Transform arguments.
13675   bool ArgChanged = false;
13676   SmallVector<Expr*, 8> Args;
13677   Args.reserve(E->getNumArgs());
13678   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13679                                   &ArgChanged))
13680     return ExprError();
13681 
13682   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13683     // Class message: transform the receiver type.
13684     TypeSourceInfo *ReceiverTypeInfo
13685       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13686     if (!ReceiverTypeInfo)
13687       return ExprError();
13688 
13689     // If nothing changed, just retain the existing message send.
13690     if (!getDerived().AlwaysRebuild() &&
13691         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13692       return SemaRef.MaybeBindToTemporary(E);
13693 
13694     // Build a new class message send.
13695     SmallVector<SourceLocation, 16> SelLocs;
13696     E->getSelectorLocs(SelLocs);
13697     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13698                                                E->getSelector(),
13699                                                SelLocs,
13700                                                E->getMethodDecl(),
13701                                                E->getLeftLoc(),
13702                                                Args,
13703                                                E->getRightLoc());
13704   }
13705   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13706            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13707     if (!E->getMethodDecl())
13708       return ExprError();
13709 
13710     // Build a new class message send to 'super'.
13711     SmallVector<SourceLocation, 16> SelLocs;
13712     E->getSelectorLocs(SelLocs);
13713     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13714                                                E->getSelector(),
13715                                                SelLocs,
13716                                                E->getReceiverType(),
13717                                                E->getMethodDecl(),
13718                                                E->getLeftLoc(),
13719                                                Args,
13720                                                E->getRightLoc());
13721   }
13722 
13723   // Instance message: transform the receiver
13724   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13725          "Only class and instance messages may be instantiated");
13726   ExprResult Receiver
13727     = getDerived().TransformExpr(E->getInstanceReceiver());
13728   if (Receiver.isInvalid())
13729     return ExprError();
13730 
13731   // If nothing changed, just retain the existing message send.
13732   if (!getDerived().AlwaysRebuild() &&
13733       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13734     return SemaRef.MaybeBindToTemporary(E);
13735 
13736   // Build a new instance message send.
13737   SmallVector<SourceLocation, 16> SelLocs;
13738   E->getSelectorLocs(SelLocs);
13739   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13740                                              E->getSelector(),
13741                                              SelLocs,
13742                                              E->getMethodDecl(),
13743                                              E->getLeftLoc(),
13744                                              Args,
13745                                              E->getRightLoc());
13746 }
13747 
13748 template<typename Derived>
13749 ExprResult
13750 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13751   return E;
13752 }
13753 
13754 template<typename Derived>
13755 ExprResult
13756 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13757   return E;
13758 }
13759 
13760 template<typename Derived>
13761 ExprResult
13762 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13763   // Transform the base expression.
13764   ExprResult Base = getDerived().TransformExpr(E->getBase());
13765   if (Base.isInvalid())
13766     return ExprError();
13767 
13768   // We don't need to transform the ivar; it will never change.
13769 
13770   // If nothing changed, just retain the existing expression.
13771   if (!getDerived().AlwaysRebuild() &&
13772       Base.get() == E->getBase())
13773     return E;
13774 
13775   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13776                                              E->getLocation(),
13777                                              E->isArrow(), E->isFreeIvar());
13778 }
13779 
13780 template<typename Derived>
13781 ExprResult
13782 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13783   // 'super' and types never change. Property never changes. Just
13784   // retain the existing expression.
13785   if (!E->isObjectReceiver())
13786     return E;
13787 
13788   // Transform the base expression.
13789   ExprResult Base = getDerived().TransformExpr(E->getBase());
13790   if (Base.isInvalid())
13791     return ExprError();
13792 
13793   // We don't need to transform the property; it will never change.
13794 
13795   // If nothing changed, just retain the existing expression.
13796   if (!getDerived().AlwaysRebuild() &&
13797       Base.get() == E->getBase())
13798     return E;
13799 
13800   if (E->isExplicitProperty())
13801     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13802                                                    E->getExplicitProperty(),
13803                                                    E->getLocation());
13804 
13805   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13806                                                  SemaRef.Context.PseudoObjectTy,
13807                                                  E->getImplicitPropertyGetter(),
13808                                                  E->getImplicitPropertySetter(),
13809                                                  E->getLocation());
13810 }
13811 
13812 template<typename Derived>
13813 ExprResult
13814 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13815   // Transform the base expression.
13816   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13817   if (Base.isInvalid())
13818     return ExprError();
13819 
13820   // Transform the key expression.
13821   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13822   if (Key.isInvalid())
13823     return ExprError();
13824 
13825   // If nothing changed, just retain the existing expression.
13826   if (!getDerived().AlwaysRebuild() &&
13827       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13828     return E;
13829 
13830   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13831                                                   Base.get(), Key.get(),
13832                                                   E->getAtIndexMethodDecl(),
13833                                                   E->setAtIndexMethodDecl());
13834 }
13835 
13836 template<typename Derived>
13837 ExprResult
13838 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13839   // Transform the base expression.
13840   ExprResult Base = getDerived().TransformExpr(E->getBase());
13841   if (Base.isInvalid())
13842     return ExprError();
13843 
13844   // If nothing changed, just retain the existing expression.
13845   if (!getDerived().AlwaysRebuild() &&
13846       Base.get() == E->getBase())
13847     return E;
13848 
13849   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13850                                          E->getOpLoc(),
13851                                          E->isArrow());
13852 }
13853 
13854 template<typename Derived>
13855 ExprResult
13856 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13857   bool ArgumentChanged = false;
13858   SmallVector<Expr*, 8> SubExprs;
13859   SubExprs.reserve(E->getNumSubExprs());
13860   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13861                                   SubExprs, &ArgumentChanged))
13862     return ExprError();
13863 
13864   if (!getDerived().AlwaysRebuild() &&
13865       !ArgumentChanged)
13866     return E;
13867 
13868   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13869                                                SubExprs,
13870                                                E->getRParenLoc());
13871 }
13872 
13873 template<typename Derived>
13874 ExprResult
13875 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13876   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13877   if (SrcExpr.isInvalid())
13878     return ExprError();
13879 
13880   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13881   if (!Type)
13882     return ExprError();
13883 
13884   if (!getDerived().AlwaysRebuild() &&
13885       Type == E->getTypeSourceInfo() &&
13886       SrcExpr.get() == E->getSrcExpr())
13887     return E;
13888 
13889   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13890                                                SrcExpr.get(), Type,
13891                                                E->getRParenLoc());
13892 }
13893 
13894 template<typename Derived>
13895 ExprResult
13896 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13897   BlockDecl *oldBlock = E->getBlockDecl();
13898 
13899   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13900   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13901 
13902   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13903   blockScope->TheDecl->setBlockMissingReturnType(
13904                          oldBlock->blockMissingReturnType());
13905 
13906   SmallVector<ParmVarDecl*, 4> params;
13907   SmallVector<QualType, 4> paramTypes;
13908 
13909   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13910 
13911   // Parameter substitution.
13912   Sema::ExtParameterInfoBuilder extParamInfos;
13913   if (getDerived().TransformFunctionTypeParams(
13914           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13915           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13916           extParamInfos)) {
13917     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13918     return ExprError();
13919   }
13920 
13921   QualType exprResultType =
13922       getDerived().TransformType(exprFunctionType->getReturnType());
13923 
13924   auto epi = exprFunctionType->getExtProtoInfo();
13925   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13926 
13927   QualType functionType =
13928     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13929   blockScope->FunctionType = functionType;
13930 
13931   // Set the parameters on the block decl.
13932   if (!params.empty())
13933     blockScope->TheDecl->setParams(params);
13934 
13935   if (!oldBlock->blockMissingReturnType()) {
13936     blockScope->HasImplicitReturnType = false;
13937     blockScope->ReturnType = exprResultType;
13938   }
13939 
13940   // Transform the body
13941   StmtResult body = getDerived().TransformStmt(E->getBody());
13942   if (body.isInvalid()) {
13943     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13944     return ExprError();
13945   }
13946 
13947 #ifndef NDEBUG
13948   // In builds with assertions, make sure that we captured everything we
13949   // captured before.
13950   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13951     for (const auto &I : oldBlock->captures()) {
13952       VarDecl *oldCapture = I.getVariable();
13953 
13954       // Ignore parameter packs.
13955       if (oldCapture->isParameterPack())
13956         continue;
13957 
13958       VarDecl *newCapture =
13959         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13960                                                  oldCapture));
13961       assert(blockScope->CaptureMap.count(newCapture));
13962     }
13963     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13964   }
13965 #endif
13966 
13967   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13968                                     /*Scope=*/nullptr);
13969 }
13970 
13971 template<typename Derived>
13972 ExprResult
13973 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13974   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13975   if (SrcExpr.isInvalid())
13976     return ExprError();
13977 
13978   QualType Type = getDerived().TransformType(E->getType());
13979 
13980   return SemaRef.BuildAsTypeExpr(SrcExpr.get(), Type, E->getBuiltinLoc(),
13981                                  E->getRParenLoc());
13982 }
13983 
13984 template<typename Derived>
13985 ExprResult
13986 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13987   bool ArgumentChanged = false;
13988   SmallVector<Expr*, 8> SubExprs;
13989   SubExprs.reserve(E->getNumSubExprs());
13990   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13991                                   SubExprs, &ArgumentChanged))
13992     return ExprError();
13993 
13994   if (!getDerived().AlwaysRebuild() &&
13995       !ArgumentChanged)
13996     return E;
13997 
13998   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13999                                         E->getOp(), E->getRParenLoc());
14000 }
14001 
14002 //===----------------------------------------------------------------------===//
14003 // Type reconstruction
14004 //===----------------------------------------------------------------------===//
14005 
14006 template<typename Derived>
14007 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
14008                                                     SourceLocation Star) {
14009   return SemaRef.BuildPointerType(PointeeType, Star,
14010                                   getDerived().getBaseEntity());
14011 }
14012 
14013 template<typename Derived>
14014 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
14015                                                          SourceLocation Star) {
14016   return SemaRef.BuildBlockPointerType(PointeeType, Star,
14017                                        getDerived().getBaseEntity());
14018 }
14019 
14020 template<typename Derived>
14021 QualType
14022 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
14023                                              bool WrittenAsLValue,
14024                                              SourceLocation Sigil) {
14025   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
14026                                     Sigil, getDerived().getBaseEntity());
14027 }
14028 
14029 template<typename Derived>
14030 QualType
14031 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
14032                                                  QualType ClassType,
14033                                                  SourceLocation Sigil) {
14034   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
14035                                         getDerived().getBaseEntity());
14036 }
14037 
14038 template<typename Derived>
14039 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
14040            const ObjCTypeParamDecl *Decl,
14041            SourceLocation ProtocolLAngleLoc,
14042            ArrayRef<ObjCProtocolDecl *> Protocols,
14043            ArrayRef<SourceLocation> ProtocolLocs,
14044            SourceLocation ProtocolRAngleLoc) {
14045   return SemaRef.BuildObjCTypeParamType(Decl,
14046                                         ProtocolLAngleLoc, Protocols,
14047                                         ProtocolLocs, ProtocolRAngleLoc,
14048                                         /*FailOnError=*/true);
14049 }
14050 
14051 template<typename Derived>
14052 QualType TreeTransform<Derived>::RebuildObjCObjectType(
14053            QualType BaseType,
14054            SourceLocation Loc,
14055            SourceLocation TypeArgsLAngleLoc,
14056            ArrayRef<TypeSourceInfo *> TypeArgs,
14057            SourceLocation TypeArgsRAngleLoc,
14058            SourceLocation ProtocolLAngleLoc,
14059            ArrayRef<ObjCProtocolDecl *> Protocols,
14060            ArrayRef<SourceLocation> ProtocolLocs,
14061            SourceLocation ProtocolRAngleLoc) {
14062   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
14063                                      TypeArgs, TypeArgsRAngleLoc,
14064                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
14065                                      ProtocolRAngleLoc,
14066                                      /*FailOnError=*/true);
14067 }
14068 
14069 template<typename Derived>
14070 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
14071            QualType PointeeType,
14072            SourceLocation Star) {
14073   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
14074 }
14075 
14076 template<typename Derived>
14077 QualType
14078 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
14079                                          ArrayType::ArraySizeModifier SizeMod,
14080                                          const llvm::APInt *Size,
14081                                          Expr *SizeExpr,
14082                                          unsigned IndexTypeQuals,
14083                                          SourceRange BracketsRange) {
14084   if (SizeExpr || !Size)
14085     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
14086                                   IndexTypeQuals, BracketsRange,
14087                                   getDerived().getBaseEntity());
14088 
14089   QualType Types[] = {
14090     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
14091     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
14092     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
14093   };
14094   const unsigned NumTypes = llvm::array_lengthof(Types);
14095   QualType SizeType;
14096   for (unsigned I = 0; I != NumTypes; ++I)
14097     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
14098       SizeType = Types[I];
14099       break;
14100     }
14101 
14102   // Note that we can return a VariableArrayType here in the case where
14103   // the element type was a dependent VariableArrayType.
14104   IntegerLiteral *ArraySize
14105       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
14106                                /*FIXME*/BracketsRange.getBegin());
14107   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
14108                                 IndexTypeQuals, BracketsRange,
14109                                 getDerived().getBaseEntity());
14110 }
14111 
14112 template<typename Derived>
14113 QualType
14114 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14115                                                  ArrayType::ArraySizeModifier SizeMod,
14116                                                  const llvm::APInt &Size,
14117                                                  Expr *SizeExpr,
14118                                                  unsigned IndexTypeQuals,
14119                                                  SourceRange BracketsRange) {
14120   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14121                                         IndexTypeQuals, BracketsRange);
14122 }
14123 
14124 template<typename Derived>
14125 QualType
14126 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14127                                           ArrayType::ArraySizeModifier SizeMod,
14128                                                  unsigned IndexTypeQuals,
14129                                                    SourceRange BracketsRange) {
14130   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14131                                        IndexTypeQuals, BracketsRange);
14132 }
14133 
14134 template<typename Derived>
14135 QualType
14136 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14137                                           ArrayType::ArraySizeModifier SizeMod,
14138                                                  Expr *SizeExpr,
14139                                                  unsigned IndexTypeQuals,
14140                                                  SourceRange BracketsRange) {
14141   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14142                                        SizeExpr,
14143                                        IndexTypeQuals, BracketsRange);
14144 }
14145 
14146 template<typename Derived>
14147 QualType
14148 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14149                                           ArrayType::ArraySizeModifier SizeMod,
14150                                                        Expr *SizeExpr,
14151                                                        unsigned IndexTypeQuals,
14152                                                    SourceRange BracketsRange) {
14153   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14154                                        SizeExpr,
14155                                        IndexTypeQuals, BracketsRange);
14156 }
14157 
14158 template <typename Derived>
14159 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14160     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14161   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14162                                           AttributeLoc);
14163 }
14164 
14165 template <typename Derived>
14166 QualType
14167 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14168                                           unsigned NumElements,
14169                                           VectorType::VectorKind VecKind) {
14170   // FIXME: semantic checking!
14171   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14172 }
14173 
14174 template <typename Derived>
14175 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14176     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14177     VectorType::VectorKind VecKind) {
14178   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14179 }
14180 
14181 template<typename Derived>
14182 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14183                                                       unsigned NumElements,
14184                                                  SourceLocation AttributeLoc) {
14185   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14186                           NumElements, true);
14187   IntegerLiteral *VectorSize
14188     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14189                              AttributeLoc);
14190   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14191 }
14192 
14193 template<typename Derived>
14194 QualType
14195 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14196                                                            Expr *SizeExpr,
14197                                                   SourceLocation AttributeLoc) {
14198   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14199 }
14200 
14201 template <typename Derived>
14202 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14203     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14204   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14205                                                NumColumns);
14206 }
14207 
14208 template <typename Derived>
14209 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14210     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14211     SourceLocation AttributeLoc) {
14212   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14213                                  AttributeLoc);
14214 }
14215 
14216 template<typename Derived>
14217 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14218     QualType T,
14219     MutableArrayRef<QualType> ParamTypes,
14220     const FunctionProtoType::ExtProtoInfo &EPI) {
14221   return SemaRef.BuildFunctionType(T, ParamTypes,
14222                                    getDerived().getBaseLocation(),
14223                                    getDerived().getBaseEntity(),
14224                                    EPI);
14225 }
14226 
14227 template<typename Derived>
14228 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14229   return SemaRef.Context.getFunctionNoProtoType(T);
14230 }
14231 
14232 template<typename Derived>
14233 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14234                                                             Decl *D) {
14235   assert(D && "no decl found");
14236   if (D->isInvalidDecl()) return QualType();
14237 
14238   // FIXME: Doesn't account for ObjCInterfaceDecl!
14239   TypeDecl *Ty;
14240   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14241     // A valid resolved using typename pack expansion decl can have multiple
14242     // UsingDecls, but they must each have exactly one type, and it must be
14243     // the same type in every case. But we must have at least one expansion!
14244     if (UPD->expansions().empty()) {
14245       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14246           << UPD->isCXXClassMember() << UPD;
14247       return QualType();
14248     }
14249 
14250     // We might still have some unresolved types. Try to pick a resolved type
14251     // if we can. The final instantiation will check that the remaining
14252     // unresolved types instantiate to the type we pick.
14253     QualType FallbackT;
14254     QualType T;
14255     for (auto *E : UPD->expansions()) {
14256       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14257       if (ThisT.isNull())
14258         continue;
14259       else if (ThisT->getAs<UnresolvedUsingType>())
14260         FallbackT = ThisT;
14261       else if (T.isNull())
14262         T = ThisT;
14263       else
14264         assert(getSema().Context.hasSameType(ThisT, T) &&
14265                "mismatched resolved types in using pack expansion");
14266     }
14267     return T.isNull() ? FallbackT : T;
14268   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14269     assert(Using->hasTypename() &&
14270            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14271 
14272     // A valid resolved using typename decl points to exactly one type decl.
14273     assert(++Using->shadow_begin() == Using->shadow_end());
14274     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14275   } else {
14276     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14277            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14278     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14279   }
14280 
14281   return SemaRef.Context.getTypeDeclType(Ty);
14282 }
14283 
14284 template<typename Derived>
14285 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14286                                                        SourceLocation Loc) {
14287   return SemaRef.BuildTypeofExprType(E, Loc);
14288 }
14289 
14290 template<typename Derived>
14291 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14292   return SemaRef.Context.getTypeOfType(Underlying);
14293 }
14294 
14295 template<typename Derived>
14296 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14297                                                      SourceLocation Loc) {
14298   return SemaRef.BuildDecltypeType(E, Loc);
14299 }
14300 
14301 template<typename Derived>
14302 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14303                                             UnaryTransformType::UTTKind UKind,
14304                                             SourceLocation Loc) {
14305   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14306 }
14307 
14308 template<typename Derived>
14309 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14310                                                       TemplateName Template,
14311                                              SourceLocation TemplateNameLoc,
14312                                      TemplateArgumentListInfo &TemplateArgs) {
14313   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14314 }
14315 
14316 template<typename Derived>
14317 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14318                                                    SourceLocation KWLoc) {
14319   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14320 }
14321 
14322 template<typename Derived>
14323 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14324                                                  SourceLocation KWLoc,
14325                                                  bool isReadPipe) {
14326   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14327                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14328 }
14329 
14330 template <typename Derived>
14331 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14332                                                    unsigned NumBits,
14333                                                    SourceLocation Loc) {
14334   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14335                         NumBits, true);
14336   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14337                                                 SemaRef.Context.IntTy, Loc);
14338   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14339 }
14340 
14341 template <typename Derived>
14342 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14343     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14344   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14345 }
14346 
14347 template<typename Derived>
14348 TemplateName
14349 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14350                                             bool TemplateKW,
14351                                             TemplateDecl *Template) {
14352   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14353                                                   Template);
14354 }
14355 
14356 template<typename Derived>
14357 TemplateName
14358 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14359                                             SourceLocation TemplateKWLoc,
14360                                             const IdentifierInfo &Name,
14361                                             SourceLocation NameLoc,
14362                                             QualType ObjectType,
14363                                             NamedDecl *FirstQualifierInScope,
14364                                             bool AllowInjectedClassName) {
14365   UnqualifiedId TemplateName;
14366   TemplateName.setIdentifier(&Name, NameLoc);
14367   Sema::TemplateTy Template;
14368   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14369                               TemplateName, ParsedType::make(ObjectType),
14370                               /*EnteringContext=*/false, Template,
14371                               AllowInjectedClassName);
14372   return Template.get();
14373 }
14374 
14375 template<typename Derived>
14376 TemplateName
14377 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14378                                             SourceLocation TemplateKWLoc,
14379                                             OverloadedOperatorKind Operator,
14380                                             SourceLocation NameLoc,
14381                                             QualType ObjectType,
14382                                             bool AllowInjectedClassName) {
14383   UnqualifiedId Name;
14384   // FIXME: Bogus location information.
14385   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14386   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14387   Sema::TemplateTy Template;
14388   getSema().ActOnTemplateName(
14389       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14390       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14391   return Template.get();
14392 }
14393 
14394 template<typename Derived>
14395 ExprResult
14396 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14397                                                    SourceLocation OpLoc,
14398                                                    Expr *OrigCallee,
14399                                                    Expr *First,
14400                                                    Expr *Second) {
14401   Expr *Callee = OrigCallee->IgnoreParenCasts();
14402   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14403 
14404   if (First->getObjectKind() == OK_ObjCProperty) {
14405     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14406     if (BinaryOperator::isAssignmentOp(Opc))
14407       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14408                                                  First, Second);
14409     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14410     if (Result.isInvalid())
14411       return ExprError();
14412     First = Result.get();
14413   }
14414 
14415   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14416     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14417     if (Result.isInvalid())
14418       return ExprError();
14419     Second = Result.get();
14420   }
14421 
14422   // Determine whether this should be a builtin operation.
14423   if (Op == OO_Subscript) {
14424     if (!First->getType()->isOverloadableType() &&
14425         !Second->getType()->isOverloadableType())
14426       return getSema().CreateBuiltinArraySubscriptExpr(
14427           First, Callee->getBeginLoc(), Second, OpLoc);
14428   } else if (Op == OO_Arrow) {
14429     // -> is never a builtin operation.
14430     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14431   } else if (Second == nullptr || isPostIncDec) {
14432     if (!First->getType()->isOverloadableType() ||
14433         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14434       // The argument is not of overloadable type, or this is an expression
14435       // of the form &Class::member, so try to create a built-in unary
14436       // operation.
14437       UnaryOperatorKind Opc
14438         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14439 
14440       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14441     }
14442   } else {
14443     if (!First->getType()->isOverloadableType() &&
14444         !Second->getType()->isOverloadableType()) {
14445       // Neither of the arguments is an overloadable type, so try to
14446       // create a built-in binary operation.
14447       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14448       ExprResult Result
14449         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14450       if (Result.isInvalid())
14451         return ExprError();
14452 
14453       return Result;
14454     }
14455   }
14456 
14457   // Compute the transformed set of functions (and function templates) to be
14458   // used during overload resolution.
14459   UnresolvedSet<16> Functions;
14460   bool RequiresADL;
14461 
14462   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14463     Functions.append(ULE->decls_begin(), ULE->decls_end());
14464     // If the overload could not be resolved in the template definition
14465     // (because we had a dependent argument), ADL is performed as part of
14466     // template instantiation.
14467     RequiresADL = ULE->requiresADL();
14468   } else {
14469     // If we've resolved this to a particular non-member function, just call
14470     // that function. If we resolved it to a member function,
14471     // CreateOverloaded* will find that function for us.
14472     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14473     if (!isa<CXXMethodDecl>(ND))
14474       Functions.addDecl(ND);
14475     RequiresADL = false;
14476   }
14477 
14478   // Add any functions found via argument-dependent lookup.
14479   Expr *Args[2] = { First, Second };
14480   unsigned NumArgs = 1 + (Second != nullptr);
14481 
14482   // Create the overloaded operator invocation for unary operators.
14483   if (NumArgs == 1 || isPostIncDec) {
14484     UnaryOperatorKind Opc
14485       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14486     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14487                                            RequiresADL);
14488   }
14489 
14490   if (Op == OO_Subscript) {
14491     SourceLocation LBrace;
14492     SourceLocation RBrace;
14493 
14494     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14495       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14496       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14497       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14498     } else {
14499       LBrace = Callee->getBeginLoc();
14500       RBrace = OpLoc;
14501     }
14502 
14503     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14504                                                       First, Second);
14505   }
14506 
14507   // Create the overloaded operator invocation for binary operators.
14508   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14509   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14510       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14511   if (Result.isInvalid())
14512     return ExprError();
14513 
14514   return Result;
14515 }
14516 
14517 template<typename Derived>
14518 ExprResult
14519 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14520                                                      SourceLocation OperatorLoc,
14521                                                        bool isArrow,
14522                                                        CXXScopeSpec &SS,
14523                                                      TypeSourceInfo *ScopeType,
14524                                                        SourceLocation CCLoc,
14525                                                        SourceLocation TildeLoc,
14526                                         PseudoDestructorTypeStorage Destroyed) {
14527   QualType BaseType = Base->getType();
14528   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14529       (!isArrow && !BaseType->getAs<RecordType>()) ||
14530       (isArrow && BaseType->getAs<PointerType>() &&
14531        !BaseType->castAs<PointerType>()->getPointeeType()
14532                                               ->template getAs<RecordType>())){
14533     // This pseudo-destructor expression is still a pseudo-destructor.
14534     return SemaRef.BuildPseudoDestructorExpr(
14535         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14536         CCLoc, TildeLoc, Destroyed);
14537   }
14538 
14539   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14540   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14541                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14542   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14543   NameInfo.setNamedTypeInfo(DestroyedType);
14544 
14545   // The scope type is now known to be a valid nested name specifier
14546   // component. Tack it on to the end of the nested name specifier.
14547   if (ScopeType) {
14548     if (!ScopeType->getType()->getAs<TagType>()) {
14549       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14550                      diag::err_expected_class_or_namespace)
14551           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14552       return ExprError();
14553     }
14554     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14555               CCLoc);
14556   }
14557 
14558   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14559   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14560                                             OperatorLoc, isArrow,
14561                                             SS, TemplateKWLoc,
14562                                             /*FIXME: FirstQualifier*/ nullptr,
14563                                             NameInfo,
14564                                             /*TemplateArgs*/ nullptr,
14565                                             /*S*/nullptr);
14566 }
14567 
14568 template<typename Derived>
14569 StmtResult
14570 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14571   SourceLocation Loc = S->getBeginLoc();
14572   CapturedDecl *CD = S->getCapturedDecl();
14573   unsigned NumParams = CD->getNumParams();
14574   unsigned ContextParamPos = CD->getContextParamPosition();
14575   SmallVector<Sema::CapturedParamNameType, 4> Params;
14576   for (unsigned I = 0; I < NumParams; ++I) {
14577     if (I != ContextParamPos) {
14578       Params.push_back(
14579              std::make_pair(
14580                   CD->getParam(I)->getName(),
14581                   getDerived().TransformType(CD->getParam(I)->getType())));
14582     } else {
14583       Params.push_back(std::make_pair(StringRef(), QualType()));
14584     }
14585   }
14586   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14587                                      S->getCapturedRegionKind(), Params);
14588   StmtResult Body;
14589   {
14590     Sema::CompoundScopeRAII CompoundScope(getSema());
14591     Body = getDerived().TransformStmt(S->getCapturedStmt());
14592   }
14593 
14594   if (Body.isInvalid()) {
14595     getSema().ActOnCapturedRegionError();
14596     return StmtError();
14597   }
14598 
14599   return getSema().ActOnCapturedRegionEnd(Body.get());
14600 }
14601 
14602 } // end namespace clang
14603 
14604 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14605