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 executable directive.
1550   ///
1551   /// By default, performs semantic analysis to build the new statement.
1552   /// Subclasses may override this routine to provide different behavior.
1553   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1554                                            DeclarationNameInfo DirName,
1555                                            OpenMPDirectiveKind CancelRegion,
1556                                            ArrayRef<OMPClause *> Clauses,
1557                                            Stmt *AStmt, SourceLocation StartLoc,
1558                                            SourceLocation EndLoc) {
1559     return getSema().ActOnOpenMPExecutableDirective(
1560         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1561   }
1562 
1563   /// Build a new OpenMP 'if' clause.
1564   ///
1565   /// By default, performs semantic analysis to build the new OpenMP clause.
1566   /// Subclasses may override this routine to provide different behavior.
1567   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1568                                 Expr *Condition, SourceLocation StartLoc,
1569                                 SourceLocation LParenLoc,
1570                                 SourceLocation NameModifierLoc,
1571                                 SourceLocation ColonLoc,
1572                                 SourceLocation EndLoc) {
1573     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1574                                          LParenLoc, NameModifierLoc, ColonLoc,
1575                                          EndLoc);
1576   }
1577 
1578   /// Build a new OpenMP 'final' clause.
1579   ///
1580   /// By default, performs semantic analysis to build the new OpenMP clause.
1581   /// Subclasses may override this routine to provide different behavior.
1582   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1583                                    SourceLocation LParenLoc,
1584                                    SourceLocation EndLoc) {
1585     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1586                                             EndLoc);
1587   }
1588 
1589   /// Build a new OpenMP 'num_threads' clause.
1590   ///
1591   /// By default, performs semantic analysis to build the new OpenMP clause.
1592   /// Subclasses may override this routine to provide different behavior.
1593   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1594                                         SourceLocation StartLoc,
1595                                         SourceLocation LParenLoc,
1596                                         SourceLocation EndLoc) {
1597     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1598                                                  LParenLoc, EndLoc);
1599   }
1600 
1601   /// Build a new OpenMP 'safelen' clause.
1602   ///
1603   /// By default, performs semantic analysis to build the new OpenMP clause.
1604   /// Subclasses may override this routine to provide different behavior.
1605   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1606                                      SourceLocation LParenLoc,
1607                                      SourceLocation EndLoc) {
1608     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1609   }
1610 
1611   /// Build a new OpenMP 'simdlen' clause.
1612   ///
1613   /// By default, performs semantic analysis to build the new OpenMP clause.
1614   /// Subclasses may override this routine to provide different behavior.
1615   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1616                                      SourceLocation LParenLoc,
1617                                      SourceLocation EndLoc) {
1618     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1619   }
1620 
1621   OMPClause *RebuildOMPSizesClause(ArrayRef<Expr *> Sizes,
1622                                    SourceLocation StartLoc,
1623                                    SourceLocation LParenLoc,
1624                                    SourceLocation EndLoc) {
1625     return getSema().ActOnOpenMPSizesClause(Sizes, StartLoc, LParenLoc, EndLoc);
1626   }
1627 
1628   /// Build a new OpenMP 'allocator' clause.
1629   ///
1630   /// By default, performs semantic analysis to build the new OpenMP clause.
1631   /// Subclasses may override this routine to provide different behavior.
1632   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1633                                        SourceLocation LParenLoc,
1634                                        SourceLocation EndLoc) {
1635     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1636   }
1637 
1638   /// Build a new OpenMP 'collapse' clause.
1639   ///
1640   /// By default, performs semantic analysis to build the new OpenMP clause.
1641   /// Subclasses may override this routine to provide different behavior.
1642   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1643                                       SourceLocation LParenLoc,
1644                                       SourceLocation EndLoc) {
1645     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1646                                                EndLoc);
1647   }
1648 
1649   /// Build a new OpenMP 'default' clause.
1650   ///
1651   /// By default, performs semantic analysis to build the new OpenMP clause.
1652   /// Subclasses may override this routine to provide different behavior.
1653   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1654                                      SourceLocation StartLoc,
1655                                      SourceLocation LParenLoc,
1656                                      SourceLocation EndLoc) {
1657     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1658                                               StartLoc, LParenLoc, EndLoc);
1659   }
1660 
1661   /// Build a new OpenMP 'proc_bind' clause.
1662   ///
1663   /// By default, performs semantic analysis to build the new OpenMP clause.
1664   /// Subclasses may override this routine to provide different behavior.
1665   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1666                                       SourceLocation KindKwLoc,
1667                                       SourceLocation StartLoc,
1668                                       SourceLocation LParenLoc,
1669                                       SourceLocation EndLoc) {
1670     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1671                                                StartLoc, LParenLoc, EndLoc);
1672   }
1673 
1674   /// Build a new OpenMP 'schedule' clause.
1675   ///
1676   /// By default, performs semantic analysis to build the new OpenMP clause.
1677   /// Subclasses may override this routine to provide different behavior.
1678   OMPClause *RebuildOMPScheduleClause(
1679       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1680       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1681       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1682       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1683     return getSema().ActOnOpenMPScheduleClause(
1684         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1685         CommaLoc, EndLoc);
1686   }
1687 
1688   /// Build a new OpenMP 'ordered' clause.
1689   ///
1690   /// By default, performs semantic analysis to build the new OpenMP clause.
1691   /// Subclasses may override this routine to provide different behavior.
1692   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1693                                      SourceLocation EndLoc,
1694                                      SourceLocation LParenLoc, Expr *Num) {
1695     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1696   }
1697 
1698   /// Build a new OpenMP 'private' clause.
1699   ///
1700   /// By default, performs semantic analysis to build the new OpenMP clause.
1701   /// Subclasses may override this routine to provide different behavior.
1702   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1703                                      SourceLocation StartLoc,
1704                                      SourceLocation LParenLoc,
1705                                      SourceLocation EndLoc) {
1706     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1707                                               EndLoc);
1708   }
1709 
1710   /// Build a new OpenMP 'firstprivate' clause.
1711   ///
1712   /// By default, performs semantic analysis to build the new OpenMP clause.
1713   /// Subclasses may override this routine to provide different behavior.
1714   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1715                                           SourceLocation StartLoc,
1716                                           SourceLocation LParenLoc,
1717                                           SourceLocation EndLoc) {
1718     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1719                                                    EndLoc);
1720   }
1721 
1722   /// Build a new OpenMP 'lastprivate' clause.
1723   ///
1724   /// By default, performs semantic analysis to build the new OpenMP clause.
1725   /// Subclasses may override this routine to provide different behavior.
1726   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1727                                          OpenMPLastprivateModifier LPKind,
1728                                          SourceLocation LPKindLoc,
1729                                          SourceLocation ColonLoc,
1730                                          SourceLocation StartLoc,
1731                                          SourceLocation LParenLoc,
1732                                          SourceLocation EndLoc) {
1733     return getSema().ActOnOpenMPLastprivateClause(
1734         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1735   }
1736 
1737   /// Build a new OpenMP 'shared' clause.
1738   ///
1739   /// By default, performs semantic analysis to build the new OpenMP clause.
1740   /// Subclasses may override this routine to provide different behavior.
1741   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1742                                     SourceLocation StartLoc,
1743                                     SourceLocation LParenLoc,
1744                                     SourceLocation EndLoc) {
1745     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1746                                              EndLoc);
1747   }
1748 
1749   /// Build a new OpenMP 'reduction' clause.
1750   ///
1751   /// By default, performs semantic analysis to build the new statement.
1752   /// Subclasses may override this routine to provide different behavior.
1753   OMPClause *RebuildOMPReductionClause(
1754       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1755       SourceLocation StartLoc, SourceLocation LParenLoc,
1756       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1757       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1758       const DeclarationNameInfo &ReductionId,
1759       ArrayRef<Expr *> UnresolvedReductions) {
1760     return getSema().ActOnOpenMPReductionClause(
1761         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1762         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1763   }
1764 
1765   /// Build a new OpenMP 'task_reduction' clause.
1766   ///
1767   /// By default, performs semantic analysis to build the new statement.
1768   /// Subclasses may override this routine to provide different behavior.
1769   OMPClause *RebuildOMPTaskReductionClause(
1770       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1771       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1772       CXXScopeSpec &ReductionIdScopeSpec,
1773       const DeclarationNameInfo &ReductionId,
1774       ArrayRef<Expr *> UnresolvedReductions) {
1775     return getSema().ActOnOpenMPTaskReductionClause(
1776         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1777         ReductionId, UnresolvedReductions);
1778   }
1779 
1780   /// Build a new OpenMP 'in_reduction' clause.
1781   ///
1782   /// By default, performs semantic analysis to build the new statement.
1783   /// Subclasses may override this routine to provide different behavior.
1784   OMPClause *
1785   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1786                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1787                               SourceLocation EndLoc,
1788                               CXXScopeSpec &ReductionIdScopeSpec,
1789                               const DeclarationNameInfo &ReductionId,
1790                               ArrayRef<Expr *> UnresolvedReductions) {
1791     return getSema().ActOnOpenMPInReductionClause(
1792         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1793         ReductionId, UnresolvedReductions);
1794   }
1795 
1796   /// Build a new OpenMP 'linear' clause.
1797   ///
1798   /// By default, performs semantic analysis to build the new OpenMP clause.
1799   /// Subclasses may override this routine to provide different behavior.
1800   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1801                                     SourceLocation StartLoc,
1802                                     SourceLocation LParenLoc,
1803                                     OpenMPLinearClauseKind Modifier,
1804                                     SourceLocation ModifierLoc,
1805                                     SourceLocation ColonLoc,
1806                                     SourceLocation EndLoc) {
1807     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1808                                              Modifier, ModifierLoc, ColonLoc,
1809                                              EndLoc);
1810   }
1811 
1812   /// Build a new OpenMP 'aligned' clause.
1813   ///
1814   /// By default, performs semantic analysis to build the new OpenMP clause.
1815   /// Subclasses may override this routine to provide different behavior.
1816   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1817                                      SourceLocation StartLoc,
1818                                      SourceLocation LParenLoc,
1819                                      SourceLocation ColonLoc,
1820                                      SourceLocation EndLoc) {
1821     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1822                                               LParenLoc, ColonLoc, EndLoc);
1823   }
1824 
1825   /// Build a new OpenMP 'copyin' clause.
1826   ///
1827   /// By default, performs semantic analysis to build the new OpenMP clause.
1828   /// Subclasses may override this routine to provide different behavior.
1829   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1830                                     SourceLocation StartLoc,
1831                                     SourceLocation LParenLoc,
1832                                     SourceLocation EndLoc) {
1833     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1834                                              EndLoc);
1835   }
1836 
1837   /// Build a new OpenMP 'copyprivate' clause.
1838   ///
1839   /// By default, performs semantic analysis to build the new OpenMP clause.
1840   /// Subclasses may override this routine to provide different behavior.
1841   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1842                                          SourceLocation StartLoc,
1843                                          SourceLocation LParenLoc,
1844                                          SourceLocation EndLoc) {
1845     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1846                                                   EndLoc);
1847   }
1848 
1849   /// Build a new OpenMP 'flush' pseudo clause.
1850   ///
1851   /// By default, performs semantic analysis to build the new OpenMP clause.
1852   /// Subclasses may override this routine to provide different behavior.
1853   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1854                                    SourceLocation StartLoc,
1855                                    SourceLocation LParenLoc,
1856                                    SourceLocation EndLoc) {
1857     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1858                                             EndLoc);
1859   }
1860 
1861   /// Build a new OpenMP 'depobj' pseudo clause.
1862   ///
1863   /// By default, performs semantic analysis to build the new OpenMP clause.
1864   /// Subclasses may override this routine to provide different behavior.
1865   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1866                                     SourceLocation LParenLoc,
1867                                     SourceLocation EndLoc) {
1868     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1869                                              EndLoc);
1870   }
1871 
1872   /// Build a new OpenMP 'depend' pseudo clause.
1873   ///
1874   /// By default, performs semantic analysis to build the new OpenMP clause.
1875   /// Subclasses may override this routine to provide different behavior.
1876   OMPClause *
1877   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1878                          SourceLocation DepLoc, SourceLocation ColonLoc,
1879                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1880                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1881     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1882                                              ColonLoc, VarList, StartLoc,
1883                                              LParenLoc, EndLoc);
1884   }
1885 
1886   /// Build a new OpenMP 'device' clause.
1887   ///
1888   /// By default, performs semantic analysis to build the new statement.
1889   /// Subclasses may override this routine to provide different behavior.
1890   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1891                                     Expr *Device, SourceLocation StartLoc,
1892                                     SourceLocation LParenLoc,
1893                                     SourceLocation ModifierLoc,
1894                                     SourceLocation EndLoc) {
1895     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1896                                              LParenLoc, ModifierLoc, EndLoc);
1897   }
1898 
1899   /// Build a new OpenMP 'map' clause.
1900   ///
1901   /// By default, performs semantic analysis to build the new OpenMP clause.
1902   /// Subclasses may override this routine to provide different behavior.
1903   OMPClause *RebuildOMPMapClause(
1904       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1905       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1906       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1907       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1908       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1909       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1910     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1911                                           MapperIdScopeSpec, MapperId, MapType,
1912                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1913                                           VarList, Locs, UnresolvedMappers);
1914   }
1915 
1916   /// Build a new OpenMP 'allocate' clause.
1917   ///
1918   /// By default, performs semantic analysis to build the new OpenMP clause.
1919   /// Subclasses may override this routine to provide different behavior.
1920   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1921                                       SourceLocation StartLoc,
1922                                       SourceLocation LParenLoc,
1923                                       SourceLocation ColonLoc,
1924                                       SourceLocation EndLoc) {
1925     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1926                                                LParenLoc, ColonLoc, EndLoc);
1927   }
1928 
1929   /// Build a new OpenMP 'num_teams' clause.
1930   ///
1931   /// By default, performs semantic analysis to build the new statement.
1932   /// Subclasses may override this routine to provide different behavior.
1933   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1934                                       SourceLocation LParenLoc,
1935                                       SourceLocation EndLoc) {
1936     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1937                                                EndLoc);
1938   }
1939 
1940   /// Build a new OpenMP 'thread_limit' clause.
1941   ///
1942   /// By default, performs semantic analysis to build the new statement.
1943   /// Subclasses may override this routine to provide different behavior.
1944   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1945                                          SourceLocation StartLoc,
1946                                          SourceLocation LParenLoc,
1947                                          SourceLocation EndLoc) {
1948     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1949                                                   LParenLoc, EndLoc);
1950   }
1951 
1952   /// Build a new OpenMP 'priority' clause.
1953   ///
1954   /// By default, performs semantic analysis to build the new statement.
1955   /// Subclasses may override this routine to provide different behavior.
1956   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1957                                       SourceLocation LParenLoc,
1958                                       SourceLocation EndLoc) {
1959     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1960                                                EndLoc);
1961   }
1962 
1963   /// Build a new OpenMP 'grainsize' clause.
1964   ///
1965   /// By default, performs semantic analysis to build the new statement.
1966   /// Subclasses may override this routine to provide different behavior.
1967   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1968                                        SourceLocation LParenLoc,
1969                                        SourceLocation EndLoc) {
1970     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1971                                                 EndLoc);
1972   }
1973 
1974   /// Build a new OpenMP 'num_tasks' clause.
1975   ///
1976   /// By default, performs semantic analysis to build the new statement.
1977   /// Subclasses may override this routine to provide different behavior.
1978   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1979                                       SourceLocation LParenLoc,
1980                                       SourceLocation EndLoc) {
1981     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1982                                                EndLoc);
1983   }
1984 
1985   /// Build a new OpenMP 'hint' clause.
1986   ///
1987   /// By default, performs semantic analysis to build the new statement.
1988   /// Subclasses may override this routine to provide different behavior.
1989   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1990                                   SourceLocation LParenLoc,
1991                                   SourceLocation EndLoc) {
1992     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1993   }
1994 
1995   /// Build a new OpenMP 'detach' clause.
1996   ///
1997   /// By default, performs semantic analysis to build the new statement.
1998   /// Subclasses may override this routine to provide different behavior.
1999   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
2000                                     SourceLocation LParenLoc,
2001                                     SourceLocation EndLoc) {
2002     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
2003   }
2004 
2005   /// Build a new OpenMP 'dist_schedule' clause.
2006   ///
2007   /// By default, performs semantic analysis to build the new OpenMP clause.
2008   /// Subclasses may override this routine to provide different behavior.
2009   OMPClause *
2010   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2011                                Expr *ChunkSize, SourceLocation StartLoc,
2012                                SourceLocation LParenLoc, SourceLocation KindLoc,
2013                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2014     return getSema().ActOnOpenMPDistScheduleClause(
2015         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2016   }
2017 
2018   /// Build a new OpenMP 'to' clause.
2019   ///
2020   /// By default, performs semantic analysis to build the new statement.
2021   /// Subclasses may override this routine to provide different behavior.
2022   OMPClause *
2023   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2024                      ArrayRef<SourceLocation> MotionModifiersLoc,
2025                      CXXScopeSpec &MapperIdScopeSpec,
2026                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2027                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2028                      ArrayRef<Expr *> UnresolvedMappers) {
2029     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2030                                          MapperIdScopeSpec, MapperId, ColonLoc,
2031                                          VarList, Locs, UnresolvedMappers);
2032   }
2033 
2034   /// Build a new OpenMP 'from' clause.
2035   ///
2036   /// By default, performs semantic analysis to build the new statement.
2037   /// Subclasses may override this routine to provide different behavior.
2038   OMPClause *
2039   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2040                        ArrayRef<SourceLocation> MotionModifiersLoc,
2041                        CXXScopeSpec &MapperIdScopeSpec,
2042                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2043                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2044                        ArrayRef<Expr *> UnresolvedMappers) {
2045     return getSema().ActOnOpenMPFromClause(
2046         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2047         ColonLoc, VarList, Locs, UnresolvedMappers);
2048   }
2049 
2050   /// Build a new OpenMP 'use_device_ptr' clause.
2051   ///
2052   /// By default, performs semantic analysis to build the new OpenMP clause.
2053   /// Subclasses may override this routine to provide different behavior.
2054   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2055                                           const OMPVarListLocTy &Locs) {
2056     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2057   }
2058 
2059   /// Build a new OpenMP 'use_device_addr' clause.
2060   ///
2061   /// By default, performs semantic analysis to build the new OpenMP clause.
2062   /// Subclasses may override this routine to provide different behavior.
2063   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2064                                            const OMPVarListLocTy &Locs) {
2065     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2066   }
2067 
2068   /// Build a new OpenMP 'is_device_ptr' clause.
2069   ///
2070   /// By default, performs semantic analysis to build the new OpenMP clause.
2071   /// Subclasses may override this routine to provide different behavior.
2072   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2073                                          const OMPVarListLocTy &Locs) {
2074     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2075   }
2076 
2077   /// Build a new OpenMP 'defaultmap' clause.
2078   ///
2079   /// By default, performs semantic analysis to build the new OpenMP clause.
2080   /// Subclasses may override this routine to provide different behavior.
2081   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2082                                         OpenMPDefaultmapClauseKind Kind,
2083                                         SourceLocation StartLoc,
2084                                         SourceLocation LParenLoc,
2085                                         SourceLocation MLoc,
2086                                         SourceLocation KindLoc,
2087                                         SourceLocation EndLoc) {
2088     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2089                                                  MLoc, KindLoc, EndLoc);
2090   }
2091 
2092   /// Build a new OpenMP 'nontemporal' clause.
2093   ///
2094   /// By default, performs semantic analysis to build the new OpenMP clause.
2095   /// Subclasses may override this routine to provide different behavior.
2096   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2097                                          SourceLocation StartLoc,
2098                                          SourceLocation LParenLoc,
2099                                          SourceLocation EndLoc) {
2100     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2101                                                   EndLoc);
2102   }
2103 
2104   /// Build a new OpenMP 'inclusive' clause.
2105   ///
2106   /// By default, performs semantic analysis to build the new OpenMP clause.
2107   /// Subclasses may override this routine to provide different behavior.
2108   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2109                                        SourceLocation StartLoc,
2110                                        SourceLocation LParenLoc,
2111                                        SourceLocation EndLoc) {
2112     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2113                                                 EndLoc);
2114   }
2115 
2116   /// Build a new OpenMP 'exclusive' clause.
2117   ///
2118   /// By default, performs semantic analysis to build the new OpenMP clause.
2119   /// Subclasses may override this routine to provide different behavior.
2120   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2121                                        SourceLocation StartLoc,
2122                                        SourceLocation LParenLoc,
2123                                        SourceLocation EndLoc) {
2124     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2125                                                 EndLoc);
2126   }
2127 
2128   /// Build a new OpenMP 'uses_allocators' clause.
2129   ///
2130   /// By default, performs semantic analysis to build the new OpenMP clause.
2131   /// Subclasses may override this routine to provide different behavior.
2132   OMPClause *RebuildOMPUsesAllocatorsClause(
2133       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2134       SourceLocation LParenLoc, SourceLocation EndLoc) {
2135     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2136                                                     Data);
2137   }
2138 
2139   /// Build a new OpenMP 'affinity' clause.
2140   ///
2141   /// By default, performs semantic analysis to build the new OpenMP clause.
2142   /// Subclasses may override this routine to provide different behavior.
2143   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2144                                       SourceLocation LParenLoc,
2145                                       SourceLocation ColonLoc,
2146                                       SourceLocation EndLoc, Expr *Modifier,
2147                                       ArrayRef<Expr *> Locators) {
2148     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2149                                                EndLoc, Modifier, Locators);
2150   }
2151 
2152   /// Build a new OpenMP 'order' clause.
2153   ///
2154   /// By default, performs semantic analysis to build the new OpenMP clause.
2155   /// Subclasses may override this routine to provide different behavior.
2156   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2157                                    SourceLocation KindKwLoc,
2158                                    SourceLocation StartLoc,
2159                                    SourceLocation LParenLoc,
2160                                    SourceLocation EndLoc) {
2161     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2162                                             LParenLoc, EndLoc);
2163   }
2164 
2165   /// Rebuild the operand to an Objective-C \@synchronized statement.
2166   ///
2167   /// By default, performs semantic analysis to build the new statement.
2168   /// Subclasses may override this routine to provide different behavior.
2169   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2170                                               Expr *object) {
2171     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2172   }
2173 
2174   /// Build a new Objective-C \@synchronized statement.
2175   ///
2176   /// By default, performs semantic analysis to build the new statement.
2177   /// Subclasses may override this routine to provide different behavior.
2178   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2179                                            Expr *Object, Stmt *Body) {
2180     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2181   }
2182 
2183   /// Build a new Objective-C \@autoreleasepool statement.
2184   ///
2185   /// By default, performs semantic analysis to build the new statement.
2186   /// Subclasses may override this routine to provide different behavior.
2187   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2188                                             Stmt *Body) {
2189     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2190   }
2191 
2192   /// Build a new Objective-C fast enumeration statement.
2193   ///
2194   /// By default, performs semantic analysis to build the new statement.
2195   /// Subclasses may override this routine to provide different behavior.
2196   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2197                                           Stmt *Element,
2198                                           Expr *Collection,
2199                                           SourceLocation RParenLoc,
2200                                           Stmt *Body) {
2201     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2202                                                 Element,
2203                                                 Collection,
2204                                                 RParenLoc);
2205     if (ForEachStmt.isInvalid())
2206       return StmtError();
2207 
2208     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2209   }
2210 
2211   /// Build a new C++ exception declaration.
2212   ///
2213   /// By default, performs semantic analysis to build the new decaration.
2214   /// Subclasses may override this routine to provide different behavior.
2215   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2216                                 TypeSourceInfo *Declarator,
2217                                 SourceLocation StartLoc,
2218                                 SourceLocation IdLoc,
2219                                 IdentifierInfo *Id) {
2220     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2221                                                        StartLoc, IdLoc, Id);
2222     if (Var)
2223       getSema().CurContext->addDecl(Var);
2224     return Var;
2225   }
2226 
2227   /// Build a new C++ catch statement.
2228   ///
2229   /// By default, performs semantic analysis to build the new statement.
2230   /// Subclasses may override this routine to provide different behavior.
2231   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2232                                  VarDecl *ExceptionDecl,
2233                                  Stmt *Handler) {
2234     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2235                                                       Handler));
2236   }
2237 
2238   /// Build a new C++ try 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 RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2243                                ArrayRef<Stmt *> Handlers) {
2244     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2245   }
2246 
2247   /// Build a new C++0x range-based for statement.
2248   ///
2249   /// By default, performs semantic analysis to build the new statement.
2250   /// Subclasses may override this routine to provide different behavior.
2251   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2252                                     SourceLocation CoawaitLoc, Stmt *Init,
2253                                     SourceLocation ColonLoc, Stmt *Range,
2254                                     Stmt *Begin, Stmt *End, Expr *Cond,
2255                                     Expr *Inc, Stmt *LoopVar,
2256                                     SourceLocation RParenLoc) {
2257     // If we've just learned that the range is actually an Objective-C
2258     // collection, treat this as an Objective-C fast enumeration loop.
2259     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2260       if (RangeStmt->isSingleDecl()) {
2261         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2262           if (RangeVar->isInvalidDecl())
2263             return StmtError();
2264 
2265           Expr *RangeExpr = RangeVar->getInit();
2266           if (!RangeExpr->isTypeDependent() &&
2267               RangeExpr->getType()->isObjCObjectPointerType()) {
2268             // FIXME: Support init-statements in Objective-C++20 ranged for
2269             // statement.
2270             if (Init) {
2271               return SemaRef.Diag(Init->getBeginLoc(),
2272                                   diag::err_objc_for_range_init_stmt)
2273                          << Init->getSourceRange();
2274             }
2275             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2276                                                         RangeExpr, RParenLoc);
2277           }
2278         }
2279       }
2280     }
2281 
2282     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2283                                           Range, Begin, End, Cond, Inc, LoopVar,
2284                                           RParenLoc, Sema::BFRK_Rebuild);
2285   }
2286 
2287   /// Build a new C++0x range-based for statement.
2288   ///
2289   /// By default, performs semantic analysis to build the new statement.
2290   /// Subclasses may override this routine to provide different behavior.
2291   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2292                                           bool IsIfExists,
2293                                           NestedNameSpecifierLoc QualifierLoc,
2294                                           DeclarationNameInfo NameInfo,
2295                                           Stmt *Nested) {
2296     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2297                                                 QualifierLoc, NameInfo, Nested);
2298   }
2299 
2300   /// Attach body to a C++0x range-based for statement.
2301   ///
2302   /// By default, performs semantic analysis to finish the new statement.
2303   /// Subclasses may override this routine to provide different behavior.
2304   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2305     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2306   }
2307 
2308   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2309                                Stmt *TryBlock, Stmt *Handler) {
2310     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2311   }
2312 
2313   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2314                                   Stmt *Block) {
2315     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2316   }
2317 
2318   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2319     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2320   }
2321 
2322   /// Build a new predefined expression.
2323   ///
2324   /// By default, performs semantic analysis to build the new expression.
2325   /// Subclasses may override this routine to provide different behavior.
2326   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2327                                    PredefinedExpr::IdentKind IK) {
2328     return getSema().BuildPredefinedExpr(Loc, IK);
2329   }
2330 
2331   /// Build a new expression that references a declaration.
2332   ///
2333   /// By default, performs semantic analysis to build the new expression.
2334   /// Subclasses may override this routine to provide different behavior.
2335   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2336                                         LookupResult &R,
2337                                         bool RequiresADL) {
2338     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2339   }
2340 
2341 
2342   /// Build a new expression that references a declaration.
2343   ///
2344   /// By default, performs semantic analysis to build the new expression.
2345   /// Subclasses may override this routine to provide different behavior.
2346   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2347                                 ValueDecl *VD,
2348                                 const DeclarationNameInfo &NameInfo,
2349                                 NamedDecl *Found,
2350                                 TemplateArgumentListInfo *TemplateArgs) {
2351     CXXScopeSpec SS;
2352     SS.Adopt(QualifierLoc);
2353     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2354                                               TemplateArgs);
2355   }
2356 
2357   /// Build a new expression in parentheses.
2358   ///
2359   /// By default, performs semantic analysis to build the new expression.
2360   /// Subclasses may override this routine to provide different behavior.
2361   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2362                                     SourceLocation RParen) {
2363     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2364   }
2365 
2366   /// Build a new pseudo-destructor expression.
2367   ///
2368   /// By default, performs semantic analysis to build the new expression.
2369   /// Subclasses may override this routine to provide different behavior.
2370   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2371                                             SourceLocation OperatorLoc,
2372                                             bool isArrow,
2373                                             CXXScopeSpec &SS,
2374                                             TypeSourceInfo *ScopeType,
2375                                             SourceLocation CCLoc,
2376                                             SourceLocation TildeLoc,
2377                                         PseudoDestructorTypeStorage Destroyed);
2378 
2379   /// Build a new unary operator expression.
2380   ///
2381   /// By default, performs semantic analysis to build the new expression.
2382   /// Subclasses may override this routine to provide different behavior.
2383   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2384                                         UnaryOperatorKind Opc,
2385                                         Expr *SubExpr) {
2386     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2387   }
2388 
2389   /// Build a new builtin offsetof expression.
2390   ///
2391   /// By default, performs semantic analysis to build the new expression.
2392   /// Subclasses may override this routine to provide different behavior.
2393   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2394                                  TypeSourceInfo *Type,
2395                                  ArrayRef<Sema::OffsetOfComponent> Components,
2396                                  SourceLocation RParenLoc) {
2397     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2398                                           RParenLoc);
2399   }
2400 
2401   /// Build a new sizeof, alignof or vec_step expression with a
2402   /// type argument.
2403   ///
2404   /// By default, performs semantic analysis to build the new expression.
2405   /// Subclasses may override this routine to provide different behavior.
2406   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2407                                          SourceLocation OpLoc,
2408                                          UnaryExprOrTypeTrait ExprKind,
2409                                          SourceRange R) {
2410     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2411   }
2412 
2413   /// Build a new sizeof, alignof or vec step expression with an
2414   /// expression argument.
2415   ///
2416   /// By default, performs semantic analysis to build the new expression.
2417   /// Subclasses may override this routine to provide different behavior.
2418   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2419                                          UnaryExprOrTypeTrait ExprKind,
2420                                          SourceRange R) {
2421     ExprResult Result
2422       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2423     if (Result.isInvalid())
2424       return ExprError();
2425 
2426     return Result;
2427   }
2428 
2429   /// Build a new array subscript expression.
2430   ///
2431   /// By default, performs semantic analysis to build the new expression.
2432   /// Subclasses may override this routine to provide different behavior.
2433   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2434                                              SourceLocation LBracketLoc,
2435                                              Expr *RHS,
2436                                              SourceLocation RBracketLoc) {
2437     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2438                                              LBracketLoc, RHS,
2439                                              RBracketLoc);
2440   }
2441 
2442   /// Build a new matrix subscript expression.
2443   ///
2444   /// By default, performs semantic analysis to build the new expression.
2445   /// Subclasses may override this routine to provide different behavior.
2446   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2447                                         Expr *ColumnIdx,
2448                                         SourceLocation RBracketLoc) {
2449     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2450                                                       RBracketLoc);
2451   }
2452 
2453   /// Build a new array section expression.
2454   ///
2455   /// By default, performs semantic analysis to build the new expression.
2456   /// Subclasses may override this routine to provide different behavior.
2457   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2458                                         Expr *LowerBound,
2459                                         SourceLocation ColonLocFirst,
2460                                         SourceLocation ColonLocSecond,
2461                                         Expr *Length, Expr *Stride,
2462                                         SourceLocation RBracketLoc) {
2463     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2464                                               ColonLocFirst, ColonLocSecond,
2465                                               Length, Stride, RBracketLoc);
2466   }
2467 
2468   /// Build a new array shaping expression.
2469   ///
2470   /// By default, performs semantic analysis to build the new expression.
2471   /// Subclasses may override this routine to provide different behavior.
2472   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2473                                         SourceLocation RParenLoc,
2474                                         ArrayRef<Expr *> Dims,
2475                                         ArrayRef<SourceRange> BracketsRanges) {
2476     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2477                                               BracketsRanges);
2478   }
2479 
2480   /// Build a new iterator expression.
2481   ///
2482   /// By default, performs semantic analysis to build the new expression.
2483   /// Subclasses may override this routine to provide different behavior.
2484   ExprResult RebuildOMPIteratorExpr(
2485       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2486       ArrayRef<Sema::OMPIteratorData> Data) {
2487     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2488                                           LLoc, RLoc, Data);
2489   }
2490 
2491   /// Build a new call expression.
2492   ///
2493   /// By default, performs semantic analysis to build the new expression.
2494   /// Subclasses may override this routine to provide different behavior.
2495   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2496                                    MultiExprArg Args,
2497                                    SourceLocation RParenLoc,
2498                                    Expr *ExecConfig = nullptr) {
2499     return getSema().ActOnCallExpr(
2500         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2501   }
2502 
2503   /// Build a new member access expression.
2504   ///
2505   /// By default, performs semantic analysis to build the new expression.
2506   /// Subclasses may override this routine to provide different behavior.
2507   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2508                                bool isArrow,
2509                                NestedNameSpecifierLoc QualifierLoc,
2510                                SourceLocation TemplateKWLoc,
2511                                const DeclarationNameInfo &MemberNameInfo,
2512                                ValueDecl *Member,
2513                                NamedDecl *FoundDecl,
2514                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2515                                NamedDecl *FirstQualifierInScope) {
2516     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2517                                                                       isArrow);
2518     if (!Member->getDeclName()) {
2519       // We have a reference to an unnamed field.  This is always the
2520       // base of an anonymous struct/union member access, i.e. the
2521       // field is always of record type.
2522       assert(Member->getType()->isRecordType() &&
2523              "unnamed member not of record type?");
2524 
2525       BaseResult =
2526         getSema().PerformObjectMemberConversion(BaseResult.get(),
2527                                                 QualifierLoc.getNestedNameSpecifier(),
2528                                                 FoundDecl, Member);
2529       if (BaseResult.isInvalid())
2530         return ExprError();
2531       Base = BaseResult.get();
2532 
2533       CXXScopeSpec EmptySS;
2534       return getSema().BuildFieldReferenceExpr(
2535           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2536           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2537     }
2538 
2539     CXXScopeSpec SS;
2540     SS.Adopt(QualifierLoc);
2541 
2542     Base = BaseResult.get();
2543     QualType BaseType = Base->getType();
2544 
2545     if (isArrow && !BaseType->isPointerType())
2546       return ExprError();
2547 
2548     // FIXME: this involves duplicating earlier analysis in a lot of
2549     // cases; we should avoid this when possible.
2550     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2551     R.addDecl(FoundDecl);
2552     R.resolveKind();
2553 
2554     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2555                                               SS, TemplateKWLoc,
2556                                               FirstQualifierInScope,
2557                                               R, ExplicitTemplateArgs,
2558                                               /*S*/nullptr);
2559   }
2560 
2561   /// Build a new binary operator expression.
2562   ///
2563   /// By default, performs semantic analysis to build the new expression.
2564   /// Subclasses may override this routine to provide different behavior.
2565   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2566                                          BinaryOperatorKind Opc,
2567                                          Expr *LHS, Expr *RHS) {
2568     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2569   }
2570 
2571   /// Build a new rewritten operator expression.
2572   ///
2573   /// By default, performs semantic analysis to build the new expression.
2574   /// Subclasses may override this routine to provide different behavior.
2575   ExprResult RebuildCXXRewrittenBinaryOperator(
2576       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2577       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2578     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2579                                            RHS, /*RequiresADL*/false);
2580   }
2581 
2582   /// Build a new conditional operator expression.
2583   ///
2584   /// By default, performs semantic analysis to build the new expression.
2585   /// Subclasses may override this routine to provide different behavior.
2586   ExprResult RebuildConditionalOperator(Expr *Cond,
2587                                         SourceLocation QuestionLoc,
2588                                         Expr *LHS,
2589                                         SourceLocation ColonLoc,
2590                                         Expr *RHS) {
2591     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2592                                         LHS, RHS);
2593   }
2594 
2595   /// Build a new C-style cast expression.
2596   ///
2597   /// By default, performs semantic analysis to build the new expression.
2598   /// Subclasses may override this routine to provide different behavior.
2599   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2600                                          TypeSourceInfo *TInfo,
2601                                          SourceLocation RParenLoc,
2602                                          Expr *SubExpr) {
2603     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2604                                          SubExpr);
2605   }
2606 
2607   /// Build a new compound literal 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 RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2612                                               TypeSourceInfo *TInfo,
2613                                               SourceLocation RParenLoc,
2614                                               Expr *Init) {
2615     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2616                                               Init);
2617   }
2618 
2619   /// Build a new extended vector element access expression.
2620   ///
2621   /// By default, performs semantic analysis to build the new expression.
2622   /// Subclasses may override this routine to provide different behavior.
2623   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2624                                                SourceLocation OpLoc,
2625                                                SourceLocation AccessorLoc,
2626                                                IdentifierInfo &Accessor) {
2627 
2628     CXXScopeSpec SS;
2629     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2630     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2631                                               OpLoc, /*IsArrow*/ false,
2632                                               SS, SourceLocation(),
2633                                               /*FirstQualifierInScope*/ nullptr,
2634                                               NameInfo,
2635                                               /* TemplateArgs */ nullptr,
2636                                               /*S*/ nullptr);
2637   }
2638 
2639   /// Build a new initializer list expression.
2640   ///
2641   /// By default, performs semantic analysis to build the new expression.
2642   /// Subclasses may override this routine to provide different behavior.
2643   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2644                              MultiExprArg Inits,
2645                              SourceLocation RBraceLoc) {
2646     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2647   }
2648 
2649   /// Build a new designated initializer expression.
2650   ///
2651   /// By default, performs semantic analysis to build the new expression.
2652   /// Subclasses may override this routine to provide different behavior.
2653   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2654                                              MultiExprArg ArrayExprs,
2655                                              SourceLocation EqualOrColonLoc,
2656                                              bool GNUSyntax,
2657                                              Expr *Init) {
2658     ExprResult Result
2659       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2660                                            Init);
2661     if (Result.isInvalid())
2662       return ExprError();
2663 
2664     return Result;
2665   }
2666 
2667   /// Build a new value-initialized expression.
2668   ///
2669   /// By default, builds the implicit value initialization without performing
2670   /// any semantic analysis. Subclasses may override this routine to provide
2671   /// different behavior.
2672   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2673     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2674   }
2675 
2676   /// Build a new \c va_arg expression.
2677   ///
2678   /// By default, performs semantic analysis to build the new expression.
2679   /// Subclasses may override this routine to provide different behavior.
2680   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2681                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2682                                     SourceLocation RParenLoc) {
2683     return getSema().BuildVAArgExpr(BuiltinLoc,
2684                                     SubExpr, TInfo,
2685                                     RParenLoc);
2686   }
2687 
2688   /// Build a new expression list in parentheses.
2689   ///
2690   /// By default, performs semantic analysis to build the new expression.
2691   /// Subclasses may override this routine to provide different behavior.
2692   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2693                                   MultiExprArg SubExprs,
2694                                   SourceLocation RParenLoc) {
2695     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2696   }
2697 
2698   /// Build a new address-of-label expression.
2699   ///
2700   /// By default, performs semantic analysis, using the name of the label
2701   /// rather than attempting to map the label statement itself.
2702   /// Subclasses may override this routine to provide different behavior.
2703   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2704                                   SourceLocation LabelLoc, LabelDecl *Label) {
2705     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2706   }
2707 
2708   /// Build a new GNU statement expression.
2709   ///
2710   /// By default, performs semantic analysis to build the new expression.
2711   /// Subclasses may override this routine to provide different behavior.
2712   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2713                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2714     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2715                                    TemplateDepth);
2716   }
2717 
2718   /// Build a new __builtin_choose_expr expression.
2719   ///
2720   /// By default, performs semantic analysis to build the new expression.
2721   /// Subclasses may override this routine to provide different behavior.
2722   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2723                                      Expr *Cond, Expr *LHS, Expr *RHS,
2724                                      SourceLocation RParenLoc) {
2725     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2726                                    Cond, LHS, RHS,
2727                                    RParenLoc);
2728   }
2729 
2730   /// Build a new generic selection expression.
2731   ///
2732   /// By default, performs semantic analysis to build the new expression.
2733   /// Subclasses may override this routine to provide different behavior.
2734   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2735                                          SourceLocation DefaultLoc,
2736                                          SourceLocation RParenLoc,
2737                                          Expr *ControllingExpr,
2738                                          ArrayRef<TypeSourceInfo *> Types,
2739                                          ArrayRef<Expr *> Exprs) {
2740     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2741                                                 ControllingExpr, Types, Exprs);
2742   }
2743 
2744   /// Build a new overloaded operator call expression.
2745   ///
2746   /// By default, performs semantic analysis to build the new expression.
2747   /// The semantic analysis provides the behavior of template instantiation,
2748   /// copying with transformations that turn what looks like an overloaded
2749   /// operator call into a use of a builtin operator, performing
2750   /// argument-dependent lookup, etc. Subclasses may override this routine to
2751   /// provide different behavior.
2752   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2753                                               SourceLocation OpLoc,
2754                                               Expr *Callee,
2755                                               Expr *First,
2756                                               Expr *Second);
2757 
2758   /// Build a new C++ "named" cast expression, such as static_cast or
2759   /// reinterpret_cast.
2760   ///
2761   /// By default, this routine dispatches to one of the more-specific routines
2762   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2763   /// Subclasses may override this routine to provide different behavior.
2764   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2765                                            Stmt::StmtClass Class,
2766                                            SourceLocation LAngleLoc,
2767                                            TypeSourceInfo *TInfo,
2768                                            SourceLocation RAngleLoc,
2769                                            SourceLocation LParenLoc,
2770                                            Expr *SubExpr,
2771                                            SourceLocation RParenLoc) {
2772     switch (Class) {
2773     case Stmt::CXXStaticCastExprClass:
2774       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2775                                                    RAngleLoc, LParenLoc,
2776                                                    SubExpr, RParenLoc);
2777 
2778     case Stmt::CXXDynamicCastExprClass:
2779       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2780                                                     RAngleLoc, LParenLoc,
2781                                                     SubExpr, RParenLoc);
2782 
2783     case Stmt::CXXReinterpretCastExprClass:
2784       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2785                                                         RAngleLoc, LParenLoc,
2786                                                         SubExpr,
2787                                                         RParenLoc);
2788 
2789     case Stmt::CXXConstCastExprClass:
2790       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2791                                                    RAngleLoc, LParenLoc,
2792                                                    SubExpr, RParenLoc);
2793 
2794     case Stmt::CXXAddrspaceCastExprClass:
2795       return getDerived().RebuildCXXAddrspaceCastExpr(
2796           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2797 
2798     default:
2799       llvm_unreachable("Invalid C++ named cast");
2800     }
2801   }
2802 
2803   /// Build a new C++ static_cast expression.
2804   ///
2805   /// By default, performs semantic analysis to build the new expression.
2806   /// Subclasses may override this routine to provide different behavior.
2807   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2808                                             SourceLocation LAngleLoc,
2809                                             TypeSourceInfo *TInfo,
2810                                             SourceLocation RAngleLoc,
2811                                             SourceLocation LParenLoc,
2812                                             Expr *SubExpr,
2813                                             SourceLocation RParenLoc) {
2814     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2815                                        TInfo, SubExpr,
2816                                        SourceRange(LAngleLoc, RAngleLoc),
2817                                        SourceRange(LParenLoc, RParenLoc));
2818   }
2819 
2820   /// Build a new C++ dynamic_cast expression.
2821   ///
2822   /// By default, performs semantic analysis to build the new expression.
2823   /// Subclasses may override this routine to provide different behavior.
2824   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2825                                              SourceLocation LAngleLoc,
2826                                              TypeSourceInfo *TInfo,
2827                                              SourceLocation RAngleLoc,
2828                                              SourceLocation LParenLoc,
2829                                              Expr *SubExpr,
2830                                              SourceLocation RParenLoc) {
2831     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2832                                        TInfo, SubExpr,
2833                                        SourceRange(LAngleLoc, RAngleLoc),
2834                                        SourceRange(LParenLoc, RParenLoc));
2835   }
2836 
2837   /// Build a new C++ reinterpret_cast expression.
2838   ///
2839   /// By default, performs semantic analysis to build the new expression.
2840   /// Subclasses may override this routine to provide different behavior.
2841   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2842                                                  SourceLocation LAngleLoc,
2843                                                  TypeSourceInfo *TInfo,
2844                                                  SourceLocation RAngleLoc,
2845                                                  SourceLocation LParenLoc,
2846                                                  Expr *SubExpr,
2847                                                  SourceLocation RParenLoc) {
2848     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2849                                        TInfo, SubExpr,
2850                                        SourceRange(LAngleLoc, RAngleLoc),
2851                                        SourceRange(LParenLoc, RParenLoc));
2852   }
2853 
2854   /// Build a new C++ const_cast expression.
2855   ///
2856   /// By default, performs semantic analysis to build the new expression.
2857   /// Subclasses may override this routine to provide different behavior.
2858   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2859                                            SourceLocation LAngleLoc,
2860                                            TypeSourceInfo *TInfo,
2861                                            SourceLocation RAngleLoc,
2862                                            SourceLocation LParenLoc,
2863                                            Expr *SubExpr,
2864                                            SourceLocation RParenLoc) {
2865     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2866                                        TInfo, SubExpr,
2867                                        SourceRange(LAngleLoc, RAngleLoc),
2868                                        SourceRange(LParenLoc, RParenLoc));
2869   }
2870 
2871   ExprResult
2872   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2873                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2874                               SourceLocation LParenLoc, Expr *SubExpr,
2875                               SourceLocation RParenLoc) {
2876     return getSema().BuildCXXNamedCast(
2877         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2878         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2879   }
2880 
2881   /// Build a new C++ functional-style cast expression.
2882   ///
2883   /// By default, performs semantic analysis to build the new expression.
2884   /// Subclasses may override this routine to provide different behavior.
2885   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2886                                           SourceLocation LParenLoc,
2887                                           Expr *Sub,
2888                                           SourceLocation RParenLoc,
2889                                           bool ListInitialization) {
2890     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2891                                                MultiExprArg(&Sub, 1), RParenLoc,
2892                                                ListInitialization);
2893   }
2894 
2895   /// Build a new C++ __builtin_bit_cast expression.
2896   ///
2897   /// By default, performs semantic analysis to build the new expression.
2898   /// Subclasses may override this routine to provide different behavior.
2899   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2900                                        TypeSourceInfo *TSI, Expr *Sub,
2901                                        SourceLocation RParenLoc) {
2902     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2903   }
2904 
2905   /// Build a new C++ typeid(type) expression.
2906   ///
2907   /// By default, performs semantic analysis to build the new expression.
2908   /// Subclasses may override this routine to provide different behavior.
2909   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2910                                         SourceLocation TypeidLoc,
2911                                         TypeSourceInfo *Operand,
2912                                         SourceLocation RParenLoc) {
2913     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2914                                     RParenLoc);
2915   }
2916 
2917 
2918   /// Build a new C++ typeid(expr) expression.
2919   ///
2920   /// By default, performs semantic analysis to build the new expression.
2921   /// Subclasses may override this routine to provide different behavior.
2922   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2923                                         SourceLocation TypeidLoc,
2924                                         Expr *Operand,
2925                                         SourceLocation RParenLoc) {
2926     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2927                                     RParenLoc);
2928   }
2929 
2930   /// Build a new C++ __uuidof(type) expression.
2931   ///
2932   /// By default, performs semantic analysis to build the new expression.
2933   /// Subclasses may override this routine to provide different behavior.
2934   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2935                                   TypeSourceInfo *Operand,
2936                                   SourceLocation RParenLoc) {
2937     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2938   }
2939 
2940   /// Build a new C++ __uuidof(expr) expression.
2941   ///
2942   /// By default, performs semantic analysis to build the new expression.
2943   /// Subclasses may override this routine to provide different behavior.
2944   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2945                                   Expr *Operand, SourceLocation RParenLoc) {
2946     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2947   }
2948 
2949   /// Build a new C++ "this" expression.
2950   ///
2951   /// By default, builds a new "this" expression without performing any
2952   /// semantic analysis. Subclasses may override this routine to provide
2953   /// different behavior.
2954   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2955                                 QualType ThisType,
2956                                 bool isImplicit) {
2957     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2958   }
2959 
2960   /// Build a new C++ throw expression.
2961   ///
2962   /// By default, performs semantic analysis to build the new expression.
2963   /// Subclasses may override this routine to provide different behavior.
2964   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2965                                  bool IsThrownVariableInScope) {
2966     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2967   }
2968 
2969   /// Build a new C++ default-argument expression.
2970   ///
2971   /// By default, builds a new default-argument expression, which does not
2972   /// require any semantic analysis. Subclasses may override this routine to
2973   /// provide different behavior.
2974   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2975     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2976                                      getSema().CurContext);
2977   }
2978 
2979   /// Build a new C++11 default-initialization expression.
2980   ///
2981   /// By default, builds a new default field initialization expression, which
2982   /// does not require any semantic analysis. Subclasses may override this
2983   /// routine to provide different behavior.
2984   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2985                                        FieldDecl *Field) {
2986     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2987                                       getSema().CurContext);
2988   }
2989 
2990   /// Build a new C++ zero-initialization expression.
2991   ///
2992   /// By default, performs semantic analysis to build the new expression.
2993   /// Subclasses may override this routine to provide different behavior.
2994   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2995                                            SourceLocation LParenLoc,
2996                                            SourceLocation RParenLoc) {
2997     return getSema().BuildCXXTypeConstructExpr(
2998         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2999   }
3000 
3001   /// Build a new C++ "new" expression.
3002   ///
3003   /// By default, performs semantic analysis to build the new expression.
3004   /// Subclasses may override this routine to provide different behavior.
3005   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
3006                                bool UseGlobal,
3007                                SourceLocation PlacementLParen,
3008                                MultiExprArg PlacementArgs,
3009                                SourceLocation PlacementRParen,
3010                                SourceRange TypeIdParens,
3011                                QualType AllocatedType,
3012                                TypeSourceInfo *AllocatedTypeInfo,
3013                                Optional<Expr *> ArraySize,
3014                                SourceRange DirectInitRange,
3015                                Expr *Initializer) {
3016     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3017                                  PlacementLParen,
3018                                  PlacementArgs,
3019                                  PlacementRParen,
3020                                  TypeIdParens,
3021                                  AllocatedType,
3022                                  AllocatedTypeInfo,
3023                                  ArraySize,
3024                                  DirectInitRange,
3025                                  Initializer);
3026   }
3027 
3028   /// Build a new C++ "delete" expression.
3029   ///
3030   /// By default, performs semantic analysis to build the new expression.
3031   /// Subclasses may override this routine to provide different behavior.
3032   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3033                                         bool IsGlobalDelete,
3034                                         bool IsArrayForm,
3035                                         Expr *Operand) {
3036     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3037                                     Operand);
3038   }
3039 
3040   /// Build a new type trait expression.
3041   ///
3042   /// By default, performs semantic analysis to build the new expression.
3043   /// Subclasses may override this routine to provide different behavior.
3044   ExprResult RebuildTypeTrait(TypeTrait Trait,
3045                               SourceLocation StartLoc,
3046                               ArrayRef<TypeSourceInfo *> Args,
3047                               SourceLocation RParenLoc) {
3048     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3049   }
3050 
3051   /// Build a new array type trait expression.
3052   ///
3053   /// By default, performs semantic analysis to build the new expression.
3054   /// Subclasses may override this routine to provide different behavior.
3055   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3056                                    SourceLocation StartLoc,
3057                                    TypeSourceInfo *TSInfo,
3058                                    Expr *DimExpr,
3059                                    SourceLocation RParenLoc) {
3060     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3061   }
3062 
3063   /// Build a new expression trait expression.
3064   ///
3065   /// By default, performs semantic analysis to build the new expression.
3066   /// Subclasses may override this routine to provide different behavior.
3067   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3068                                    SourceLocation StartLoc,
3069                                    Expr *Queried,
3070                                    SourceLocation RParenLoc) {
3071     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3072   }
3073 
3074   /// Build a new (previously unresolved) declaration reference
3075   /// expression.
3076   ///
3077   /// By default, performs semantic analysis to build the new expression.
3078   /// Subclasses may override this routine to provide different behavior.
3079   ExprResult RebuildDependentScopeDeclRefExpr(
3080                                           NestedNameSpecifierLoc QualifierLoc,
3081                                           SourceLocation TemplateKWLoc,
3082                                        const DeclarationNameInfo &NameInfo,
3083                               const TemplateArgumentListInfo *TemplateArgs,
3084                                           bool IsAddressOfOperand,
3085                                           TypeSourceInfo **RecoveryTSI) {
3086     CXXScopeSpec SS;
3087     SS.Adopt(QualifierLoc);
3088 
3089     if (TemplateArgs || TemplateKWLoc.isValid())
3090       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3091                                                     TemplateArgs);
3092 
3093     return getSema().BuildQualifiedDeclarationNameExpr(
3094         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3095   }
3096 
3097   /// Build a new template-id 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 RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3102                                    SourceLocation TemplateKWLoc,
3103                                    LookupResult &R,
3104                                    bool RequiresADL,
3105                               const TemplateArgumentListInfo *TemplateArgs) {
3106     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3107                                          TemplateArgs);
3108   }
3109 
3110   /// Build a new object-construction expression.
3111   ///
3112   /// By default, performs semantic analysis to build the new expression.
3113   /// Subclasses may override this routine to provide different behavior.
3114   ExprResult RebuildCXXConstructExpr(QualType T,
3115                                      SourceLocation Loc,
3116                                      CXXConstructorDecl *Constructor,
3117                                      bool IsElidable,
3118                                      MultiExprArg Args,
3119                                      bool HadMultipleCandidates,
3120                                      bool ListInitialization,
3121                                      bool StdInitListInitialization,
3122                                      bool RequiresZeroInit,
3123                              CXXConstructExpr::ConstructionKind ConstructKind,
3124                                      SourceRange ParenRange) {
3125     // Reconstruct the constructor we originally found, which might be
3126     // different if this is a call to an inherited constructor.
3127     CXXConstructorDecl *FoundCtor = Constructor;
3128     if (Constructor->isInheritingConstructor())
3129       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3130 
3131     SmallVector<Expr*, 8> ConvertedArgs;
3132     if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs))
3133       return ExprError();
3134 
3135     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3136                                            IsElidable,
3137                                            ConvertedArgs,
3138                                            HadMultipleCandidates,
3139                                            ListInitialization,
3140                                            StdInitListInitialization,
3141                                            RequiresZeroInit, ConstructKind,
3142                                            ParenRange);
3143   }
3144 
3145   /// Build a new implicit construction via inherited constructor
3146   /// expression.
3147   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3148                                              CXXConstructorDecl *Constructor,
3149                                              bool ConstructsVBase,
3150                                              bool InheritedFromVBase) {
3151     return new (getSema().Context) CXXInheritedCtorInitExpr(
3152         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3153   }
3154 
3155   /// Build a new object-construction expression.
3156   ///
3157   /// By default, performs semantic analysis to build the new expression.
3158   /// Subclasses may override this routine to provide different behavior.
3159   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3160                                            SourceLocation LParenOrBraceLoc,
3161                                            MultiExprArg Args,
3162                                            SourceLocation RParenOrBraceLoc,
3163                                            bool ListInitialization) {
3164     return getSema().BuildCXXTypeConstructExpr(
3165         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3166   }
3167 
3168   /// Build a new object-construction expression.
3169   ///
3170   /// By default, performs semantic analysis to build the new expression.
3171   /// Subclasses may override this routine to provide different behavior.
3172   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3173                                                SourceLocation LParenLoc,
3174                                                MultiExprArg Args,
3175                                                SourceLocation RParenLoc,
3176                                                bool ListInitialization) {
3177     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3178                                                RParenLoc, ListInitialization);
3179   }
3180 
3181   /// Build a new member reference expression.
3182   ///
3183   /// By default, performs semantic analysis to build the new expression.
3184   /// Subclasses may override this routine to provide different behavior.
3185   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3186                                                 QualType BaseType,
3187                                                 bool IsArrow,
3188                                                 SourceLocation OperatorLoc,
3189                                           NestedNameSpecifierLoc QualifierLoc,
3190                                                 SourceLocation TemplateKWLoc,
3191                                             NamedDecl *FirstQualifierInScope,
3192                                    const DeclarationNameInfo &MemberNameInfo,
3193                               const TemplateArgumentListInfo *TemplateArgs) {
3194     CXXScopeSpec SS;
3195     SS.Adopt(QualifierLoc);
3196 
3197     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3198                                             OperatorLoc, IsArrow,
3199                                             SS, TemplateKWLoc,
3200                                             FirstQualifierInScope,
3201                                             MemberNameInfo,
3202                                             TemplateArgs, /*S*/nullptr);
3203   }
3204 
3205   /// Build a new member reference expression.
3206   ///
3207   /// By default, performs semantic analysis to build the new expression.
3208   /// Subclasses may override this routine to provide different behavior.
3209   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3210                                          SourceLocation OperatorLoc,
3211                                          bool IsArrow,
3212                                          NestedNameSpecifierLoc QualifierLoc,
3213                                          SourceLocation TemplateKWLoc,
3214                                          NamedDecl *FirstQualifierInScope,
3215                                          LookupResult &R,
3216                                 const TemplateArgumentListInfo *TemplateArgs) {
3217     CXXScopeSpec SS;
3218     SS.Adopt(QualifierLoc);
3219 
3220     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3221                                             OperatorLoc, IsArrow,
3222                                             SS, TemplateKWLoc,
3223                                             FirstQualifierInScope,
3224                                             R, TemplateArgs, /*S*/nullptr);
3225   }
3226 
3227   /// Build a new noexcept expression.
3228   ///
3229   /// By default, performs semantic analysis to build the new expression.
3230   /// Subclasses may override this routine to provide different behavior.
3231   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3232     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3233   }
3234 
3235   /// Build a new expression to compute the length of a parameter pack.
3236   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3237                                    NamedDecl *Pack,
3238                                    SourceLocation PackLoc,
3239                                    SourceLocation RParenLoc,
3240                                    Optional<unsigned> Length,
3241                                    ArrayRef<TemplateArgument> PartialArgs) {
3242     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3243                                   RParenLoc, Length, PartialArgs);
3244   }
3245 
3246   /// Build a new expression representing a call to a source location
3247   ///  builtin.
3248   ///
3249   /// By default, performs semantic analysis to build the new expression.
3250   /// Subclasses may override this routine to provide different behavior.
3251   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3252                                   SourceLocation BuiltinLoc,
3253                                   SourceLocation RPLoc,
3254                                   DeclContext *ParentContext) {
3255     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3256   }
3257 
3258   /// Build a new Objective-C boxed expression.
3259   ///
3260   /// By default, performs semantic analysis to build the new expression.
3261   /// Subclasses may override this routine to provide different behavior.
3262   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3263       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3264       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3265       TemplateArgumentListInfo *TALI) {
3266     CXXScopeSpec SS;
3267     SS.Adopt(NNS);
3268     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3269                                                          ConceptNameInfo,
3270                                                          FoundDecl,
3271                                                          NamedConcept, TALI);
3272     if (Result.isInvalid())
3273       return ExprError();
3274     return Result;
3275   }
3276 
3277   /// \brief Build a new requires expression.
3278   ///
3279   /// By default, performs semantic analysis to build the new expression.
3280   /// Subclasses may override this routine to provide different behavior.
3281   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3282                                  RequiresExprBodyDecl *Body,
3283                                  ArrayRef<ParmVarDecl *> LocalParameters,
3284                                  ArrayRef<concepts::Requirement *> Requirements,
3285                                  SourceLocation ClosingBraceLoc) {
3286     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3287                                 LocalParameters, Requirements, ClosingBraceLoc);
3288   }
3289 
3290   concepts::TypeRequirement *
3291   RebuildTypeRequirement(
3292       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3293     return SemaRef.BuildTypeRequirement(SubstDiag);
3294   }
3295 
3296   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3297     return SemaRef.BuildTypeRequirement(T);
3298   }
3299 
3300   concepts::ExprRequirement *
3301   RebuildExprRequirement(
3302       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3303       SourceLocation NoexceptLoc,
3304       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3305     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3306                                         std::move(Ret));
3307   }
3308 
3309   concepts::ExprRequirement *
3310   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3311                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3312     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3313                                         std::move(Ret));
3314   }
3315 
3316   concepts::NestedRequirement *
3317   RebuildNestedRequirement(
3318       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3319     return SemaRef.BuildNestedRequirement(SubstDiag);
3320   }
3321 
3322   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3323     return SemaRef.BuildNestedRequirement(Constraint);
3324   }
3325 
3326   /// \brief Build a new Objective-C boxed expression.
3327   ///
3328   /// By default, performs semantic analysis to build the new expression.
3329   /// Subclasses may override this routine to provide different behavior.
3330   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3331     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3332   }
3333 
3334   /// Build a new Objective-C array literal.
3335   ///
3336   /// By default, performs semantic analysis to build the new expression.
3337   /// Subclasses may override this routine to provide different behavior.
3338   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3339                                      Expr **Elements, unsigned NumElements) {
3340     return getSema().BuildObjCArrayLiteral(Range,
3341                                            MultiExprArg(Elements, NumElements));
3342   }
3343 
3344   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3345                                          Expr *Base, Expr *Key,
3346                                          ObjCMethodDecl *getterMethod,
3347                                          ObjCMethodDecl *setterMethod) {
3348     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3349                                                    getterMethod, setterMethod);
3350   }
3351 
3352   /// Build a new Objective-C dictionary literal.
3353   ///
3354   /// By default, performs semantic analysis to build the new expression.
3355   /// Subclasses may override this routine to provide different behavior.
3356   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3357                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3358     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3359   }
3360 
3361   /// Build a new Objective-C \@encode expression.
3362   ///
3363   /// By default, performs semantic analysis to build the new expression.
3364   /// Subclasses may override this routine to provide different behavior.
3365   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3366                                          TypeSourceInfo *EncodeTypeInfo,
3367                                          SourceLocation RParenLoc) {
3368     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3369   }
3370 
3371   /// Build a new Objective-C class message.
3372   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3373                                           Selector Sel,
3374                                           ArrayRef<SourceLocation> SelectorLocs,
3375                                           ObjCMethodDecl *Method,
3376                                           SourceLocation LBracLoc,
3377                                           MultiExprArg Args,
3378                                           SourceLocation RBracLoc) {
3379     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3380                                      ReceiverTypeInfo->getType(),
3381                                      /*SuperLoc=*/SourceLocation(),
3382                                      Sel, Method, LBracLoc, SelectorLocs,
3383                                      RBracLoc, Args);
3384   }
3385 
3386   /// Build a new Objective-C instance message.
3387   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3388                                           Selector Sel,
3389                                           ArrayRef<SourceLocation> SelectorLocs,
3390                                           ObjCMethodDecl *Method,
3391                                           SourceLocation LBracLoc,
3392                                           MultiExprArg Args,
3393                                           SourceLocation RBracLoc) {
3394     return SemaRef.BuildInstanceMessage(Receiver,
3395                                         Receiver->getType(),
3396                                         /*SuperLoc=*/SourceLocation(),
3397                                         Sel, Method, LBracLoc, SelectorLocs,
3398                                         RBracLoc, Args);
3399   }
3400 
3401   /// Build a new Objective-C instance/class message to 'super'.
3402   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3403                                     Selector Sel,
3404                                     ArrayRef<SourceLocation> SelectorLocs,
3405                                     QualType SuperType,
3406                                     ObjCMethodDecl *Method,
3407                                     SourceLocation LBracLoc,
3408                                     MultiExprArg Args,
3409                                     SourceLocation RBracLoc) {
3410     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3411                                           SuperType,
3412                                           SuperLoc,
3413                                           Sel, Method, LBracLoc, SelectorLocs,
3414                                           RBracLoc, Args)
3415                                       : SemaRef.BuildClassMessage(nullptr,
3416                                           SuperType,
3417                                           SuperLoc,
3418                                           Sel, Method, LBracLoc, SelectorLocs,
3419                                           RBracLoc, Args);
3420 
3421 
3422   }
3423 
3424   /// Build a new Objective-C ivar reference expression.
3425   ///
3426   /// By default, performs semantic analysis to build the new expression.
3427   /// Subclasses may override this routine to provide different behavior.
3428   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3429                                           SourceLocation IvarLoc,
3430                                           bool IsArrow, bool IsFreeIvar) {
3431     CXXScopeSpec SS;
3432     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3433     ExprResult Result = getSema().BuildMemberReferenceExpr(
3434         BaseArg, BaseArg->getType(),
3435         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3436         /*FirstQualifierInScope=*/nullptr, NameInfo,
3437         /*TemplateArgs=*/nullptr,
3438         /*S=*/nullptr);
3439     if (IsFreeIvar && Result.isUsable())
3440       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3441     return Result;
3442   }
3443 
3444   /// Build a new Objective-C property reference expression.
3445   ///
3446   /// By default, performs semantic analysis to build the new expression.
3447   /// Subclasses may override this routine to provide different behavior.
3448   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3449                                         ObjCPropertyDecl *Property,
3450                                         SourceLocation PropertyLoc) {
3451     CXXScopeSpec SS;
3452     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3453     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3454                                               /*FIXME:*/PropertyLoc,
3455                                               /*IsArrow=*/false,
3456                                               SS, SourceLocation(),
3457                                               /*FirstQualifierInScope=*/nullptr,
3458                                               NameInfo,
3459                                               /*TemplateArgs=*/nullptr,
3460                                               /*S=*/nullptr);
3461   }
3462 
3463   /// Build a new Objective-C property reference expression.
3464   ///
3465   /// By default, performs semantic analysis to build the new expression.
3466   /// Subclasses may override this routine to provide different behavior.
3467   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3468                                         ObjCMethodDecl *Getter,
3469                                         ObjCMethodDecl *Setter,
3470                                         SourceLocation PropertyLoc) {
3471     // Since these expressions can only be value-dependent, we do not
3472     // need to perform semantic analysis again.
3473     return Owned(
3474       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3475                                                   VK_LValue, OK_ObjCProperty,
3476                                                   PropertyLoc, Base));
3477   }
3478 
3479   /// Build a new Objective-C "isa" expression.
3480   ///
3481   /// By default, performs semantic analysis to build the new expression.
3482   /// Subclasses may override this routine to provide different behavior.
3483   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3484                                 SourceLocation OpLoc, bool IsArrow) {
3485     CXXScopeSpec SS;
3486     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3487     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3488                                               OpLoc, IsArrow,
3489                                               SS, SourceLocation(),
3490                                               /*FirstQualifierInScope=*/nullptr,
3491                                               NameInfo,
3492                                               /*TemplateArgs=*/nullptr,
3493                                               /*S=*/nullptr);
3494   }
3495 
3496   /// Build a new shuffle vector expression.
3497   ///
3498   /// By default, performs semantic analysis to build the new expression.
3499   /// Subclasses may override this routine to provide different behavior.
3500   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3501                                       MultiExprArg SubExprs,
3502                                       SourceLocation RParenLoc) {
3503     // Find the declaration for __builtin_shufflevector
3504     const IdentifierInfo &Name
3505       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3506     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3507     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3508     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3509 
3510     // Build a reference to the __builtin_shufflevector builtin
3511     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3512     Expr *Callee = new (SemaRef.Context)
3513         DeclRefExpr(SemaRef.Context, Builtin, false,
3514                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3515     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3516     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3517                                        CK_BuiltinFnToFnPtr).get();
3518 
3519     // Build the CallExpr
3520     ExprResult TheCall = CallExpr::Create(
3521         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3522         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3523         FPOptionsOverride());
3524 
3525     // Type-check the __builtin_shufflevector expression.
3526     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3527   }
3528 
3529   /// Build a new convert vector expression.
3530   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3531                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3532                                       SourceLocation RParenLoc) {
3533     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3534                                          BuiltinLoc, RParenLoc);
3535   }
3536 
3537   /// Build a new template argument pack expansion.
3538   ///
3539   /// By default, performs semantic analysis to build a new pack expansion
3540   /// for a template argument. Subclasses may override this routine to provide
3541   /// different behavior.
3542   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3543                                            SourceLocation EllipsisLoc,
3544                                            Optional<unsigned> NumExpansions) {
3545     switch (Pattern.getArgument().getKind()) {
3546     case TemplateArgument::Expression: {
3547       ExprResult Result
3548         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3549                                        EllipsisLoc, NumExpansions);
3550       if (Result.isInvalid())
3551         return TemplateArgumentLoc();
3552 
3553       return TemplateArgumentLoc(Result.get(), Result.get());
3554     }
3555 
3556     case TemplateArgument::Template:
3557       return TemplateArgumentLoc(
3558           SemaRef.Context,
3559           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3560                            NumExpansions),
3561           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3562           EllipsisLoc);
3563 
3564     case TemplateArgument::Null:
3565     case TemplateArgument::Integral:
3566     case TemplateArgument::Declaration:
3567     case TemplateArgument::Pack:
3568     case TemplateArgument::TemplateExpansion:
3569     case TemplateArgument::NullPtr:
3570       llvm_unreachable("Pack expansion pattern has no parameter packs");
3571 
3572     case TemplateArgument::Type:
3573       if (TypeSourceInfo *Expansion
3574             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3575                                            EllipsisLoc,
3576                                            NumExpansions))
3577         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3578                                    Expansion);
3579       break;
3580     }
3581 
3582     return TemplateArgumentLoc();
3583   }
3584 
3585   /// Build a new expression pack expansion.
3586   ///
3587   /// By default, performs semantic analysis to build a new pack expansion
3588   /// for an expression. Subclasses may override this routine to provide
3589   /// different behavior.
3590   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3591                                   Optional<unsigned> NumExpansions) {
3592     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3593   }
3594 
3595   /// Build a new C++1z fold-expression.
3596   ///
3597   /// By default, performs semantic analysis in order to build a new fold
3598   /// expression.
3599   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3600                                 SourceLocation LParenLoc, Expr *LHS,
3601                                 BinaryOperatorKind Operator,
3602                                 SourceLocation EllipsisLoc, Expr *RHS,
3603                                 SourceLocation RParenLoc,
3604                                 Optional<unsigned> NumExpansions) {
3605     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3606                                       EllipsisLoc, RHS, RParenLoc,
3607                                       NumExpansions);
3608   }
3609 
3610   /// Build an empty C++1z fold-expression with the given operator.
3611   ///
3612   /// By default, produces the fallback value for the fold-expression, or
3613   /// produce an error if there is no fallback value.
3614   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3615                                      BinaryOperatorKind Operator) {
3616     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3617   }
3618 
3619   /// Build a new atomic operation expression.
3620   ///
3621   /// By default, performs semantic analysis to build the new expression.
3622   /// Subclasses may override this routine to provide different behavior.
3623   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3624                                AtomicExpr::AtomicOp Op,
3625                                SourceLocation RParenLoc) {
3626     // Use this for all of the locations, since we don't know the difference
3627     // between the call and the expr at this point.
3628     SourceRange Range{BuiltinLoc, RParenLoc};
3629     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3630                                      Sema::AtomicArgumentOrder::AST);
3631   }
3632 
3633   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3634                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3635     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3636   }
3637 
3638 private:
3639   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3640                                      QualType ObjectType,
3641                                      NamedDecl *FirstQualifierInScope,
3642                                      CXXScopeSpec &SS);
3643 
3644   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3645                                              QualType ObjectType,
3646                                              NamedDecl *FirstQualifierInScope,
3647                                              CXXScopeSpec &SS);
3648 
3649   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3650                                             NamedDecl *FirstQualifierInScope,
3651                                             CXXScopeSpec &SS);
3652 
3653   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3654                                       DependentNameTypeLoc TL,
3655                                       bool DeducibleTSTContext);
3656 };
3657 
3658 template <typename Derived>
3659 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3660   if (!S)
3661     return S;
3662 
3663   switch (S->getStmtClass()) {
3664   case Stmt::NoStmtClass: break;
3665 
3666   // Transform individual statement nodes
3667   // Pass SDK into statements that can produce a value
3668 #define STMT(Node, Parent)                                              \
3669   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3670 #define VALUESTMT(Node, Parent)                                         \
3671   case Stmt::Node##Class:                                               \
3672     return getDerived().Transform##Node(cast<Node>(S), SDK);
3673 #define ABSTRACT_STMT(Node)
3674 #define EXPR(Node, Parent)
3675 #include "clang/AST/StmtNodes.inc"
3676 
3677   // Transform expressions by calling TransformExpr.
3678 #define STMT(Node, Parent)
3679 #define ABSTRACT_STMT(Stmt)
3680 #define EXPR(Node, Parent) case Stmt::Node##Class:
3681 #include "clang/AST/StmtNodes.inc"
3682     {
3683       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3684 
3685       if (SDK == SDK_StmtExprResult)
3686         E = getSema().ActOnStmtExprResult(E);
3687       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3688     }
3689   }
3690 
3691   return S;
3692 }
3693 
3694 template<typename Derived>
3695 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3696   if (!S)
3697     return S;
3698 
3699   switch (S->getClauseKind()) {
3700   default: break;
3701   // Transform individual clause nodes
3702 #define GEN_CLANG_CLAUSE_CLASS
3703 #define CLAUSE_CLASS(Enum, Str, Class)                                         \
3704   case Enum:                                                                   \
3705     return getDerived().Transform##Class(cast<Class>(S));
3706 #include "llvm/Frontend/OpenMP/OMP.inc"
3707   }
3708 
3709   return S;
3710 }
3711 
3712 
3713 template<typename Derived>
3714 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3715   if (!E)
3716     return E;
3717 
3718   switch (E->getStmtClass()) {
3719     case Stmt::NoStmtClass: break;
3720 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3721 #define ABSTRACT_STMT(Stmt)
3722 #define EXPR(Node, Parent)                                              \
3723     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3724 #include "clang/AST/StmtNodes.inc"
3725   }
3726 
3727   return E;
3728 }
3729 
3730 template<typename Derived>
3731 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3732                                                         bool NotCopyInit) {
3733   // Initializers are instantiated like expressions, except that various outer
3734   // layers are stripped.
3735   if (!Init)
3736     return Init;
3737 
3738   if (auto *FE = dyn_cast<FullExpr>(Init))
3739     Init = FE->getSubExpr();
3740 
3741   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3742     Init = AIL->getCommonExpr();
3743 
3744   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3745     Init = MTE->getSubExpr();
3746 
3747   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3748     Init = Binder->getSubExpr();
3749 
3750   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3751     Init = ICE->getSubExprAsWritten();
3752 
3753   if (CXXStdInitializerListExpr *ILE =
3754           dyn_cast<CXXStdInitializerListExpr>(Init))
3755     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3756 
3757   // If this is copy-initialization, we only need to reconstruct
3758   // InitListExprs. Other forms of copy-initialization will be a no-op if
3759   // the initializer is already the right type.
3760   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3761   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3762     return getDerived().TransformExpr(Init);
3763 
3764   // Revert value-initialization back to empty parens.
3765   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3766     SourceRange Parens = VIE->getSourceRange();
3767     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3768                                              Parens.getEnd());
3769   }
3770 
3771   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3772   if (isa<ImplicitValueInitExpr>(Init))
3773     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3774                                              SourceLocation());
3775 
3776   // Revert initialization by constructor back to a parenthesized or braced list
3777   // of expressions. Any other form of initializer can just be reused directly.
3778   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3779     return getDerived().TransformExpr(Init);
3780 
3781   // If the initialization implicitly converted an initializer list to a
3782   // std::initializer_list object, unwrap the std::initializer_list too.
3783   if (Construct && Construct->isStdInitListInitialization())
3784     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3785 
3786   // Enter a list-init context if this was list initialization.
3787   EnterExpressionEvaluationContext Context(
3788       getSema(), EnterExpressionEvaluationContext::InitList,
3789       Construct->isListInitialization());
3790 
3791   SmallVector<Expr*, 8> NewArgs;
3792   bool ArgChanged = false;
3793   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3794                                   /*IsCall*/true, NewArgs, &ArgChanged))
3795     return ExprError();
3796 
3797   // If this was list initialization, revert to syntactic list form.
3798   if (Construct->isListInitialization())
3799     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3800                                         Construct->getEndLoc());
3801 
3802   // Build a ParenListExpr to represent anything else.
3803   SourceRange Parens = Construct->getParenOrBraceRange();
3804   if (Parens.isInvalid()) {
3805     // This was a variable declaration's initialization for which no initializer
3806     // was specified.
3807     assert(NewArgs.empty() &&
3808            "no parens or braces but have direct init with arguments?");
3809     return ExprEmpty();
3810   }
3811   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3812                                            Parens.getEnd());
3813 }
3814 
3815 template<typename Derived>
3816 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3817                                             unsigned NumInputs,
3818                                             bool IsCall,
3819                                       SmallVectorImpl<Expr *> &Outputs,
3820                                             bool *ArgChanged) {
3821   for (unsigned I = 0; I != NumInputs; ++I) {
3822     // If requested, drop call arguments that need to be dropped.
3823     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3824       if (ArgChanged)
3825         *ArgChanged = true;
3826 
3827       break;
3828     }
3829 
3830     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3831       Expr *Pattern = Expansion->getPattern();
3832 
3833       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3834       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3835       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3836 
3837       // Determine whether the set of unexpanded parameter packs can and should
3838       // be expanded.
3839       bool Expand = true;
3840       bool RetainExpansion = false;
3841       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3842       Optional<unsigned> NumExpansions = OrigNumExpansions;
3843       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3844                                                Pattern->getSourceRange(),
3845                                                Unexpanded,
3846                                                Expand, RetainExpansion,
3847                                                NumExpansions))
3848         return true;
3849 
3850       if (!Expand) {
3851         // The transform has determined that we should perform a simple
3852         // transformation on the pack expansion, producing another pack
3853         // expansion.
3854         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3855         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3856         if (OutPattern.isInvalid())
3857           return true;
3858 
3859         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3860                                                 Expansion->getEllipsisLoc(),
3861                                                            NumExpansions);
3862         if (Out.isInvalid())
3863           return true;
3864 
3865         if (ArgChanged)
3866           *ArgChanged = true;
3867         Outputs.push_back(Out.get());
3868         continue;
3869       }
3870 
3871       // Record right away that the argument was changed.  This needs
3872       // to happen even if the array expands to nothing.
3873       if (ArgChanged) *ArgChanged = true;
3874 
3875       // The transform has determined that we should perform an elementwise
3876       // expansion of the pattern. Do so.
3877       for (unsigned I = 0; I != *NumExpansions; ++I) {
3878         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3879         ExprResult Out = getDerived().TransformExpr(Pattern);
3880         if (Out.isInvalid())
3881           return true;
3882 
3883         if (Out.get()->containsUnexpandedParameterPack()) {
3884           Out = getDerived().RebuildPackExpansion(
3885               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3886           if (Out.isInvalid())
3887             return true;
3888         }
3889 
3890         Outputs.push_back(Out.get());
3891       }
3892 
3893       // If we're supposed to retain a pack expansion, do so by temporarily
3894       // forgetting the partially-substituted parameter pack.
3895       if (RetainExpansion) {
3896         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3897 
3898         ExprResult Out = getDerived().TransformExpr(Pattern);
3899         if (Out.isInvalid())
3900           return true;
3901 
3902         Out = getDerived().RebuildPackExpansion(
3903             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3904         if (Out.isInvalid())
3905           return true;
3906 
3907         Outputs.push_back(Out.get());
3908       }
3909 
3910       continue;
3911     }
3912 
3913     ExprResult Result =
3914       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3915              : getDerived().TransformExpr(Inputs[I]);
3916     if (Result.isInvalid())
3917       return true;
3918 
3919     if (Result.get() != Inputs[I] && ArgChanged)
3920       *ArgChanged = true;
3921 
3922     Outputs.push_back(Result.get());
3923   }
3924 
3925   return false;
3926 }
3927 
3928 template <typename Derived>
3929 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3930     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3931   if (Var) {
3932     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3933         getDerived().TransformDefinition(Var->getLocation(), Var));
3934 
3935     if (!ConditionVar)
3936       return Sema::ConditionError();
3937 
3938     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3939   }
3940 
3941   if (Expr) {
3942     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3943 
3944     if (CondExpr.isInvalid())
3945       return Sema::ConditionError();
3946 
3947     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3948   }
3949 
3950   return Sema::ConditionResult();
3951 }
3952 
3953 template<typename Derived>
3954 NestedNameSpecifierLoc
3955 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3956                                                     NestedNameSpecifierLoc NNS,
3957                                                      QualType ObjectType,
3958                                              NamedDecl *FirstQualifierInScope) {
3959   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3960   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3961        Qualifier = Qualifier.getPrefix())
3962     Qualifiers.push_back(Qualifier);
3963 
3964   CXXScopeSpec SS;
3965   while (!Qualifiers.empty()) {
3966     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3967     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3968 
3969     switch (QNNS->getKind()) {
3970     case NestedNameSpecifier::Identifier: {
3971       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3972                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3973       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3974                                               SS, FirstQualifierInScope, false))
3975         return NestedNameSpecifierLoc();
3976     }
3977       break;
3978 
3979     case NestedNameSpecifier::Namespace: {
3980       NamespaceDecl *NS
3981         = cast_or_null<NamespaceDecl>(
3982                                     getDerived().TransformDecl(
3983                                                           Q.getLocalBeginLoc(),
3984                                                        QNNS->getAsNamespace()));
3985       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3986       break;
3987     }
3988 
3989     case NestedNameSpecifier::NamespaceAlias: {
3990       NamespaceAliasDecl *Alias
3991         = cast_or_null<NamespaceAliasDecl>(
3992                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3993                                                  QNNS->getAsNamespaceAlias()));
3994       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3995                 Q.getLocalEndLoc());
3996       break;
3997     }
3998 
3999     case NestedNameSpecifier::Global:
4000       // There is no meaningful transformation that one could perform on the
4001       // global scope.
4002       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
4003       break;
4004 
4005     case NestedNameSpecifier::Super: {
4006       CXXRecordDecl *RD =
4007           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
4008               SourceLocation(), QNNS->getAsRecordDecl()));
4009       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4010       break;
4011     }
4012 
4013     case NestedNameSpecifier::TypeSpecWithTemplate:
4014     case NestedNameSpecifier::TypeSpec: {
4015       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4016                                               FirstQualifierInScope, SS);
4017 
4018       if (!TL)
4019         return NestedNameSpecifierLoc();
4020 
4021       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4022           (SemaRef.getLangOpts().CPlusPlus11 &&
4023            TL.getType()->isEnumeralType())) {
4024         assert(!TL.getType().hasLocalQualifiers() &&
4025                "Can't get cv-qualifiers here");
4026         if (TL.getType()->isEnumeralType())
4027           SemaRef.Diag(TL.getBeginLoc(),
4028                        diag::warn_cxx98_compat_enum_nested_name_spec);
4029         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
4030                   Q.getLocalEndLoc());
4031         break;
4032       }
4033       // If the nested-name-specifier is an invalid type def, don't emit an
4034       // error because a previous error should have already been emitted.
4035       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4036       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4037         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4038           << TL.getType() << SS.getRange();
4039       }
4040       return NestedNameSpecifierLoc();
4041     }
4042     }
4043 
4044     // The qualifier-in-scope and object type only apply to the leftmost entity.
4045     FirstQualifierInScope = nullptr;
4046     ObjectType = QualType();
4047   }
4048 
4049   // Don't rebuild the nested-name-specifier if we don't have to.
4050   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4051       !getDerived().AlwaysRebuild())
4052     return NNS;
4053 
4054   // If we can re-use the source-location data from the original
4055   // nested-name-specifier, do so.
4056   if (SS.location_size() == NNS.getDataLength() &&
4057       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4058     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4059 
4060   // Allocate new nested-name-specifier location information.
4061   return SS.getWithLocInContext(SemaRef.Context);
4062 }
4063 
4064 template<typename Derived>
4065 DeclarationNameInfo
4066 TreeTransform<Derived>
4067 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4068   DeclarationName Name = NameInfo.getName();
4069   if (!Name)
4070     return DeclarationNameInfo();
4071 
4072   switch (Name.getNameKind()) {
4073   case DeclarationName::Identifier:
4074   case DeclarationName::ObjCZeroArgSelector:
4075   case DeclarationName::ObjCOneArgSelector:
4076   case DeclarationName::ObjCMultiArgSelector:
4077   case DeclarationName::CXXOperatorName:
4078   case DeclarationName::CXXLiteralOperatorName:
4079   case DeclarationName::CXXUsingDirective:
4080     return NameInfo;
4081 
4082   case DeclarationName::CXXDeductionGuideName: {
4083     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4084     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4085         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4086     if (!NewTemplate)
4087       return DeclarationNameInfo();
4088 
4089     DeclarationNameInfo NewNameInfo(NameInfo);
4090     NewNameInfo.setName(
4091         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4092     return NewNameInfo;
4093   }
4094 
4095   case DeclarationName::CXXConstructorName:
4096   case DeclarationName::CXXDestructorName:
4097   case DeclarationName::CXXConversionFunctionName: {
4098     TypeSourceInfo *NewTInfo;
4099     CanQualType NewCanTy;
4100     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4101       NewTInfo = getDerived().TransformType(OldTInfo);
4102       if (!NewTInfo)
4103         return DeclarationNameInfo();
4104       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4105     }
4106     else {
4107       NewTInfo = nullptr;
4108       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4109       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4110       if (NewT.isNull())
4111         return DeclarationNameInfo();
4112       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4113     }
4114 
4115     DeclarationName NewName
4116       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4117                                                            NewCanTy);
4118     DeclarationNameInfo NewNameInfo(NameInfo);
4119     NewNameInfo.setName(NewName);
4120     NewNameInfo.setNamedTypeInfo(NewTInfo);
4121     return NewNameInfo;
4122   }
4123   }
4124 
4125   llvm_unreachable("Unknown name kind.");
4126 }
4127 
4128 template<typename Derived>
4129 TemplateName
4130 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4131                                               TemplateName Name,
4132                                               SourceLocation NameLoc,
4133                                               QualType ObjectType,
4134                                               NamedDecl *FirstQualifierInScope,
4135                                               bool AllowInjectedClassName) {
4136   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4137     TemplateDecl *Template = QTN->getTemplateDecl();
4138     assert(Template && "qualified template name must refer to a template");
4139 
4140     TemplateDecl *TransTemplate
4141       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4142                                                               Template));
4143     if (!TransTemplate)
4144       return TemplateName();
4145 
4146     if (!getDerived().AlwaysRebuild() &&
4147         SS.getScopeRep() == QTN->getQualifier() &&
4148         TransTemplate == Template)
4149       return Name;
4150 
4151     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4152                                             TransTemplate);
4153   }
4154 
4155   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4156     if (SS.getScopeRep()) {
4157       // These apply to the scope specifier, not the template.
4158       ObjectType = QualType();
4159       FirstQualifierInScope = nullptr;
4160     }
4161 
4162     if (!getDerived().AlwaysRebuild() &&
4163         SS.getScopeRep() == DTN->getQualifier() &&
4164         ObjectType.isNull())
4165       return Name;
4166 
4167     // FIXME: Preserve the location of the "template" keyword.
4168     SourceLocation TemplateKWLoc = NameLoc;
4169 
4170     if (DTN->isIdentifier()) {
4171       return getDerived().RebuildTemplateName(SS,
4172                                               TemplateKWLoc,
4173                                               *DTN->getIdentifier(),
4174                                               NameLoc,
4175                                               ObjectType,
4176                                               FirstQualifierInScope,
4177                                               AllowInjectedClassName);
4178     }
4179 
4180     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4181                                             DTN->getOperator(), NameLoc,
4182                                             ObjectType, AllowInjectedClassName);
4183   }
4184 
4185   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4186     TemplateDecl *TransTemplate
4187       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4188                                                               Template));
4189     if (!TransTemplate)
4190       return TemplateName();
4191 
4192     if (!getDerived().AlwaysRebuild() &&
4193         TransTemplate == Template)
4194       return Name;
4195 
4196     return TemplateName(TransTemplate);
4197   }
4198 
4199   if (SubstTemplateTemplateParmPackStorage *SubstPack
4200       = Name.getAsSubstTemplateTemplateParmPack()) {
4201     TemplateTemplateParmDecl *TransParam
4202     = cast_or_null<TemplateTemplateParmDecl>(
4203             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4204     if (!TransParam)
4205       return TemplateName();
4206 
4207     if (!getDerived().AlwaysRebuild() &&
4208         TransParam == SubstPack->getParameterPack())
4209       return Name;
4210 
4211     return getDerived().RebuildTemplateName(TransParam,
4212                                             SubstPack->getArgumentPack());
4213   }
4214 
4215   // These should be getting filtered out before they reach the AST.
4216   llvm_unreachable("overloaded function decl survived to here");
4217 }
4218 
4219 template<typename Derived>
4220 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4221                                          const TemplateArgument &Arg,
4222                                          TemplateArgumentLoc &Output) {
4223   Output = getSema().getTrivialTemplateArgumentLoc(
4224       Arg, QualType(), getDerived().getBaseLocation());
4225 }
4226 
4227 template<typename Derived>
4228 bool TreeTransform<Derived>::TransformTemplateArgument(
4229                                          const TemplateArgumentLoc &Input,
4230                                          TemplateArgumentLoc &Output, bool Uneval) {
4231   const TemplateArgument &Arg = Input.getArgument();
4232   switch (Arg.getKind()) {
4233   case TemplateArgument::Null:
4234   case TemplateArgument::Pack:
4235     llvm_unreachable("Unexpected TemplateArgument");
4236 
4237   case TemplateArgument::Integral:
4238   case TemplateArgument::NullPtr:
4239   case TemplateArgument::Declaration: {
4240     // Transform a resolved template argument straight to a resolved template
4241     // argument. We get here when substituting into an already-substituted
4242     // template type argument during concept satisfaction checking.
4243     QualType T = Arg.getNonTypeTemplateArgumentType();
4244     QualType NewT = getDerived().TransformType(T);
4245     if (NewT.isNull())
4246       return true;
4247 
4248     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4249                        ? Arg.getAsDecl()
4250                        : nullptr;
4251     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4252                               getDerived().getBaseLocation(), D))
4253                         : nullptr;
4254     if (D && !NewD)
4255       return true;
4256 
4257     if (NewT == T && D == NewD)
4258       Output = Input;
4259     else if (Arg.getKind() == TemplateArgument::Integral)
4260       Output = TemplateArgumentLoc(
4261           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4262           TemplateArgumentLocInfo());
4263     else if (Arg.getKind() == TemplateArgument::NullPtr)
4264       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4265                                    TemplateArgumentLocInfo());
4266     else
4267       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4268                                    TemplateArgumentLocInfo());
4269 
4270     return false;
4271   }
4272 
4273   case TemplateArgument::Type: {
4274     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4275     if (!DI)
4276       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4277 
4278     DI = getDerived().TransformType(DI);
4279     if (!DI) return true;
4280 
4281     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4282     return false;
4283   }
4284 
4285   case TemplateArgument::Template: {
4286     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4287     if (QualifierLoc) {
4288       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4289       if (!QualifierLoc)
4290         return true;
4291     }
4292 
4293     CXXScopeSpec SS;
4294     SS.Adopt(QualifierLoc);
4295     TemplateName Template
4296       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4297                                            Input.getTemplateNameLoc());
4298     if (Template.isNull())
4299       return true;
4300 
4301     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4302                                  QualifierLoc, Input.getTemplateNameLoc());
4303     return false;
4304   }
4305 
4306   case TemplateArgument::TemplateExpansion:
4307     llvm_unreachable("Caller should expand pack expansions");
4308 
4309   case TemplateArgument::Expression: {
4310     // Template argument expressions are constant expressions.
4311     EnterExpressionEvaluationContext Unevaluated(
4312         getSema(),
4313         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4314                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4315         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4316         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4317 
4318     Expr *InputExpr = Input.getSourceExpression();
4319     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4320 
4321     ExprResult E = getDerived().TransformExpr(InputExpr);
4322     E = SemaRef.ActOnConstantExpression(E);
4323     if (E.isInvalid()) return true;
4324     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4325     return false;
4326   }
4327   }
4328 
4329   // Work around bogus GCC warning
4330   return true;
4331 }
4332 
4333 /// Iterator adaptor that invents template argument location information
4334 /// for each of the template arguments in its underlying iterator.
4335 template<typename Derived, typename InputIterator>
4336 class TemplateArgumentLocInventIterator {
4337   TreeTransform<Derived> &Self;
4338   InputIterator Iter;
4339 
4340 public:
4341   typedef TemplateArgumentLoc value_type;
4342   typedef TemplateArgumentLoc reference;
4343   typedef typename std::iterator_traits<InputIterator>::difference_type
4344     difference_type;
4345   typedef std::input_iterator_tag iterator_category;
4346 
4347   class pointer {
4348     TemplateArgumentLoc Arg;
4349 
4350   public:
4351     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4352 
4353     const TemplateArgumentLoc *operator->() const { return &Arg; }
4354   };
4355 
4356   TemplateArgumentLocInventIterator() { }
4357 
4358   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4359                                              InputIterator Iter)
4360     : Self(Self), Iter(Iter) { }
4361 
4362   TemplateArgumentLocInventIterator &operator++() {
4363     ++Iter;
4364     return *this;
4365   }
4366 
4367   TemplateArgumentLocInventIterator operator++(int) {
4368     TemplateArgumentLocInventIterator Old(*this);
4369     ++(*this);
4370     return Old;
4371   }
4372 
4373   reference operator*() const {
4374     TemplateArgumentLoc Result;
4375     Self.InventTemplateArgumentLoc(*Iter, Result);
4376     return Result;
4377   }
4378 
4379   pointer operator->() const { return pointer(**this); }
4380 
4381   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4382                          const TemplateArgumentLocInventIterator &Y) {
4383     return X.Iter == Y.Iter;
4384   }
4385 
4386   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4387                          const TemplateArgumentLocInventIterator &Y) {
4388     return X.Iter != Y.Iter;
4389   }
4390 };
4391 
4392 template<typename Derived>
4393 template<typename InputIterator>
4394 bool TreeTransform<Derived>::TransformTemplateArguments(
4395     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4396     bool Uneval) {
4397   for (; First != Last; ++First) {
4398     TemplateArgumentLoc Out;
4399     TemplateArgumentLoc In = *First;
4400 
4401     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4402       // Unpack argument packs, which we translate them into separate
4403       // arguments.
4404       // FIXME: We could do much better if we could guarantee that the
4405       // TemplateArgumentLocInfo for the pack expansion would be usable for
4406       // all of the template arguments in the argument pack.
4407       typedef TemplateArgumentLocInventIterator<Derived,
4408                                                 TemplateArgument::pack_iterator>
4409         PackLocIterator;
4410       if (TransformTemplateArguments(PackLocIterator(*this,
4411                                                  In.getArgument().pack_begin()),
4412                                      PackLocIterator(*this,
4413                                                    In.getArgument().pack_end()),
4414                                      Outputs, Uneval))
4415         return true;
4416 
4417       continue;
4418     }
4419 
4420     if (In.getArgument().isPackExpansion()) {
4421       // We have a pack expansion, for which we will be substituting into
4422       // the pattern.
4423       SourceLocation Ellipsis;
4424       Optional<unsigned> OrigNumExpansions;
4425       TemplateArgumentLoc Pattern
4426         = getSema().getTemplateArgumentPackExpansionPattern(
4427               In, Ellipsis, OrigNumExpansions);
4428 
4429       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4430       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4431       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4432 
4433       // Determine whether the set of unexpanded parameter packs can and should
4434       // be expanded.
4435       bool Expand = true;
4436       bool RetainExpansion = false;
4437       Optional<unsigned> NumExpansions = OrigNumExpansions;
4438       if (getDerived().TryExpandParameterPacks(Ellipsis,
4439                                                Pattern.getSourceRange(),
4440                                                Unexpanded,
4441                                                Expand,
4442                                                RetainExpansion,
4443                                                NumExpansions))
4444         return true;
4445 
4446       if (!Expand) {
4447         // The transform has determined that we should perform a simple
4448         // transformation on the pack expansion, producing another pack
4449         // expansion.
4450         TemplateArgumentLoc OutPattern;
4451         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4452         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4453           return true;
4454 
4455         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4456                                                 NumExpansions);
4457         if (Out.getArgument().isNull())
4458           return true;
4459 
4460         Outputs.addArgument(Out);
4461         continue;
4462       }
4463 
4464       // The transform has determined that we should perform an elementwise
4465       // expansion of the pattern. Do so.
4466       for (unsigned I = 0; I != *NumExpansions; ++I) {
4467         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4468 
4469         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4470           return true;
4471 
4472         if (Out.getArgument().containsUnexpandedParameterPack()) {
4473           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4474                                                   OrigNumExpansions);
4475           if (Out.getArgument().isNull())
4476             return true;
4477         }
4478 
4479         Outputs.addArgument(Out);
4480       }
4481 
4482       // If we're supposed to retain a pack expansion, do so by temporarily
4483       // forgetting the partially-substituted parameter pack.
4484       if (RetainExpansion) {
4485         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4486 
4487         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4488           return true;
4489 
4490         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4491                                                 OrigNumExpansions);
4492         if (Out.getArgument().isNull())
4493           return true;
4494 
4495         Outputs.addArgument(Out);
4496       }
4497 
4498       continue;
4499     }
4500 
4501     // The simple case:
4502     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4503       return true;
4504 
4505     Outputs.addArgument(Out);
4506   }
4507 
4508   return false;
4509 
4510 }
4511 
4512 //===----------------------------------------------------------------------===//
4513 // Type transformation
4514 //===----------------------------------------------------------------------===//
4515 
4516 template<typename Derived>
4517 QualType TreeTransform<Derived>::TransformType(QualType T) {
4518   if (getDerived().AlreadyTransformed(T))
4519     return T;
4520 
4521   // Temporary workaround.  All of these transformations should
4522   // eventually turn into transformations on TypeLocs.
4523   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4524                                                 getDerived().getBaseLocation());
4525 
4526   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4527 
4528   if (!NewDI)
4529     return QualType();
4530 
4531   return NewDI->getType();
4532 }
4533 
4534 template<typename Derived>
4535 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4536   // Refine the base location to the type's location.
4537   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4538                        getDerived().getBaseEntity());
4539   if (getDerived().AlreadyTransformed(DI->getType()))
4540     return DI;
4541 
4542   TypeLocBuilder TLB;
4543 
4544   TypeLoc TL = DI->getTypeLoc();
4545   TLB.reserve(TL.getFullDataSize());
4546 
4547   QualType Result = getDerived().TransformType(TLB, TL);
4548   if (Result.isNull())
4549     return nullptr;
4550 
4551   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4552 }
4553 
4554 template<typename Derived>
4555 QualType
4556 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4557   switch (T.getTypeLocClass()) {
4558 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4559 #define TYPELOC(CLASS, PARENT)                                                 \
4560   case TypeLoc::CLASS:                                                         \
4561     return getDerived().Transform##CLASS##Type(TLB,                            \
4562                                                T.castAs<CLASS##TypeLoc>());
4563 #include "clang/AST/TypeLocNodes.def"
4564   }
4565 
4566   llvm_unreachable("unhandled type loc!");
4567 }
4568 
4569 template<typename Derived>
4570 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4571   if (!isa<DependentNameType>(T))
4572     return TransformType(T);
4573 
4574   if (getDerived().AlreadyTransformed(T))
4575     return T;
4576   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4577                                                 getDerived().getBaseLocation());
4578   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4579   return NewDI ? NewDI->getType() : QualType();
4580 }
4581 
4582 template<typename Derived>
4583 TypeSourceInfo *
4584 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4585   if (!isa<DependentNameType>(DI->getType()))
4586     return TransformType(DI);
4587 
4588   // Refine the base location to the type's location.
4589   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4590                        getDerived().getBaseEntity());
4591   if (getDerived().AlreadyTransformed(DI->getType()))
4592     return DI;
4593 
4594   TypeLocBuilder TLB;
4595 
4596   TypeLoc TL = DI->getTypeLoc();
4597   TLB.reserve(TL.getFullDataSize());
4598 
4599   auto QTL = TL.getAs<QualifiedTypeLoc>();
4600   if (QTL)
4601     TL = QTL.getUnqualifiedLoc();
4602 
4603   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4604 
4605   QualType Result = getDerived().TransformDependentNameType(
4606       TLB, DNTL, /*DeducedTSTContext*/true);
4607   if (Result.isNull())
4608     return nullptr;
4609 
4610   if (QTL) {
4611     Result = getDerived().RebuildQualifiedType(Result, QTL);
4612     if (Result.isNull())
4613       return nullptr;
4614     TLB.TypeWasModifiedSafely(Result);
4615   }
4616 
4617   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4618 }
4619 
4620 template<typename Derived>
4621 QualType
4622 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4623                                                QualifiedTypeLoc T) {
4624   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4625   if (Result.isNull())
4626     return QualType();
4627 
4628   Result = getDerived().RebuildQualifiedType(Result, T);
4629 
4630   if (Result.isNull())
4631     return QualType();
4632 
4633   // RebuildQualifiedType might have updated the type, but not in a way
4634   // that invalidates the TypeLoc. (There's no location information for
4635   // qualifiers.)
4636   TLB.TypeWasModifiedSafely(Result);
4637 
4638   return Result;
4639 }
4640 
4641 template <typename Derived>
4642 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4643                                                       QualifiedTypeLoc TL) {
4644 
4645   SourceLocation Loc = TL.getBeginLoc();
4646   Qualifiers Quals = TL.getType().getLocalQualifiers();
4647 
4648   if (((T.getAddressSpace() != LangAS::Default &&
4649         Quals.getAddressSpace() != LangAS::Default)) &&
4650       T.getAddressSpace() != Quals.getAddressSpace()) {
4651     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4652         << TL.getType() << T;
4653     return QualType();
4654   }
4655 
4656   // C++ [dcl.fct]p7:
4657   //   [When] adding cv-qualifications on top of the function type [...] the
4658   //   cv-qualifiers are ignored.
4659   if (T->isFunctionType()) {
4660     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4661                                                      Quals.getAddressSpace());
4662     return T;
4663   }
4664 
4665   // C++ [dcl.ref]p1:
4666   //   when the cv-qualifiers are introduced through the use of a typedef-name
4667   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4668   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4669   // applied to a reference type.
4670   if (T->isReferenceType()) {
4671     // The only qualifier that applies to a reference type is restrict.
4672     if (!Quals.hasRestrict())
4673       return T;
4674     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4675   }
4676 
4677   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4678   // resulting type.
4679   if (Quals.hasObjCLifetime()) {
4680     if (!T->isObjCLifetimeType() && !T->isDependentType())
4681       Quals.removeObjCLifetime();
4682     else if (T.getObjCLifetime()) {
4683       // Objective-C ARC:
4684       //   A lifetime qualifier applied to a substituted template parameter
4685       //   overrides the lifetime qualifier from the template argument.
4686       const AutoType *AutoTy;
4687       if (const SubstTemplateTypeParmType *SubstTypeParam
4688                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4689         QualType Replacement = SubstTypeParam->getReplacementType();
4690         Qualifiers Qs = Replacement.getQualifiers();
4691         Qs.removeObjCLifetime();
4692         Replacement = SemaRef.Context.getQualifiedType(
4693             Replacement.getUnqualifiedType(), Qs);
4694         T = SemaRef.Context.getSubstTemplateTypeParmType(
4695             SubstTypeParam->getReplacedParameter(), Replacement);
4696       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4697         // 'auto' types behave the same way as template parameters.
4698         QualType Deduced = AutoTy->getDeducedType();
4699         Qualifiers Qs = Deduced.getQualifiers();
4700         Qs.removeObjCLifetime();
4701         Deduced =
4702             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4703         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4704                                         AutoTy->isDependentType(),
4705                                         /*isPack=*/false,
4706                                         AutoTy->getTypeConstraintConcept(),
4707                                         AutoTy->getTypeConstraintArguments());
4708       } else {
4709         // Otherwise, complain about the addition of a qualifier to an
4710         // already-qualified type.
4711         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4712         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4713         Quals.removeObjCLifetime();
4714       }
4715     }
4716   }
4717 
4718   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4719 }
4720 
4721 template<typename Derived>
4722 TypeLoc
4723 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4724                                                    QualType ObjectType,
4725                                                    NamedDecl *UnqualLookup,
4726                                                    CXXScopeSpec &SS) {
4727   if (getDerived().AlreadyTransformed(TL.getType()))
4728     return TL;
4729 
4730   TypeSourceInfo *TSI =
4731       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4732   if (TSI)
4733     return TSI->getTypeLoc();
4734   return TypeLoc();
4735 }
4736 
4737 template<typename Derived>
4738 TypeSourceInfo *
4739 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4740                                                    QualType ObjectType,
4741                                                    NamedDecl *UnqualLookup,
4742                                                    CXXScopeSpec &SS) {
4743   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4744     return TSInfo;
4745 
4746   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4747                                    UnqualLookup, SS);
4748 }
4749 
4750 template <typename Derived>
4751 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4752     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4753     CXXScopeSpec &SS) {
4754   QualType T = TL.getType();
4755   assert(!getDerived().AlreadyTransformed(T));
4756 
4757   TypeLocBuilder TLB;
4758   QualType Result;
4759 
4760   if (isa<TemplateSpecializationType>(T)) {
4761     TemplateSpecializationTypeLoc SpecTL =
4762         TL.castAs<TemplateSpecializationTypeLoc>();
4763 
4764     TemplateName Template = getDerived().TransformTemplateName(
4765         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4766         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4767     if (Template.isNull())
4768       return nullptr;
4769 
4770     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4771                                                               Template);
4772   } else if (isa<DependentTemplateSpecializationType>(T)) {
4773     DependentTemplateSpecializationTypeLoc SpecTL =
4774         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4775 
4776     TemplateName Template
4777       = getDerived().RebuildTemplateName(SS,
4778                                          SpecTL.getTemplateKeywordLoc(),
4779                                          *SpecTL.getTypePtr()->getIdentifier(),
4780                                          SpecTL.getTemplateNameLoc(),
4781                                          ObjectType, UnqualLookup,
4782                                          /*AllowInjectedClassName*/true);
4783     if (Template.isNull())
4784       return nullptr;
4785 
4786     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4787                                                                        SpecTL,
4788                                                                        Template,
4789                                                                        SS);
4790   } else {
4791     // Nothing special needs to be done for these.
4792     Result = getDerived().TransformType(TLB, TL);
4793   }
4794 
4795   if (Result.isNull())
4796     return nullptr;
4797 
4798   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4799 }
4800 
4801 template <class TyLoc> static inline
4802 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4803   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4804   NewT.setNameLoc(T.getNameLoc());
4805   return T.getType();
4806 }
4807 
4808 template<typename Derived>
4809 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4810                                                       BuiltinTypeLoc T) {
4811   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4812   NewT.setBuiltinLoc(T.getBuiltinLoc());
4813   if (T.needsExtraLocalData())
4814     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4815   return T.getType();
4816 }
4817 
4818 template<typename Derived>
4819 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4820                                                       ComplexTypeLoc T) {
4821   // FIXME: recurse?
4822   return TransformTypeSpecType(TLB, T);
4823 }
4824 
4825 template <typename Derived>
4826 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4827                                                        AdjustedTypeLoc TL) {
4828   // Adjustments applied during transformation are handled elsewhere.
4829   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4830 }
4831 
4832 template<typename Derived>
4833 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4834                                                       DecayedTypeLoc TL) {
4835   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4836   if (OriginalType.isNull())
4837     return QualType();
4838 
4839   QualType Result = TL.getType();
4840   if (getDerived().AlwaysRebuild() ||
4841       OriginalType != TL.getOriginalLoc().getType())
4842     Result = SemaRef.Context.getDecayedType(OriginalType);
4843   TLB.push<DecayedTypeLoc>(Result);
4844   // Nothing to set for DecayedTypeLoc.
4845   return Result;
4846 }
4847 
4848 template<typename Derived>
4849 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4850                                                       PointerTypeLoc TL) {
4851   QualType PointeeType
4852     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4853   if (PointeeType.isNull())
4854     return QualType();
4855 
4856   QualType Result = TL.getType();
4857   if (PointeeType->getAs<ObjCObjectType>()) {
4858     // A dependent pointer type 'T *' has is being transformed such
4859     // that an Objective-C class type is being replaced for 'T'. The
4860     // resulting pointer type is an ObjCObjectPointerType, not a
4861     // PointerType.
4862     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4863 
4864     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4865     NewT.setStarLoc(TL.getStarLoc());
4866     return Result;
4867   }
4868 
4869   if (getDerived().AlwaysRebuild() ||
4870       PointeeType != TL.getPointeeLoc().getType()) {
4871     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4872     if (Result.isNull())
4873       return QualType();
4874   }
4875 
4876   // Objective-C ARC can add lifetime qualifiers to the type that we're
4877   // pointing to.
4878   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4879 
4880   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4881   NewT.setSigilLoc(TL.getSigilLoc());
4882   return Result;
4883 }
4884 
4885 template<typename Derived>
4886 QualType
4887 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4888                                                   BlockPointerTypeLoc TL) {
4889   QualType PointeeType
4890     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4891   if (PointeeType.isNull())
4892     return QualType();
4893 
4894   QualType Result = TL.getType();
4895   if (getDerived().AlwaysRebuild() ||
4896       PointeeType != TL.getPointeeLoc().getType()) {
4897     Result = getDerived().RebuildBlockPointerType(PointeeType,
4898                                                   TL.getSigilLoc());
4899     if (Result.isNull())
4900       return QualType();
4901   }
4902 
4903   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4904   NewT.setSigilLoc(TL.getSigilLoc());
4905   return Result;
4906 }
4907 
4908 /// Transforms a reference type.  Note that somewhat paradoxically we
4909 /// don't care whether the type itself is an l-value type or an r-value
4910 /// type;  we only care if the type was *written* as an l-value type
4911 /// or an r-value type.
4912 template<typename Derived>
4913 QualType
4914 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4915                                                ReferenceTypeLoc TL) {
4916   const ReferenceType *T = TL.getTypePtr();
4917 
4918   // Note that this works with the pointee-as-written.
4919   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4920   if (PointeeType.isNull())
4921     return QualType();
4922 
4923   QualType Result = TL.getType();
4924   if (getDerived().AlwaysRebuild() ||
4925       PointeeType != T->getPointeeTypeAsWritten()) {
4926     Result = getDerived().RebuildReferenceType(PointeeType,
4927                                                T->isSpelledAsLValue(),
4928                                                TL.getSigilLoc());
4929     if (Result.isNull())
4930       return QualType();
4931   }
4932 
4933   // Objective-C ARC can add lifetime qualifiers to the type that we're
4934   // referring to.
4935   TLB.TypeWasModifiedSafely(
4936       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4937 
4938   // r-value references can be rebuilt as l-value references.
4939   ReferenceTypeLoc NewTL;
4940   if (isa<LValueReferenceType>(Result))
4941     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4942   else
4943     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4944   NewTL.setSigilLoc(TL.getSigilLoc());
4945 
4946   return Result;
4947 }
4948 
4949 template<typename Derived>
4950 QualType
4951 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4952                                                  LValueReferenceTypeLoc TL) {
4953   return TransformReferenceType(TLB, TL);
4954 }
4955 
4956 template<typename Derived>
4957 QualType
4958 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4959                                                  RValueReferenceTypeLoc TL) {
4960   return TransformReferenceType(TLB, TL);
4961 }
4962 
4963 template<typename Derived>
4964 QualType
4965 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4966                                                    MemberPointerTypeLoc TL) {
4967   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4968   if (PointeeType.isNull())
4969     return QualType();
4970 
4971   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4972   TypeSourceInfo *NewClsTInfo = nullptr;
4973   if (OldClsTInfo) {
4974     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4975     if (!NewClsTInfo)
4976       return QualType();
4977   }
4978 
4979   const MemberPointerType *T = TL.getTypePtr();
4980   QualType OldClsType = QualType(T->getClass(), 0);
4981   QualType NewClsType;
4982   if (NewClsTInfo)
4983     NewClsType = NewClsTInfo->getType();
4984   else {
4985     NewClsType = getDerived().TransformType(OldClsType);
4986     if (NewClsType.isNull())
4987       return QualType();
4988   }
4989 
4990   QualType Result = TL.getType();
4991   if (getDerived().AlwaysRebuild() ||
4992       PointeeType != T->getPointeeType() ||
4993       NewClsType != OldClsType) {
4994     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4995                                                    TL.getStarLoc());
4996     if (Result.isNull())
4997       return QualType();
4998   }
4999 
5000   // If we had to adjust the pointee type when building a member pointer, make
5001   // sure to push TypeLoc info for it.
5002   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
5003   if (MPT && PointeeType != MPT->getPointeeType()) {
5004     assert(isa<AdjustedType>(MPT->getPointeeType()));
5005     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
5006   }
5007 
5008   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5009   NewTL.setSigilLoc(TL.getSigilLoc());
5010   NewTL.setClassTInfo(NewClsTInfo);
5011 
5012   return Result;
5013 }
5014 
5015 template<typename Derived>
5016 QualType
5017 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5018                                                    ConstantArrayTypeLoc TL) {
5019   const ConstantArrayType *T = TL.getTypePtr();
5020   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5021   if (ElementType.isNull())
5022     return QualType();
5023 
5024   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5025   Expr *OldSize = TL.getSizeExpr();
5026   if (!OldSize)
5027     OldSize = const_cast<Expr*>(T->getSizeExpr());
5028   Expr *NewSize = nullptr;
5029   if (OldSize) {
5030     EnterExpressionEvaluationContext Unevaluated(
5031         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5032     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5033     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5034   }
5035 
5036   QualType Result = TL.getType();
5037   if (getDerived().AlwaysRebuild() ||
5038       ElementType != T->getElementType() ||
5039       (T->getSizeExpr() && NewSize != OldSize)) {
5040     Result = getDerived().RebuildConstantArrayType(ElementType,
5041                                                    T->getSizeModifier(),
5042                                                    T->getSize(), NewSize,
5043                                              T->getIndexTypeCVRQualifiers(),
5044                                                    TL.getBracketsRange());
5045     if (Result.isNull())
5046       return QualType();
5047   }
5048 
5049   // We might have either a ConstantArrayType or a VariableArrayType now:
5050   // a ConstantArrayType is allowed to have an element type which is a
5051   // VariableArrayType if the type is dependent.  Fortunately, all array
5052   // types have the same location layout.
5053   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5054   NewTL.setLBracketLoc(TL.getLBracketLoc());
5055   NewTL.setRBracketLoc(TL.getRBracketLoc());
5056   NewTL.setSizeExpr(NewSize);
5057 
5058   return Result;
5059 }
5060 
5061 template<typename Derived>
5062 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5063                                               TypeLocBuilder &TLB,
5064                                               IncompleteArrayTypeLoc TL) {
5065   const IncompleteArrayType *T = TL.getTypePtr();
5066   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5067   if (ElementType.isNull())
5068     return QualType();
5069 
5070   QualType Result = TL.getType();
5071   if (getDerived().AlwaysRebuild() ||
5072       ElementType != T->getElementType()) {
5073     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5074                                                      T->getSizeModifier(),
5075                                            T->getIndexTypeCVRQualifiers(),
5076                                                      TL.getBracketsRange());
5077     if (Result.isNull())
5078       return QualType();
5079   }
5080 
5081   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5082   NewTL.setLBracketLoc(TL.getLBracketLoc());
5083   NewTL.setRBracketLoc(TL.getRBracketLoc());
5084   NewTL.setSizeExpr(nullptr);
5085 
5086   return Result;
5087 }
5088 
5089 template<typename Derived>
5090 QualType
5091 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5092                                                    VariableArrayTypeLoc TL) {
5093   const VariableArrayType *T = TL.getTypePtr();
5094   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5095   if (ElementType.isNull())
5096     return QualType();
5097 
5098   ExprResult SizeResult;
5099   {
5100     EnterExpressionEvaluationContext Context(
5101         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5102     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5103   }
5104   if (SizeResult.isInvalid())
5105     return QualType();
5106   SizeResult =
5107       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5108   if (SizeResult.isInvalid())
5109     return QualType();
5110 
5111   Expr *Size = SizeResult.get();
5112 
5113   QualType Result = TL.getType();
5114   if (getDerived().AlwaysRebuild() ||
5115       ElementType != T->getElementType() ||
5116       Size != T->getSizeExpr()) {
5117     Result = getDerived().RebuildVariableArrayType(ElementType,
5118                                                    T->getSizeModifier(),
5119                                                    Size,
5120                                              T->getIndexTypeCVRQualifiers(),
5121                                                    TL.getBracketsRange());
5122     if (Result.isNull())
5123       return QualType();
5124   }
5125 
5126   // We might have constant size array now, but fortunately it has the same
5127   // location layout.
5128   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5129   NewTL.setLBracketLoc(TL.getLBracketLoc());
5130   NewTL.setRBracketLoc(TL.getRBracketLoc());
5131   NewTL.setSizeExpr(Size);
5132 
5133   return Result;
5134 }
5135 
5136 template<typename Derived>
5137 QualType
5138 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5139                                              DependentSizedArrayTypeLoc TL) {
5140   const DependentSizedArrayType *T = TL.getTypePtr();
5141   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5142   if (ElementType.isNull())
5143     return QualType();
5144 
5145   // Array bounds are constant expressions.
5146   EnterExpressionEvaluationContext Unevaluated(
5147       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5148 
5149   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5150   Expr *origSize = TL.getSizeExpr();
5151   if (!origSize) origSize = T->getSizeExpr();
5152 
5153   ExprResult sizeResult
5154     = getDerived().TransformExpr(origSize);
5155   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5156   if (sizeResult.isInvalid())
5157     return QualType();
5158 
5159   Expr *size = sizeResult.get();
5160 
5161   QualType Result = TL.getType();
5162   if (getDerived().AlwaysRebuild() ||
5163       ElementType != T->getElementType() ||
5164       size != origSize) {
5165     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5166                                                          T->getSizeModifier(),
5167                                                          size,
5168                                                 T->getIndexTypeCVRQualifiers(),
5169                                                         TL.getBracketsRange());
5170     if (Result.isNull())
5171       return QualType();
5172   }
5173 
5174   // We might have any sort of array type now, but fortunately they
5175   // all have the same location layout.
5176   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5177   NewTL.setLBracketLoc(TL.getLBracketLoc());
5178   NewTL.setRBracketLoc(TL.getRBracketLoc());
5179   NewTL.setSizeExpr(size);
5180 
5181   return Result;
5182 }
5183 
5184 template <typename Derived>
5185 QualType TreeTransform<Derived>::TransformDependentVectorType(
5186     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5187   const DependentVectorType *T = TL.getTypePtr();
5188   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5189   if (ElementType.isNull())
5190     return QualType();
5191 
5192   EnterExpressionEvaluationContext Unevaluated(
5193       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5194 
5195   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5196   Size = SemaRef.ActOnConstantExpression(Size);
5197   if (Size.isInvalid())
5198     return QualType();
5199 
5200   QualType Result = TL.getType();
5201   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5202       Size.get() != T->getSizeExpr()) {
5203     Result = getDerived().RebuildDependentVectorType(
5204         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5205     if (Result.isNull())
5206       return QualType();
5207   }
5208 
5209   // Result might be dependent or not.
5210   if (isa<DependentVectorType>(Result)) {
5211     DependentVectorTypeLoc NewTL =
5212         TLB.push<DependentVectorTypeLoc>(Result);
5213     NewTL.setNameLoc(TL.getNameLoc());
5214   } else {
5215     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5216     NewTL.setNameLoc(TL.getNameLoc());
5217   }
5218 
5219   return Result;
5220 }
5221 
5222 template<typename Derived>
5223 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5224                                       TypeLocBuilder &TLB,
5225                                       DependentSizedExtVectorTypeLoc TL) {
5226   const DependentSizedExtVectorType *T = TL.getTypePtr();
5227 
5228   // FIXME: ext vector locs should be nested
5229   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5230   if (ElementType.isNull())
5231     return QualType();
5232 
5233   // Vector sizes are constant expressions.
5234   EnterExpressionEvaluationContext Unevaluated(
5235       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5236 
5237   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5238   Size = SemaRef.ActOnConstantExpression(Size);
5239   if (Size.isInvalid())
5240     return QualType();
5241 
5242   QualType Result = TL.getType();
5243   if (getDerived().AlwaysRebuild() ||
5244       ElementType != T->getElementType() ||
5245       Size.get() != T->getSizeExpr()) {
5246     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5247                                                              Size.get(),
5248                                                          T->getAttributeLoc());
5249     if (Result.isNull())
5250       return QualType();
5251   }
5252 
5253   // Result might be dependent or not.
5254   if (isa<DependentSizedExtVectorType>(Result)) {
5255     DependentSizedExtVectorTypeLoc NewTL
5256       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5257     NewTL.setNameLoc(TL.getNameLoc());
5258   } else {
5259     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5260     NewTL.setNameLoc(TL.getNameLoc());
5261   }
5262 
5263   return Result;
5264 }
5265 
5266 template <typename Derived>
5267 QualType
5268 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5269                                                     ConstantMatrixTypeLoc TL) {
5270   const ConstantMatrixType *T = TL.getTypePtr();
5271   QualType ElementType = getDerived().TransformType(T->getElementType());
5272   if (ElementType.isNull())
5273     return QualType();
5274 
5275   QualType Result = TL.getType();
5276   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5277     Result = getDerived().RebuildConstantMatrixType(
5278         ElementType, T->getNumRows(), T->getNumColumns());
5279     if (Result.isNull())
5280       return QualType();
5281   }
5282 
5283   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5284   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5285   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5286   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5287   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5288 
5289   return Result;
5290 }
5291 
5292 template <typename Derived>
5293 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5294     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5295   const DependentSizedMatrixType *T = TL.getTypePtr();
5296 
5297   QualType ElementType = getDerived().TransformType(T->getElementType());
5298   if (ElementType.isNull()) {
5299     return QualType();
5300   }
5301 
5302   // Matrix dimensions are constant expressions.
5303   EnterExpressionEvaluationContext Unevaluated(
5304       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5305 
5306   Expr *origRows = TL.getAttrRowOperand();
5307   if (!origRows)
5308     origRows = T->getRowExpr();
5309   Expr *origColumns = TL.getAttrColumnOperand();
5310   if (!origColumns)
5311     origColumns = T->getColumnExpr();
5312 
5313   ExprResult rowResult = getDerived().TransformExpr(origRows);
5314   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5315   if (rowResult.isInvalid())
5316     return QualType();
5317 
5318   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5319   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5320   if (columnResult.isInvalid())
5321     return QualType();
5322 
5323   Expr *rows = rowResult.get();
5324   Expr *columns = columnResult.get();
5325 
5326   QualType Result = TL.getType();
5327   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5328       rows != origRows || columns != origColumns) {
5329     Result = getDerived().RebuildDependentSizedMatrixType(
5330         ElementType, rows, columns, T->getAttributeLoc());
5331 
5332     if (Result.isNull())
5333       return QualType();
5334   }
5335 
5336   // We might have any sort of matrix type now, but fortunately they
5337   // all have the same location layout.
5338   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5339   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5340   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5341   NewTL.setAttrRowOperand(rows);
5342   NewTL.setAttrColumnOperand(columns);
5343   return Result;
5344 }
5345 
5346 template <typename Derived>
5347 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5348     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5349   const DependentAddressSpaceType *T = TL.getTypePtr();
5350 
5351   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5352 
5353   if (pointeeType.isNull())
5354     return QualType();
5355 
5356   // Address spaces are constant expressions.
5357   EnterExpressionEvaluationContext Unevaluated(
5358       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5359 
5360   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5361   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5362   if (AddrSpace.isInvalid())
5363     return QualType();
5364 
5365   QualType Result = TL.getType();
5366   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5367       AddrSpace.get() != T->getAddrSpaceExpr()) {
5368     Result = getDerived().RebuildDependentAddressSpaceType(
5369         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5370     if (Result.isNull())
5371       return QualType();
5372   }
5373 
5374   // Result might be dependent or not.
5375   if (isa<DependentAddressSpaceType>(Result)) {
5376     DependentAddressSpaceTypeLoc NewTL =
5377         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5378 
5379     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5380     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5381     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5382 
5383   } else {
5384     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5385         Result, getDerived().getBaseLocation());
5386     TransformType(TLB, DI->getTypeLoc());
5387   }
5388 
5389   return Result;
5390 }
5391 
5392 template <typename Derived>
5393 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5394                                                      VectorTypeLoc TL) {
5395   const VectorType *T = TL.getTypePtr();
5396   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5397   if (ElementType.isNull())
5398     return QualType();
5399 
5400   QualType Result = TL.getType();
5401   if (getDerived().AlwaysRebuild() ||
5402       ElementType != T->getElementType()) {
5403     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5404                                             T->getVectorKind());
5405     if (Result.isNull())
5406       return QualType();
5407   }
5408 
5409   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5410   NewTL.setNameLoc(TL.getNameLoc());
5411 
5412   return Result;
5413 }
5414 
5415 template<typename Derived>
5416 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5417                                                         ExtVectorTypeLoc TL) {
5418   const VectorType *T = TL.getTypePtr();
5419   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5420   if (ElementType.isNull())
5421     return QualType();
5422 
5423   QualType Result = TL.getType();
5424   if (getDerived().AlwaysRebuild() ||
5425       ElementType != T->getElementType()) {
5426     Result = getDerived().RebuildExtVectorType(ElementType,
5427                                                T->getNumElements(),
5428                                                /*FIXME*/ SourceLocation());
5429     if (Result.isNull())
5430       return QualType();
5431   }
5432 
5433   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5434   NewTL.setNameLoc(TL.getNameLoc());
5435 
5436   return Result;
5437 }
5438 
5439 template <typename Derived>
5440 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5441     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5442     bool ExpectParameterPack) {
5443   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5444   TypeSourceInfo *NewDI = nullptr;
5445 
5446   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5447     // If we're substituting into a pack expansion type and we know the
5448     // length we want to expand to, just substitute for the pattern.
5449     TypeLoc OldTL = OldDI->getTypeLoc();
5450     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5451 
5452     TypeLocBuilder TLB;
5453     TypeLoc NewTL = OldDI->getTypeLoc();
5454     TLB.reserve(NewTL.getFullDataSize());
5455 
5456     QualType Result = getDerived().TransformType(TLB,
5457                                                OldExpansionTL.getPatternLoc());
5458     if (Result.isNull())
5459       return nullptr;
5460 
5461     Result = RebuildPackExpansionType(Result,
5462                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5463                                       OldExpansionTL.getEllipsisLoc(),
5464                                       NumExpansions);
5465     if (Result.isNull())
5466       return nullptr;
5467 
5468     PackExpansionTypeLoc NewExpansionTL
5469       = TLB.push<PackExpansionTypeLoc>(Result);
5470     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5471     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5472   } else
5473     NewDI = getDerived().TransformType(OldDI);
5474   if (!NewDI)
5475     return nullptr;
5476 
5477   if (NewDI == OldDI && indexAdjustment == 0)
5478     return OldParm;
5479 
5480   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5481                                              OldParm->getDeclContext(),
5482                                              OldParm->getInnerLocStart(),
5483                                              OldParm->getLocation(),
5484                                              OldParm->getIdentifier(),
5485                                              NewDI->getType(),
5486                                              NewDI,
5487                                              OldParm->getStorageClass(),
5488                                              /* DefArg */ nullptr);
5489   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5490                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5491   transformedLocalDecl(OldParm, {newParm});
5492   return newParm;
5493 }
5494 
5495 template <typename Derived>
5496 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5497     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5498     const QualType *ParamTypes,
5499     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5500     SmallVectorImpl<QualType> &OutParamTypes,
5501     SmallVectorImpl<ParmVarDecl *> *PVars,
5502     Sema::ExtParameterInfoBuilder &PInfos) {
5503   int indexAdjustment = 0;
5504 
5505   unsigned NumParams = Params.size();
5506   for (unsigned i = 0; i != NumParams; ++i) {
5507     if (ParmVarDecl *OldParm = Params[i]) {
5508       assert(OldParm->getFunctionScopeIndex() == i);
5509 
5510       Optional<unsigned> NumExpansions;
5511       ParmVarDecl *NewParm = nullptr;
5512       if (OldParm->isParameterPack()) {
5513         // We have a function parameter pack that may need to be expanded.
5514         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5515 
5516         // Find the parameter packs that could be expanded.
5517         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5518         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5519         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5520         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5521 
5522         // Determine whether we should expand the parameter packs.
5523         bool ShouldExpand = false;
5524         bool RetainExpansion = false;
5525         Optional<unsigned> OrigNumExpansions;
5526         if (Unexpanded.size() > 0) {
5527           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5528           NumExpansions = OrigNumExpansions;
5529           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5530                                                    Pattern.getSourceRange(),
5531                                                    Unexpanded,
5532                                                    ShouldExpand,
5533                                                    RetainExpansion,
5534                                                    NumExpansions)) {
5535             return true;
5536           }
5537         } else {
5538 #ifndef NDEBUG
5539           const AutoType *AT =
5540               Pattern.getType().getTypePtr()->getContainedAutoType();
5541           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5542                  "Could not find parameter packs or undeduced auto type!");
5543 #endif
5544         }
5545 
5546         if (ShouldExpand) {
5547           // Expand the function parameter pack into multiple, separate
5548           // parameters.
5549           getDerived().ExpandingFunctionParameterPack(OldParm);
5550           for (unsigned I = 0; I != *NumExpansions; ++I) {
5551             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5552             ParmVarDecl *NewParm
5553               = getDerived().TransformFunctionTypeParam(OldParm,
5554                                                         indexAdjustment++,
5555                                                         OrigNumExpansions,
5556                                                 /*ExpectParameterPack=*/false);
5557             if (!NewParm)
5558               return true;
5559 
5560             if (ParamInfos)
5561               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5562             OutParamTypes.push_back(NewParm->getType());
5563             if (PVars)
5564               PVars->push_back(NewParm);
5565           }
5566 
5567           // If we're supposed to retain a pack expansion, do so by temporarily
5568           // forgetting the partially-substituted parameter pack.
5569           if (RetainExpansion) {
5570             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5571             ParmVarDecl *NewParm
5572               = getDerived().TransformFunctionTypeParam(OldParm,
5573                                                         indexAdjustment++,
5574                                                         OrigNumExpansions,
5575                                                 /*ExpectParameterPack=*/false);
5576             if (!NewParm)
5577               return true;
5578 
5579             if (ParamInfos)
5580               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5581             OutParamTypes.push_back(NewParm->getType());
5582             if (PVars)
5583               PVars->push_back(NewParm);
5584           }
5585 
5586           // The next parameter should have the same adjustment as the
5587           // last thing we pushed, but we post-incremented indexAdjustment
5588           // on every push.  Also, if we push nothing, the adjustment should
5589           // go down by one.
5590           indexAdjustment--;
5591 
5592           // We're done with the pack expansion.
5593           continue;
5594         }
5595 
5596         // We'll substitute the parameter now without expanding the pack
5597         // expansion.
5598         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5599         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5600                                                           indexAdjustment,
5601                                                           NumExpansions,
5602                                                   /*ExpectParameterPack=*/true);
5603         assert(NewParm->isParameterPack() &&
5604                "Parameter pack no longer a parameter pack after "
5605                "transformation.");
5606       } else {
5607         NewParm = getDerived().TransformFunctionTypeParam(
5608             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5609       }
5610 
5611       if (!NewParm)
5612         return true;
5613 
5614       if (ParamInfos)
5615         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5616       OutParamTypes.push_back(NewParm->getType());
5617       if (PVars)
5618         PVars->push_back(NewParm);
5619       continue;
5620     }
5621 
5622     // Deal with the possibility that we don't have a parameter
5623     // declaration for this parameter.
5624     QualType OldType = ParamTypes[i];
5625     bool IsPackExpansion = false;
5626     Optional<unsigned> NumExpansions;
5627     QualType NewType;
5628     if (const PackExpansionType *Expansion
5629                                        = dyn_cast<PackExpansionType>(OldType)) {
5630       // We have a function parameter pack that may need to be expanded.
5631       QualType Pattern = Expansion->getPattern();
5632       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5633       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5634 
5635       // Determine whether we should expand the parameter packs.
5636       bool ShouldExpand = false;
5637       bool RetainExpansion = false;
5638       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5639                                                Unexpanded,
5640                                                ShouldExpand,
5641                                                RetainExpansion,
5642                                                NumExpansions)) {
5643         return true;
5644       }
5645 
5646       if (ShouldExpand) {
5647         // Expand the function parameter pack into multiple, separate
5648         // parameters.
5649         for (unsigned I = 0; I != *NumExpansions; ++I) {
5650           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5651           QualType NewType = getDerived().TransformType(Pattern);
5652           if (NewType.isNull())
5653             return true;
5654 
5655           if (NewType->containsUnexpandedParameterPack()) {
5656             NewType =
5657                 getSema().getASTContext().getPackExpansionType(NewType, None);
5658 
5659             if (NewType.isNull())
5660               return true;
5661           }
5662 
5663           if (ParamInfos)
5664             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5665           OutParamTypes.push_back(NewType);
5666           if (PVars)
5667             PVars->push_back(nullptr);
5668         }
5669 
5670         // We're done with the pack expansion.
5671         continue;
5672       }
5673 
5674       // If we're supposed to retain a pack expansion, do so by temporarily
5675       // forgetting the partially-substituted parameter pack.
5676       if (RetainExpansion) {
5677         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5678         QualType NewType = getDerived().TransformType(Pattern);
5679         if (NewType.isNull())
5680           return true;
5681 
5682         if (ParamInfos)
5683           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5684         OutParamTypes.push_back(NewType);
5685         if (PVars)
5686           PVars->push_back(nullptr);
5687       }
5688 
5689       // We'll substitute the parameter now without expanding the pack
5690       // expansion.
5691       OldType = Expansion->getPattern();
5692       IsPackExpansion = true;
5693       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5694       NewType = getDerived().TransformType(OldType);
5695     } else {
5696       NewType = getDerived().TransformType(OldType);
5697     }
5698 
5699     if (NewType.isNull())
5700       return true;
5701 
5702     if (IsPackExpansion)
5703       NewType = getSema().Context.getPackExpansionType(NewType,
5704                                                        NumExpansions);
5705 
5706     if (ParamInfos)
5707       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5708     OutParamTypes.push_back(NewType);
5709     if (PVars)
5710       PVars->push_back(nullptr);
5711   }
5712 
5713 #ifndef NDEBUG
5714   if (PVars) {
5715     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5716       if (ParmVarDecl *parm = (*PVars)[i])
5717         assert(parm->getFunctionScopeIndex() == i);
5718   }
5719 #endif
5720 
5721   return false;
5722 }
5723 
5724 template<typename Derived>
5725 QualType
5726 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5727                                                    FunctionProtoTypeLoc TL) {
5728   SmallVector<QualType, 4> ExceptionStorage;
5729   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5730   return getDerived().TransformFunctionProtoType(
5731       TLB, TL, nullptr, Qualifiers(),
5732       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5733         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5734                                             ExceptionStorage, Changed);
5735       });
5736 }
5737 
5738 template<typename Derived> template<typename Fn>
5739 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5740     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5741     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5742 
5743   // Transform the parameters and return type.
5744   //
5745   // We are required to instantiate the params and return type in source order.
5746   // When the function has a trailing return type, we instantiate the
5747   // parameters before the return type,  since the return type can then refer
5748   // to the parameters themselves (via decltype, sizeof, etc.).
5749   //
5750   SmallVector<QualType, 4> ParamTypes;
5751   SmallVector<ParmVarDecl*, 4> ParamDecls;
5752   Sema::ExtParameterInfoBuilder ExtParamInfos;
5753   const FunctionProtoType *T = TL.getTypePtr();
5754 
5755   QualType ResultType;
5756 
5757   if (T->hasTrailingReturn()) {
5758     if (getDerived().TransformFunctionTypeParams(
5759             TL.getBeginLoc(), TL.getParams(),
5760             TL.getTypePtr()->param_type_begin(),
5761             T->getExtParameterInfosOrNull(),
5762             ParamTypes, &ParamDecls, ExtParamInfos))
5763       return QualType();
5764 
5765     {
5766       // C++11 [expr.prim.general]p3:
5767       //   If a declaration declares a member function or member function
5768       //   template of a class X, the expression this is a prvalue of type
5769       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5770       //   and the end of the function-definition, member-declarator, or
5771       //   declarator.
5772       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5773 
5774       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5775       if (ResultType.isNull())
5776         return QualType();
5777     }
5778   }
5779   else {
5780     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5781     if (ResultType.isNull())
5782       return QualType();
5783 
5784     if (getDerived().TransformFunctionTypeParams(
5785             TL.getBeginLoc(), TL.getParams(),
5786             TL.getTypePtr()->param_type_begin(),
5787             T->getExtParameterInfosOrNull(),
5788             ParamTypes, &ParamDecls, ExtParamInfos))
5789       return QualType();
5790   }
5791 
5792   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5793 
5794   bool EPIChanged = false;
5795   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5796     return QualType();
5797 
5798   // Handle extended parameter information.
5799   if (auto NewExtParamInfos =
5800         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5801     if (!EPI.ExtParameterInfos ||
5802         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5803           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5804       EPIChanged = true;
5805     }
5806     EPI.ExtParameterInfos = NewExtParamInfos;
5807   } else if (EPI.ExtParameterInfos) {
5808     EPIChanged = true;
5809     EPI.ExtParameterInfos = nullptr;
5810   }
5811 
5812   QualType Result = TL.getType();
5813   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5814       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5815     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5816     if (Result.isNull())
5817       return QualType();
5818   }
5819 
5820   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5821   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5822   NewTL.setLParenLoc(TL.getLParenLoc());
5823   NewTL.setRParenLoc(TL.getRParenLoc());
5824   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5825   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5826   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5827     NewTL.setParam(i, ParamDecls[i]);
5828 
5829   return Result;
5830 }
5831 
5832 template<typename Derived>
5833 bool TreeTransform<Derived>::TransformExceptionSpec(
5834     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5835     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5836   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5837 
5838   // Instantiate a dynamic noexcept expression, if any.
5839   if (isComputedNoexcept(ESI.Type)) {
5840     EnterExpressionEvaluationContext Unevaluated(
5841         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5842     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5843     if (NoexceptExpr.isInvalid())
5844       return true;
5845 
5846     ExceptionSpecificationType EST = ESI.Type;
5847     NoexceptExpr =
5848         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5849     if (NoexceptExpr.isInvalid())
5850       return true;
5851 
5852     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5853       Changed = true;
5854     ESI.NoexceptExpr = NoexceptExpr.get();
5855     ESI.Type = EST;
5856   }
5857 
5858   if (ESI.Type != EST_Dynamic)
5859     return false;
5860 
5861   // Instantiate a dynamic exception specification's type.
5862   for (QualType T : ESI.Exceptions) {
5863     if (const PackExpansionType *PackExpansion =
5864             T->getAs<PackExpansionType>()) {
5865       Changed = true;
5866 
5867       // We have a pack expansion. Instantiate it.
5868       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5869       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5870                                               Unexpanded);
5871       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5872 
5873       // Determine whether the set of unexpanded parameter packs can and
5874       // should
5875       // be expanded.
5876       bool Expand = false;
5877       bool RetainExpansion = false;
5878       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5879       // FIXME: Track the location of the ellipsis (and track source location
5880       // information for the types in the exception specification in general).
5881       if (getDerived().TryExpandParameterPacks(
5882               Loc, SourceRange(), Unexpanded, Expand,
5883               RetainExpansion, NumExpansions))
5884         return true;
5885 
5886       if (!Expand) {
5887         // We can't expand this pack expansion into separate arguments yet;
5888         // just substitute into the pattern and create a new pack expansion
5889         // type.
5890         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5891         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5892         if (U.isNull())
5893           return true;
5894 
5895         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5896         Exceptions.push_back(U);
5897         continue;
5898       }
5899 
5900       // Substitute into the pack expansion pattern for each slice of the
5901       // pack.
5902       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5903         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5904 
5905         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5906         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5907           return true;
5908 
5909         Exceptions.push_back(U);
5910       }
5911     } else {
5912       QualType U = getDerived().TransformType(T);
5913       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5914         return true;
5915       if (T != U)
5916         Changed = true;
5917 
5918       Exceptions.push_back(U);
5919     }
5920   }
5921 
5922   ESI.Exceptions = Exceptions;
5923   if (ESI.Exceptions.empty())
5924     ESI.Type = EST_DynamicNone;
5925   return false;
5926 }
5927 
5928 template<typename Derived>
5929 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5930                                                  TypeLocBuilder &TLB,
5931                                                  FunctionNoProtoTypeLoc TL) {
5932   const FunctionNoProtoType *T = TL.getTypePtr();
5933   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5934   if (ResultType.isNull())
5935     return QualType();
5936 
5937   QualType Result = TL.getType();
5938   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5939     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5940 
5941   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5942   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5943   NewTL.setLParenLoc(TL.getLParenLoc());
5944   NewTL.setRParenLoc(TL.getRParenLoc());
5945   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5946 
5947   return Result;
5948 }
5949 
5950 template<typename Derived> QualType
5951 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5952                                                  UnresolvedUsingTypeLoc TL) {
5953   const UnresolvedUsingType *T = TL.getTypePtr();
5954   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5955   if (!D)
5956     return QualType();
5957 
5958   QualType Result = TL.getType();
5959   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5960     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5961     if (Result.isNull())
5962       return QualType();
5963   }
5964 
5965   // We might get an arbitrary type spec type back.  We should at
5966   // least always get a type spec type, though.
5967   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5968   NewTL.setNameLoc(TL.getNameLoc());
5969 
5970   return Result;
5971 }
5972 
5973 template<typename Derived>
5974 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5975                                                       TypedefTypeLoc TL) {
5976   const TypedefType *T = TL.getTypePtr();
5977   TypedefNameDecl *Typedef
5978     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5979                                                                T->getDecl()));
5980   if (!Typedef)
5981     return QualType();
5982 
5983   QualType Result = TL.getType();
5984   if (getDerived().AlwaysRebuild() ||
5985       Typedef != T->getDecl()) {
5986     Result = getDerived().RebuildTypedefType(Typedef);
5987     if (Result.isNull())
5988       return QualType();
5989   }
5990 
5991   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5992   NewTL.setNameLoc(TL.getNameLoc());
5993 
5994   return Result;
5995 }
5996 
5997 template<typename Derived>
5998 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5999                                                       TypeOfExprTypeLoc TL) {
6000   // typeof expressions are not potentially evaluated contexts
6001   EnterExpressionEvaluationContext Unevaluated(
6002       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
6003       Sema::ReuseLambdaContextDecl);
6004 
6005   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
6006   if (E.isInvalid())
6007     return QualType();
6008 
6009   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6010   if (E.isInvalid())
6011     return QualType();
6012 
6013   QualType Result = TL.getType();
6014   if (getDerived().AlwaysRebuild() ||
6015       E.get() != TL.getUnderlyingExpr()) {
6016     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6017     if (Result.isNull())
6018       return QualType();
6019   }
6020   else E.get();
6021 
6022   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6023   NewTL.setTypeofLoc(TL.getTypeofLoc());
6024   NewTL.setLParenLoc(TL.getLParenLoc());
6025   NewTL.setRParenLoc(TL.getRParenLoc());
6026 
6027   return Result;
6028 }
6029 
6030 template<typename Derived>
6031 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6032                                                      TypeOfTypeLoc TL) {
6033   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6034   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6035   if (!New_Under_TI)
6036     return QualType();
6037 
6038   QualType Result = TL.getType();
6039   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6040     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6041     if (Result.isNull())
6042       return QualType();
6043   }
6044 
6045   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6046   NewTL.setTypeofLoc(TL.getTypeofLoc());
6047   NewTL.setLParenLoc(TL.getLParenLoc());
6048   NewTL.setRParenLoc(TL.getRParenLoc());
6049   NewTL.setUnderlyingTInfo(New_Under_TI);
6050 
6051   return Result;
6052 }
6053 
6054 template<typename Derived>
6055 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6056                                                        DecltypeTypeLoc TL) {
6057   const DecltypeType *T = TL.getTypePtr();
6058 
6059   // decltype expressions are not potentially evaluated contexts
6060   EnterExpressionEvaluationContext Unevaluated(
6061       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6062       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6063 
6064   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6065   if (E.isInvalid())
6066     return QualType();
6067 
6068   E = getSema().ActOnDecltypeExpression(E.get());
6069   if (E.isInvalid())
6070     return QualType();
6071 
6072   QualType Result = TL.getType();
6073   if (getDerived().AlwaysRebuild() ||
6074       E.get() != T->getUnderlyingExpr()) {
6075     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6076     if (Result.isNull())
6077       return QualType();
6078   }
6079   else E.get();
6080 
6081   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6082   NewTL.setNameLoc(TL.getNameLoc());
6083 
6084   return Result;
6085 }
6086 
6087 template<typename Derived>
6088 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6089                                                             TypeLocBuilder &TLB,
6090                                                      UnaryTransformTypeLoc TL) {
6091   QualType Result = TL.getType();
6092   if (Result->isDependentType()) {
6093     const UnaryTransformType *T = TL.getTypePtr();
6094     QualType NewBase =
6095       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6096     Result = getDerived().RebuildUnaryTransformType(NewBase,
6097                                                     T->getUTTKind(),
6098                                                     TL.getKWLoc());
6099     if (Result.isNull())
6100       return QualType();
6101   }
6102 
6103   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6104   NewTL.setKWLoc(TL.getKWLoc());
6105   NewTL.setParensRange(TL.getParensRange());
6106   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6107   return Result;
6108 }
6109 
6110 template<typename Derived>
6111 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6112     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6113   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6114 
6115   CXXScopeSpec SS;
6116   TemplateName TemplateName = getDerived().TransformTemplateName(
6117       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6118   if (TemplateName.isNull())
6119     return QualType();
6120 
6121   QualType OldDeduced = T->getDeducedType();
6122   QualType NewDeduced;
6123   if (!OldDeduced.isNull()) {
6124     NewDeduced = getDerived().TransformType(OldDeduced);
6125     if (NewDeduced.isNull())
6126       return QualType();
6127   }
6128 
6129   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6130       TemplateName, NewDeduced);
6131   if (Result.isNull())
6132     return QualType();
6133 
6134   DeducedTemplateSpecializationTypeLoc NewTL =
6135       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6136   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6137 
6138   return Result;
6139 }
6140 
6141 template<typename Derived>
6142 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6143                                                      RecordTypeLoc TL) {
6144   const RecordType *T = TL.getTypePtr();
6145   RecordDecl *Record
6146     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6147                                                           T->getDecl()));
6148   if (!Record)
6149     return QualType();
6150 
6151   QualType Result = TL.getType();
6152   if (getDerived().AlwaysRebuild() ||
6153       Record != T->getDecl()) {
6154     Result = getDerived().RebuildRecordType(Record);
6155     if (Result.isNull())
6156       return QualType();
6157   }
6158 
6159   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6160   NewTL.setNameLoc(TL.getNameLoc());
6161 
6162   return Result;
6163 }
6164 
6165 template<typename Derived>
6166 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6167                                                    EnumTypeLoc TL) {
6168   const EnumType *T = TL.getTypePtr();
6169   EnumDecl *Enum
6170     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6171                                                         T->getDecl()));
6172   if (!Enum)
6173     return QualType();
6174 
6175   QualType Result = TL.getType();
6176   if (getDerived().AlwaysRebuild() ||
6177       Enum != T->getDecl()) {
6178     Result = getDerived().RebuildEnumType(Enum);
6179     if (Result.isNull())
6180       return QualType();
6181   }
6182 
6183   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6184   NewTL.setNameLoc(TL.getNameLoc());
6185 
6186   return Result;
6187 }
6188 
6189 template<typename Derived>
6190 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6191                                          TypeLocBuilder &TLB,
6192                                          InjectedClassNameTypeLoc TL) {
6193   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6194                                        TL.getTypePtr()->getDecl());
6195   if (!D) return QualType();
6196 
6197   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6198   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6199   return T;
6200 }
6201 
6202 template<typename Derived>
6203 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6204                                                 TypeLocBuilder &TLB,
6205                                                 TemplateTypeParmTypeLoc TL) {
6206   return TransformTypeSpecType(TLB, TL);
6207 }
6208 
6209 template<typename Derived>
6210 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6211                                          TypeLocBuilder &TLB,
6212                                          SubstTemplateTypeParmTypeLoc TL) {
6213   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6214 
6215   // Substitute into the replacement type, which itself might involve something
6216   // that needs to be transformed. This only tends to occur with default
6217   // template arguments of template template parameters.
6218   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6219   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6220   if (Replacement.isNull())
6221     return QualType();
6222 
6223   // Always canonicalize the replacement type.
6224   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6225   QualType Result
6226     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6227                                                    Replacement);
6228 
6229   // Propagate type-source information.
6230   SubstTemplateTypeParmTypeLoc NewTL
6231     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6232   NewTL.setNameLoc(TL.getNameLoc());
6233   return Result;
6234 
6235 }
6236 
6237 template<typename Derived>
6238 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6239                                           TypeLocBuilder &TLB,
6240                                           SubstTemplateTypeParmPackTypeLoc TL) {
6241   return TransformTypeSpecType(TLB, TL);
6242 }
6243 
6244 template<typename Derived>
6245 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6246                                                         TypeLocBuilder &TLB,
6247                                            TemplateSpecializationTypeLoc TL) {
6248   const TemplateSpecializationType *T = TL.getTypePtr();
6249 
6250   // The nested-name-specifier never matters in a TemplateSpecializationType,
6251   // because we can't have a dependent nested-name-specifier anyway.
6252   CXXScopeSpec SS;
6253   TemplateName Template
6254     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6255                                          TL.getTemplateNameLoc());
6256   if (Template.isNull())
6257     return QualType();
6258 
6259   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6260 }
6261 
6262 template<typename Derived>
6263 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6264                                                      AtomicTypeLoc TL) {
6265   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6266   if (ValueType.isNull())
6267     return QualType();
6268 
6269   QualType Result = TL.getType();
6270   if (getDerived().AlwaysRebuild() ||
6271       ValueType != TL.getValueLoc().getType()) {
6272     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6273     if (Result.isNull())
6274       return QualType();
6275   }
6276 
6277   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6278   NewTL.setKWLoc(TL.getKWLoc());
6279   NewTL.setLParenLoc(TL.getLParenLoc());
6280   NewTL.setRParenLoc(TL.getRParenLoc());
6281 
6282   return Result;
6283 }
6284 
6285 template <typename Derived>
6286 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6287                                                    PipeTypeLoc TL) {
6288   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6289   if (ValueType.isNull())
6290     return QualType();
6291 
6292   QualType Result = TL.getType();
6293   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6294     const PipeType *PT = Result->castAs<PipeType>();
6295     bool isReadPipe = PT->isReadOnly();
6296     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6297     if (Result.isNull())
6298       return QualType();
6299   }
6300 
6301   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6302   NewTL.setKWLoc(TL.getKWLoc());
6303 
6304   return Result;
6305 }
6306 
6307 template <typename Derived>
6308 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6309                                                      ExtIntTypeLoc TL) {
6310   const ExtIntType *EIT = TL.getTypePtr();
6311   QualType Result = TL.getType();
6312 
6313   if (getDerived().AlwaysRebuild()) {
6314     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6315                                             EIT->getNumBits(), TL.getNameLoc());
6316     if (Result.isNull())
6317       return QualType();
6318   }
6319 
6320   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6321   NewTL.setNameLoc(TL.getNameLoc());
6322   return Result;
6323 }
6324 
6325 template <typename Derived>
6326 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6327     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6328   const DependentExtIntType *EIT = TL.getTypePtr();
6329 
6330   EnterExpressionEvaluationContext Unevaluated(
6331       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6332   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6333   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6334 
6335   if (BitsExpr.isInvalid())
6336     return QualType();
6337 
6338   QualType Result = TL.getType();
6339 
6340   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6341     Result = getDerived().RebuildDependentExtIntType(
6342         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6343 
6344     if (Result.isNull())
6345       return QualType();
6346   }
6347 
6348   if (isa<DependentExtIntType>(Result)) {
6349     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6350     NewTL.setNameLoc(TL.getNameLoc());
6351   } else {
6352     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6353     NewTL.setNameLoc(TL.getNameLoc());
6354   }
6355   return Result;
6356 }
6357 
6358   /// Simple iterator that traverses the template arguments in a
6359   /// container that provides a \c getArgLoc() member function.
6360   ///
6361   /// This iterator is intended to be used with the iterator form of
6362   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6363   template<typename ArgLocContainer>
6364   class TemplateArgumentLocContainerIterator {
6365     ArgLocContainer *Container;
6366     unsigned Index;
6367 
6368   public:
6369     typedef TemplateArgumentLoc value_type;
6370     typedef TemplateArgumentLoc reference;
6371     typedef int difference_type;
6372     typedef std::input_iterator_tag iterator_category;
6373 
6374     class pointer {
6375       TemplateArgumentLoc Arg;
6376 
6377     public:
6378       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6379 
6380       const TemplateArgumentLoc *operator->() const {
6381         return &Arg;
6382       }
6383     };
6384 
6385 
6386     TemplateArgumentLocContainerIterator() {}
6387 
6388     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6389                                  unsigned Index)
6390       : Container(&Container), Index(Index) { }
6391 
6392     TemplateArgumentLocContainerIterator &operator++() {
6393       ++Index;
6394       return *this;
6395     }
6396 
6397     TemplateArgumentLocContainerIterator operator++(int) {
6398       TemplateArgumentLocContainerIterator Old(*this);
6399       ++(*this);
6400       return Old;
6401     }
6402 
6403     TemplateArgumentLoc operator*() const {
6404       return Container->getArgLoc(Index);
6405     }
6406 
6407     pointer operator->() const {
6408       return pointer(Container->getArgLoc(Index));
6409     }
6410 
6411     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6412                            const TemplateArgumentLocContainerIterator &Y) {
6413       return X.Container == Y.Container && X.Index == Y.Index;
6414     }
6415 
6416     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6417                            const TemplateArgumentLocContainerIterator &Y) {
6418       return !(X == Y);
6419     }
6420   };
6421 
6422 template<typename Derived>
6423 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6424                                                    AutoTypeLoc TL) {
6425   const AutoType *T = TL.getTypePtr();
6426   QualType OldDeduced = T->getDeducedType();
6427   QualType NewDeduced;
6428   if (!OldDeduced.isNull()) {
6429     NewDeduced = getDerived().TransformType(OldDeduced);
6430     if (NewDeduced.isNull())
6431       return QualType();
6432   }
6433 
6434   ConceptDecl *NewCD = nullptr;
6435   TemplateArgumentListInfo NewTemplateArgs;
6436   NestedNameSpecifierLoc NewNestedNameSpec;
6437   if (TL.getTypePtr()->isConstrained()) {
6438     NewCD = cast_or_null<ConceptDecl>(
6439         getDerived().TransformDecl(
6440             TL.getConceptNameLoc(),
6441             TL.getTypePtr()->getTypeConstraintConcept()));
6442 
6443     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6444     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6445     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6446     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6447                                                 ArgIterator(TL,
6448                                                             TL.getNumArgs()),
6449                                                 NewTemplateArgs))
6450       return QualType();
6451 
6452     if (TL.getNestedNameSpecifierLoc()) {
6453       NewNestedNameSpec
6454         = getDerived().TransformNestedNameSpecifierLoc(
6455             TL.getNestedNameSpecifierLoc());
6456       if (!NewNestedNameSpec)
6457         return QualType();
6458     }
6459   }
6460 
6461   QualType Result = TL.getType();
6462   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6463       T->isDependentType()) {
6464     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6465     NewArgList.reserve(NewArgList.size());
6466     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6467       NewArgList.push_back(ArgLoc.getArgument());
6468     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6469                                           NewArgList);
6470     if (Result.isNull())
6471       return QualType();
6472   }
6473 
6474   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6475   NewTL.setNameLoc(TL.getNameLoc());
6476   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6477   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6478   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6479   NewTL.setFoundDecl(TL.getFoundDecl());
6480   NewTL.setLAngleLoc(TL.getLAngleLoc());
6481   NewTL.setRAngleLoc(TL.getRAngleLoc());
6482   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6483     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6484 
6485   return Result;
6486 }
6487 
6488 template <typename Derived>
6489 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6490                                                         TypeLocBuilder &TLB,
6491                                            TemplateSpecializationTypeLoc TL,
6492                                                       TemplateName Template) {
6493   TemplateArgumentListInfo NewTemplateArgs;
6494   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6495   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6496   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6497     ArgIterator;
6498   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6499                                               ArgIterator(TL, TL.getNumArgs()),
6500                                               NewTemplateArgs))
6501     return QualType();
6502 
6503   // FIXME: maybe don't rebuild if all the template arguments are the same.
6504 
6505   QualType Result =
6506     getDerived().RebuildTemplateSpecializationType(Template,
6507                                                    TL.getTemplateNameLoc(),
6508                                                    NewTemplateArgs);
6509 
6510   if (!Result.isNull()) {
6511     // Specializations of template template parameters are represented as
6512     // TemplateSpecializationTypes, and substitution of type alias templates
6513     // within a dependent context can transform them into
6514     // DependentTemplateSpecializationTypes.
6515     if (isa<DependentTemplateSpecializationType>(Result)) {
6516       DependentTemplateSpecializationTypeLoc NewTL
6517         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6518       NewTL.setElaboratedKeywordLoc(SourceLocation());
6519       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6520       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6521       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6522       NewTL.setLAngleLoc(TL.getLAngleLoc());
6523       NewTL.setRAngleLoc(TL.getRAngleLoc());
6524       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6525         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6526       return Result;
6527     }
6528 
6529     TemplateSpecializationTypeLoc NewTL
6530       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6531     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6532     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6533     NewTL.setLAngleLoc(TL.getLAngleLoc());
6534     NewTL.setRAngleLoc(TL.getRAngleLoc());
6535     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6536       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6537   }
6538 
6539   return Result;
6540 }
6541 
6542 template <typename Derived>
6543 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6544                                      TypeLocBuilder &TLB,
6545                                      DependentTemplateSpecializationTypeLoc TL,
6546                                      TemplateName Template,
6547                                      CXXScopeSpec &SS) {
6548   TemplateArgumentListInfo NewTemplateArgs;
6549   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6550   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6551   typedef TemplateArgumentLocContainerIterator<
6552             DependentTemplateSpecializationTypeLoc> ArgIterator;
6553   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6554                                               ArgIterator(TL, TL.getNumArgs()),
6555                                               NewTemplateArgs))
6556     return QualType();
6557 
6558   // FIXME: maybe don't rebuild if all the template arguments are the same.
6559 
6560   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6561     QualType Result
6562       = getSema().Context.getDependentTemplateSpecializationType(
6563                                                 TL.getTypePtr()->getKeyword(),
6564                                                          DTN->getQualifier(),
6565                                                          DTN->getIdentifier(),
6566                                                                NewTemplateArgs);
6567 
6568     DependentTemplateSpecializationTypeLoc NewTL
6569       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6570     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6571     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6572     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6573     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6574     NewTL.setLAngleLoc(TL.getLAngleLoc());
6575     NewTL.setRAngleLoc(TL.getRAngleLoc());
6576     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6577       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6578     return Result;
6579   }
6580 
6581   QualType Result
6582     = getDerived().RebuildTemplateSpecializationType(Template,
6583                                                      TL.getTemplateNameLoc(),
6584                                                      NewTemplateArgs);
6585 
6586   if (!Result.isNull()) {
6587     /// FIXME: Wrap this in an elaborated-type-specifier?
6588     TemplateSpecializationTypeLoc NewTL
6589       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6590     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6591     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6592     NewTL.setLAngleLoc(TL.getLAngleLoc());
6593     NewTL.setRAngleLoc(TL.getRAngleLoc());
6594     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6595       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6596   }
6597 
6598   return Result;
6599 }
6600 
6601 template<typename Derived>
6602 QualType
6603 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6604                                                 ElaboratedTypeLoc TL) {
6605   const ElaboratedType *T = TL.getTypePtr();
6606 
6607   NestedNameSpecifierLoc QualifierLoc;
6608   // NOTE: the qualifier in an ElaboratedType is optional.
6609   if (TL.getQualifierLoc()) {
6610     QualifierLoc
6611       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6612     if (!QualifierLoc)
6613       return QualType();
6614   }
6615 
6616   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6617   if (NamedT.isNull())
6618     return QualType();
6619 
6620   // C++0x [dcl.type.elab]p2:
6621   //   If the identifier resolves to a typedef-name or the simple-template-id
6622   //   resolves to an alias template specialization, the
6623   //   elaborated-type-specifier is ill-formed.
6624   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6625     if (const TemplateSpecializationType *TST =
6626           NamedT->getAs<TemplateSpecializationType>()) {
6627       TemplateName Template = TST->getTemplateName();
6628       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6629               Template.getAsTemplateDecl())) {
6630         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6631                      diag::err_tag_reference_non_tag)
6632             << TAT << Sema::NTK_TypeAliasTemplate
6633             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6634         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6635       }
6636     }
6637   }
6638 
6639   QualType Result = TL.getType();
6640   if (getDerived().AlwaysRebuild() ||
6641       QualifierLoc != TL.getQualifierLoc() ||
6642       NamedT != T->getNamedType()) {
6643     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6644                                                 T->getKeyword(),
6645                                                 QualifierLoc, NamedT);
6646     if (Result.isNull())
6647       return QualType();
6648   }
6649 
6650   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6651   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6652   NewTL.setQualifierLoc(QualifierLoc);
6653   return Result;
6654 }
6655 
6656 template<typename Derived>
6657 QualType TreeTransform<Derived>::TransformAttributedType(
6658                                                 TypeLocBuilder &TLB,
6659                                                 AttributedTypeLoc TL) {
6660   const AttributedType *oldType = TL.getTypePtr();
6661   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6662   if (modifiedType.isNull())
6663     return QualType();
6664 
6665   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6666   const Attr *oldAttr = TL.getAttr();
6667   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6668   if (oldAttr && !newAttr)
6669     return QualType();
6670 
6671   QualType result = TL.getType();
6672 
6673   // FIXME: dependent operand expressions?
6674   if (getDerived().AlwaysRebuild() ||
6675       modifiedType != oldType->getModifiedType()) {
6676     // TODO: this is really lame; we should really be rebuilding the
6677     // equivalent type from first principles.
6678     QualType equivalentType
6679       = getDerived().TransformType(oldType->getEquivalentType());
6680     if (equivalentType.isNull())
6681       return QualType();
6682 
6683     // Check whether we can add nullability; it is only represented as
6684     // type sugar, and therefore cannot be diagnosed in any other way.
6685     if (auto nullability = oldType->getImmediateNullability()) {
6686       if (!modifiedType->canHaveNullability()) {
6687         SemaRef.Diag(TL.getAttr()->getLocation(),
6688                      diag::err_nullability_nonpointer)
6689             << DiagNullabilityKind(*nullability, false) << modifiedType;
6690         return QualType();
6691       }
6692     }
6693 
6694     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6695                                                modifiedType,
6696                                                equivalentType);
6697   }
6698 
6699   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6700   newTL.setAttr(newAttr);
6701   return result;
6702 }
6703 
6704 template<typename Derived>
6705 QualType
6706 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6707                                            ParenTypeLoc TL) {
6708   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6709   if (Inner.isNull())
6710     return QualType();
6711 
6712   QualType Result = TL.getType();
6713   if (getDerived().AlwaysRebuild() ||
6714       Inner != TL.getInnerLoc().getType()) {
6715     Result = getDerived().RebuildParenType(Inner);
6716     if (Result.isNull())
6717       return QualType();
6718   }
6719 
6720   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6721   NewTL.setLParenLoc(TL.getLParenLoc());
6722   NewTL.setRParenLoc(TL.getRParenLoc());
6723   return Result;
6724 }
6725 
6726 template <typename Derived>
6727 QualType
6728 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6729                                                     MacroQualifiedTypeLoc TL) {
6730   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6731   if (Inner.isNull())
6732     return QualType();
6733 
6734   QualType Result = TL.getType();
6735   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6736     Result =
6737         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6738     if (Result.isNull())
6739       return QualType();
6740   }
6741 
6742   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6743   NewTL.setExpansionLoc(TL.getExpansionLoc());
6744   return Result;
6745 }
6746 
6747 template<typename Derived>
6748 QualType TreeTransform<Derived>::TransformDependentNameType(
6749     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6750   return TransformDependentNameType(TLB, TL, false);
6751 }
6752 
6753 template<typename Derived>
6754 QualType TreeTransform<Derived>::TransformDependentNameType(
6755     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6756   const DependentNameType *T = TL.getTypePtr();
6757 
6758   NestedNameSpecifierLoc QualifierLoc
6759     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6760   if (!QualifierLoc)
6761     return QualType();
6762 
6763   QualType Result
6764     = getDerived().RebuildDependentNameType(T->getKeyword(),
6765                                             TL.getElaboratedKeywordLoc(),
6766                                             QualifierLoc,
6767                                             T->getIdentifier(),
6768                                             TL.getNameLoc(),
6769                                             DeducedTSTContext);
6770   if (Result.isNull())
6771     return QualType();
6772 
6773   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6774     QualType NamedT = ElabT->getNamedType();
6775     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6776 
6777     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6778     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6779     NewTL.setQualifierLoc(QualifierLoc);
6780   } else {
6781     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6782     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6783     NewTL.setQualifierLoc(QualifierLoc);
6784     NewTL.setNameLoc(TL.getNameLoc());
6785   }
6786   return Result;
6787 }
6788 
6789 template<typename Derived>
6790 QualType TreeTransform<Derived>::
6791           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6792                                  DependentTemplateSpecializationTypeLoc TL) {
6793   NestedNameSpecifierLoc QualifierLoc;
6794   if (TL.getQualifierLoc()) {
6795     QualifierLoc
6796       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6797     if (!QualifierLoc)
6798       return QualType();
6799   }
6800 
6801   return getDerived()
6802            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6803 }
6804 
6805 template<typename Derived>
6806 QualType TreeTransform<Derived>::
6807 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6808                                    DependentTemplateSpecializationTypeLoc TL,
6809                                        NestedNameSpecifierLoc QualifierLoc) {
6810   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6811 
6812   TemplateArgumentListInfo NewTemplateArgs;
6813   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6814   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6815 
6816   typedef TemplateArgumentLocContainerIterator<
6817   DependentTemplateSpecializationTypeLoc> ArgIterator;
6818   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6819                                               ArgIterator(TL, TL.getNumArgs()),
6820                                               NewTemplateArgs))
6821     return QualType();
6822 
6823   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6824       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6825       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6826       /*AllowInjectedClassName*/ false);
6827   if (Result.isNull())
6828     return QualType();
6829 
6830   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6831     QualType NamedT = ElabT->getNamedType();
6832 
6833     // Copy information relevant to the template specialization.
6834     TemplateSpecializationTypeLoc NamedTL
6835       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6836     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6837     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6838     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6839     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6840     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6841       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6842 
6843     // Copy information relevant to the elaborated type.
6844     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6845     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6846     NewTL.setQualifierLoc(QualifierLoc);
6847   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6848     DependentTemplateSpecializationTypeLoc SpecTL
6849       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6850     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6851     SpecTL.setQualifierLoc(QualifierLoc);
6852     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6853     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6854     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6855     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6856     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6857       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6858   } else {
6859     TemplateSpecializationTypeLoc SpecTL
6860       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6861     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6862     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6863     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6864     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6865     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6866       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6867   }
6868   return Result;
6869 }
6870 
6871 template<typename Derived>
6872 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6873                                                       PackExpansionTypeLoc TL) {
6874   QualType Pattern
6875     = getDerived().TransformType(TLB, TL.getPatternLoc());
6876   if (Pattern.isNull())
6877     return QualType();
6878 
6879   QualType Result = TL.getType();
6880   if (getDerived().AlwaysRebuild() ||
6881       Pattern != TL.getPatternLoc().getType()) {
6882     Result = getDerived().RebuildPackExpansionType(Pattern,
6883                                            TL.getPatternLoc().getSourceRange(),
6884                                                    TL.getEllipsisLoc(),
6885                                            TL.getTypePtr()->getNumExpansions());
6886     if (Result.isNull())
6887       return QualType();
6888   }
6889 
6890   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6891   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6892   return Result;
6893 }
6894 
6895 template<typename Derived>
6896 QualType
6897 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6898                                                    ObjCInterfaceTypeLoc TL) {
6899   // ObjCInterfaceType is never dependent.
6900   TLB.pushFullCopy(TL);
6901   return TL.getType();
6902 }
6903 
6904 template<typename Derived>
6905 QualType
6906 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6907                                                    ObjCTypeParamTypeLoc TL) {
6908   const ObjCTypeParamType *T = TL.getTypePtr();
6909   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6910       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6911   if (!OTP)
6912     return QualType();
6913 
6914   QualType Result = TL.getType();
6915   if (getDerived().AlwaysRebuild() ||
6916       OTP != T->getDecl()) {
6917     Result = getDerived().RebuildObjCTypeParamType(OTP,
6918                  TL.getProtocolLAngleLoc(),
6919                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6920                                     TL.getNumProtocols()),
6921                  TL.getProtocolLocs(),
6922                  TL.getProtocolRAngleLoc());
6923     if (Result.isNull())
6924       return QualType();
6925   }
6926 
6927   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6928   if (TL.getNumProtocols()) {
6929     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6930     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6931       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6932     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6933   }
6934   return Result;
6935 }
6936 
6937 template<typename Derived>
6938 QualType
6939 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6940                                                 ObjCObjectTypeLoc TL) {
6941   // Transform base type.
6942   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6943   if (BaseType.isNull())
6944     return QualType();
6945 
6946   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6947 
6948   // Transform type arguments.
6949   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6950   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6951     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6952     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6953     QualType TypeArg = TypeArgInfo->getType();
6954     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6955       AnyChanged = true;
6956 
6957       // We have a pack expansion. Instantiate it.
6958       const auto *PackExpansion = PackExpansionLoc.getType()
6959                                     ->castAs<PackExpansionType>();
6960       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6961       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6962                                               Unexpanded);
6963       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6964 
6965       // Determine whether the set of unexpanded parameter packs can
6966       // and should be expanded.
6967       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6968       bool Expand = false;
6969       bool RetainExpansion = false;
6970       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6971       if (getDerived().TryExpandParameterPacks(
6972             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6973             Unexpanded, Expand, RetainExpansion, NumExpansions))
6974         return QualType();
6975 
6976       if (!Expand) {
6977         // We can't expand this pack expansion into separate arguments yet;
6978         // just substitute into the pattern and create a new pack expansion
6979         // type.
6980         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6981 
6982         TypeLocBuilder TypeArgBuilder;
6983         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6984         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6985                                                              PatternLoc);
6986         if (NewPatternType.isNull())
6987           return QualType();
6988 
6989         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6990                                       NewPatternType, NumExpansions);
6991         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6992         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6993         NewTypeArgInfos.push_back(
6994           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6995         continue;
6996       }
6997 
6998       // Substitute into the pack expansion pattern for each slice of the
6999       // pack.
7000       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
7001         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
7002 
7003         TypeLocBuilder TypeArgBuilder;
7004         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
7005 
7006         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
7007                                                          PatternLoc);
7008         if (NewTypeArg.isNull())
7009           return QualType();
7010 
7011         NewTypeArgInfos.push_back(
7012           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7013       }
7014 
7015       continue;
7016     }
7017 
7018     TypeLocBuilder TypeArgBuilder;
7019     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7020     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7021     if (NewTypeArg.isNull())
7022       return QualType();
7023 
7024     // If nothing changed, just keep the old TypeSourceInfo.
7025     if (NewTypeArg == TypeArg) {
7026       NewTypeArgInfos.push_back(TypeArgInfo);
7027       continue;
7028     }
7029 
7030     NewTypeArgInfos.push_back(
7031       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7032     AnyChanged = true;
7033   }
7034 
7035   QualType Result = TL.getType();
7036   if (getDerived().AlwaysRebuild() || AnyChanged) {
7037     // Rebuild the type.
7038     Result = getDerived().RebuildObjCObjectType(
7039         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7040         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7041         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7042         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7043 
7044     if (Result.isNull())
7045       return QualType();
7046   }
7047 
7048   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7049   NewT.setHasBaseTypeAsWritten(true);
7050   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7051   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7052     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7053   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7054   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7055   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7056     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7057   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7058   return Result;
7059 }
7060 
7061 template<typename Derived>
7062 QualType
7063 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7064                                                ObjCObjectPointerTypeLoc TL) {
7065   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7066   if (PointeeType.isNull())
7067     return QualType();
7068 
7069   QualType Result = TL.getType();
7070   if (getDerived().AlwaysRebuild() ||
7071       PointeeType != TL.getPointeeLoc().getType()) {
7072     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7073                                                        TL.getStarLoc());
7074     if (Result.isNull())
7075       return QualType();
7076   }
7077 
7078   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7079   NewT.setStarLoc(TL.getStarLoc());
7080   return Result;
7081 }
7082 
7083 //===----------------------------------------------------------------------===//
7084 // Statement transformation
7085 //===----------------------------------------------------------------------===//
7086 template<typename Derived>
7087 StmtResult
7088 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7089   return S;
7090 }
7091 
7092 template<typename Derived>
7093 StmtResult
7094 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7095   return getDerived().TransformCompoundStmt(S, false);
7096 }
7097 
7098 template<typename Derived>
7099 StmtResult
7100 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7101                                               bool IsStmtExpr) {
7102   Sema::CompoundScopeRAII CompoundScope(getSema());
7103 
7104   const Stmt *ExprResult = S->getStmtExprResult();
7105   bool SubStmtInvalid = false;
7106   bool SubStmtChanged = false;
7107   SmallVector<Stmt*, 8> Statements;
7108   for (auto *B : S->body()) {
7109     StmtResult Result = getDerived().TransformStmt(
7110         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7111 
7112     if (Result.isInvalid()) {
7113       // Immediately fail if this was a DeclStmt, since it's very
7114       // likely that this will cause problems for future statements.
7115       if (isa<DeclStmt>(B))
7116         return StmtError();
7117 
7118       // Otherwise, just keep processing substatements and fail later.
7119       SubStmtInvalid = true;
7120       continue;
7121     }
7122 
7123     SubStmtChanged = SubStmtChanged || Result.get() != B;
7124     Statements.push_back(Result.getAs<Stmt>());
7125   }
7126 
7127   if (SubStmtInvalid)
7128     return StmtError();
7129 
7130   if (!getDerived().AlwaysRebuild() &&
7131       !SubStmtChanged)
7132     return S;
7133 
7134   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7135                                           Statements,
7136                                           S->getRBracLoc(),
7137                                           IsStmtExpr);
7138 }
7139 
7140 template<typename Derived>
7141 StmtResult
7142 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7143   ExprResult LHS, RHS;
7144   {
7145     EnterExpressionEvaluationContext Unevaluated(
7146         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7147 
7148     // Transform the left-hand case value.
7149     LHS = getDerived().TransformExpr(S->getLHS());
7150     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7151     if (LHS.isInvalid())
7152       return StmtError();
7153 
7154     // Transform the right-hand case value (for the GNU case-range extension).
7155     RHS = getDerived().TransformExpr(S->getRHS());
7156     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7157     if (RHS.isInvalid())
7158       return StmtError();
7159   }
7160 
7161   // Build the case statement.
7162   // Case statements are always rebuilt so that they will attached to their
7163   // transformed switch statement.
7164   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7165                                                        LHS.get(),
7166                                                        S->getEllipsisLoc(),
7167                                                        RHS.get(),
7168                                                        S->getColonLoc());
7169   if (Case.isInvalid())
7170     return StmtError();
7171 
7172   // Transform the statement following the case
7173   StmtResult SubStmt =
7174       getDerived().TransformStmt(S->getSubStmt());
7175   if (SubStmt.isInvalid())
7176     return StmtError();
7177 
7178   // Attach the body to the case statement
7179   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7180 }
7181 
7182 template <typename Derived>
7183 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7184   // Transform the statement following the default case
7185   StmtResult SubStmt =
7186       getDerived().TransformStmt(S->getSubStmt());
7187   if (SubStmt.isInvalid())
7188     return StmtError();
7189 
7190   // Default statements are always rebuilt
7191   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7192                                          SubStmt.get());
7193 }
7194 
7195 template<typename Derived>
7196 StmtResult
7197 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7198   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7199   if (SubStmt.isInvalid())
7200     return StmtError();
7201 
7202   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7203                                         S->getDecl());
7204   if (!LD)
7205     return StmtError();
7206 
7207   // If we're transforming "in-place" (we're not creating new local
7208   // declarations), assume we're replacing the old label statement
7209   // and clear out the reference to it.
7210   if (LD == S->getDecl())
7211     S->getDecl()->setStmt(nullptr);
7212 
7213   // FIXME: Pass the real colon location in.
7214   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7215                                        cast<LabelDecl>(LD), SourceLocation(),
7216                                        SubStmt.get());
7217 }
7218 
7219 template <typename Derived>
7220 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7221   if (!R)
7222     return R;
7223 
7224   switch (R->getKind()) {
7225 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7226 #define ATTR(X)
7227 #define PRAGMA_SPELLING_ATTR(X)                                                \
7228   case attr::X:                                                                \
7229     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7230 #include "clang/Basic/AttrList.inc"
7231   default:
7232     return R;
7233   }
7234 }
7235 
7236 template <typename Derived>
7237 StmtResult
7238 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7239                                                 StmtDiscardKind SDK) {
7240   bool AttrsChanged = false;
7241   SmallVector<const Attr *, 1> Attrs;
7242 
7243   // Visit attributes and keep track if any are transformed.
7244   for (const auto *I : S->getAttrs()) {
7245     const Attr *R = getDerived().TransformAttr(I);
7246     AttrsChanged |= (I != R);
7247     Attrs.push_back(R);
7248   }
7249 
7250   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7251   if (SubStmt.isInvalid())
7252     return StmtError();
7253 
7254   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7255     return S;
7256 
7257   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7258                                             SubStmt.get());
7259 }
7260 
7261 template<typename Derived>
7262 StmtResult
7263 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7264   // Transform the initialization statement
7265   StmtResult Init = getDerived().TransformStmt(S->getInit());
7266   if (Init.isInvalid())
7267     return StmtError();
7268 
7269   // Transform the condition
7270   Sema::ConditionResult Cond = getDerived().TransformCondition(
7271       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7272       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7273                        : Sema::ConditionKind::Boolean);
7274   if (Cond.isInvalid())
7275     return StmtError();
7276 
7277   // If this is a constexpr if, determine which arm we should instantiate.
7278   llvm::Optional<bool> ConstexprConditionValue;
7279   if (S->isConstexpr())
7280     ConstexprConditionValue = Cond.getKnownValue();
7281 
7282   // Transform the "then" branch.
7283   StmtResult Then;
7284   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7285     Then = getDerived().TransformStmt(S->getThen());
7286     if (Then.isInvalid())
7287       return StmtError();
7288   } else {
7289     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7290   }
7291 
7292   // Transform the "else" branch.
7293   StmtResult Else;
7294   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7295     Else = getDerived().TransformStmt(S->getElse());
7296     if (Else.isInvalid())
7297       return StmtError();
7298   }
7299 
7300   if (!getDerived().AlwaysRebuild() &&
7301       Init.get() == S->getInit() &&
7302       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7303       Then.get() == S->getThen() &&
7304       Else.get() == S->getElse())
7305     return S;
7306 
7307   return getDerived().RebuildIfStmt(
7308       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7309       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7310 }
7311 
7312 template<typename Derived>
7313 StmtResult
7314 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7315   // Transform the initialization statement
7316   StmtResult Init = getDerived().TransformStmt(S->getInit());
7317   if (Init.isInvalid())
7318     return StmtError();
7319 
7320   // Transform the condition.
7321   Sema::ConditionResult Cond = getDerived().TransformCondition(
7322       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7323       Sema::ConditionKind::Switch);
7324   if (Cond.isInvalid())
7325     return StmtError();
7326 
7327   // Rebuild the switch statement.
7328   StmtResult Switch =
7329       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7330                                           Init.get(), Cond, S->getRParenLoc());
7331   if (Switch.isInvalid())
7332     return StmtError();
7333 
7334   // Transform the body of the switch statement.
7335   StmtResult Body = getDerived().TransformStmt(S->getBody());
7336   if (Body.isInvalid())
7337     return StmtError();
7338 
7339   // Complete the switch statement.
7340   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7341                                             Body.get());
7342 }
7343 
7344 template<typename Derived>
7345 StmtResult
7346 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7347   // Transform the condition
7348   Sema::ConditionResult Cond = getDerived().TransformCondition(
7349       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7350       Sema::ConditionKind::Boolean);
7351   if (Cond.isInvalid())
7352     return StmtError();
7353 
7354   // Transform the body
7355   StmtResult Body = getDerived().TransformStmt(S->getBody());
7356   if (Body.isInvalid())
7357     return StmtError();
7358 
7359   if (!getDerived().AlwaysRebuild() &&
7360       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7361       Body.get() == S->getBody())
7362     return Owned(S);
7363 
7364   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7365                                        Cond, S->getRParenLoc(), Body.get());
7366 }
7367 
7368 template<typename Derived>
7369 StmtResult
7370 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7371   // Transform the body
7372   StmtResult Body = getDerived().TransformStmt(S->getBody());
7373   if (Body.isInvalid())
7374     return StmtError();
7375 
7376   // Transform the condition
7377   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7378   if (Cond.isInvalid())
7379     return StmtError();
7380 
7381   if (!getDerived().AlwaysRebuild() &&
7382       Cond.get() == S->getCond() &&
7383       Body.get() == S->getBody())
7384     return S;
7385 
7386   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7387                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7388                                     S->getRParenLoc());
7389 }
7390 
7391 template<typename Derived>
7392 StmtResult
7393 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7394   if (getSema().getLangOpts().OpenMP)
7395     getSema().startOpenMPLoop();
7396 
7397   // Transform the initialization statement
7398   StmtResult Init = getDerived().TransformStmt(S->getInit());
7399   if (Init.isInvalid())
7400     return StmtError();
7401 
7402   // In OpenMP loop region loop control variable must be captured and be
7403   // private. Perform analysis of first part (if any).
7404   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7405     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7406 
7407   // Transform the condition
7408   Sema::ConditionResult Cond = getDerived().TransformCondition(
7409       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7410       Sema::ConditionKind::Boolean);
7411   if (Cond.isInvalid())
7412     return StmtError();
7413 
7414   // Transform the increment
7415   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7416   if (Inc.isInvalid())
7417     return StmtError();
7418 
7419   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7420   if (S->getInc() && !FullInc.get())
7421     return StmtError();
7422 
7423   // Transform the body
7424   StmtResult Body = getDerived().TransformStmt(S->getBody());
7425   if (Body.isInvalid())
7426     return StmtError();
7427 
7428   if (!getDerived().AlwaysRebuild() &&
7429       Init.get() == S->getInit() &&
7430       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7431       Inc.get() == S->getInc() &&
7432       Body.get() == S->getBody())
7433     return S;
7434 
7435   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7436                                      Init.get(), Cond, FullInc,
7437                                      S->getRParenLoc(), Body.get());
7438 }
7439 
7440 template<typename Derived>
7441 StmtResult
7442 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7443   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7444                                         S->getLabel());
7445   if (!LD)
7446     return StmtError();
7447 
7448   // Goto statements must always be rebuilt, to resolve the label.
7449   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7450                                       cast<LabelDecl>(LD));
7451 }
7452 
7453 template<typename Derived>
7454 StmtResult
7455 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7456   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7457   if (Target.isInvalid())
7458     return StmtError();
7459   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7460 
7461   if (!getDerived().AlwaysRebuild() &&
7462       Target.get() == S->getTarget())
7463     return S;
7464 
7465   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7466                                               Target.get());
7467 }
7468 
7469 template<typename Derived>
7470 StmtResult
7471 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7472   return S;
7473 }
7474 
7475 template<typename Derived>
7476 StmtResult
7477 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7478   return S;
7479 }
7480 
7481 template<typename Derived>
7482 StmtResult
7483 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7484   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7485                                                         /*NotCopyInit*/false);
7486   if (Result.isInvalid())
7487     return StmtError();
7488 
7489   // FIXME: We always rebuild the return statement because there is no way
7490   // to tell whether the return type of the function has changed.
7491   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7492 }
7493 
7494 template<typename Derived>
7495 StmtResult
7496 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7497   bool DeclChanged = false;
7498   SmallVector<Decl *, 4> Decls;
7499   for (auto *D : S->decls()) {
7500     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7501     if (!Transformed)
7502       return StmtError();
7503 
7504     if (Transformed != D)
7505       DeclChanged = true;
7506 
7507     Decls.push_back(Transformed);
7508   }
7509 
7510   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7511     return S;
7512 
7513   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7514 }
7515 
7516 template<typename Derived>
7517 StmtResult
7518 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7519 
7520   SmallVector<Expr*, 8> Constraints;
7521   SmallVector<Expr*, 8> Exprs;
7522   SmallVector<IdentifierInfo *, 4> Names;
7523 
7524   ExprResult AsmString;
7525   SmallVector<Expr*, 8> Clobbers;
7526 
7527   bool ExprsChanged = false;
7528 
7529   // Go through the outputs.
7530   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7531     Names.push_back(S->getOutputIdentifier(I));
7532 
7533     // No need to transform the constraint literal.
7534     Constraints.push_back(S->getOutputConstraintLiteral(I));
7535 
7536     // Transform the output expr.
7537     Expr *OutputExpr = S->getOutputExpr(I);
7538     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7539     if (Result.isInvalid())
7540       return StmtError();
7541 
7542     ExprsChanged |= Result.get() != OutputExpr;
7543 
7544     Exprs.push_back(Result.get());
7545   }
7546 
7547   // Go through the inputs.
7548   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7549     Names.push_back(S->getInputIdentifier(I));
7550 
7551     // No need to transform the constraint literal.
7552     Constraints.push_back(S->getInputConstraintLiteral(I));
7553 
7554     // Transform the input expr.
7555     Expr *InputExpr = S->getInputExpr(I);
7556     ExprResult Result = getDerived().TransformExpr(InputExpr);
7557     if (Result.isInvalid())
7558       return StmtError();
7559 
7560     ExprsChanged |= Result.get() != InputExpr;
7561 
7562     Exprs.push_back(Result.get());
7563   }
7564 
7565   // Go through the Labels.
7566   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7567     Names.push_back(S->getLabelIdentifier(I));
7568 
7569     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7570     if (Result.isInvalid())
7571       return StmtError();
7572     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7573     Exprs.push_back(Result.get());
7574   }
7575   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7576     return S;
7577 
7578   // Go through the clobbers.
7579   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7580     Clobbers.push_back(S->getClobberStringLiteral(I));
7581 
7582   // No need to transform the asm string literal.
7583   AsmString = S->getAsmString();
7584   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7585                                         S->isVolatile(), S->getNumOutputs(),
7586                                         S->getNumInputs(), Names.data(),
7587                                         Constraints, Exprs, AsmString.get(),
7588                                         Clobbers, S->getNumLabels(),
7589                                         S->getRParenLoc());
7590 }
7591 
7592 template<typename Derived>
7593 StmtResult
7594 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7595   ArrayRef<Token> AsmToks =
7596     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7597 
7598   bool HadError = false, HadChange = false;
7599 
7600   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7601   SmallVector<Expr*, 8> TransformedExprs;
7602   TransformedExprs.reserve(SrcExprs.size());
7603   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7604     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7605     if (!Result.isUsable()) {
7606       HadError = true;
7607     } else {
7608       HadChange |= (Result.get() != SrcExprs[i]);
7609       TransformedExprs.push_back(Result.get());
7610     }
7611   }
7612 
7613   if (HadError) return StmtError();
7614   if (!HadChange && !getDerived().AlwaysRebuild())
7615     return Owned(S);
7616 
7617   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7618                                        AsmToks, S->getAsmString(),
7619                                        S->getNumOutputs(), S->getNumInputs(),
7620                                        S->getAllConstraints(), S->getClobbers(),
7621                                        TransformedExprs, S->getEndLoc());
7622 }
7623 
7624 // C++ Coroutines TS
7625 
7626 template<typename Derived>
7627 StmtResult
7628 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7629   auto *ScopeInfo = SemaRef.getCurFunction();
7630   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7631   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7632          ScopeInfo->NeedsCoroutineSuspends &&
7633          ScopeInfo->CoroutineSuspends.first == nullptr &&
7634          ScopeInfo->CoroutineSuspends.second == nullptr &&
7635          "expected clean scope info");
7636 
7637   // Set that we have (possibly-invalid) suspend points before we do anything
7638   // that may fail.
7639   ScopeInfo->setNeedsCoroutineSuspends(false);
7640 
7641   // We re-build the coroutine promise object (and the coroutine parameters its
7642   // type and constructor depend on) based on the types used in our current
7643   // function. We must do so, and set it on the current FunctionScopeInfo,
7644   // before attempting to transform the other parts of the coroutine body
7645   // statement, such as the implicit suspend statements (because those
7646   // statements reference the FunctionScopeInfo::CoroutinePromise).
7647   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7648     return StmtError();
7649   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7650   if (!Promise)
7651     return StmtError();
7652   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7653   ScopeInfo->CoroutinePromise = Promise;
7654 
7655   // Transform the implicit coroutine statements constructed using dependent
7656   // types during the previous parse: initial and final suspensions, the return
7657   // object, and others. We also transform the coroutine function's body.
7658   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7659   if (InitSuspend.isInvalid())
7660     return StmtError();
7661   StmtResult FinalSuspend =
7662       getDerived().TransformStmt(S->getFinalSuspendStmt());
7663   if (FinalSuspend.isInvalid() ||
7664       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7665     return StmtError();
7666   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7667   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7668 
7669   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7670   if (BodyRes.isInvalid())
7671     return StmtError();
7672 
7673   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7674   if (Builder.isInvalid())
7675     return StmtError();
7676 
7677   Expr *ReturnObject = S->getReturnValueInit();
7678   assert(ReturnObject && "the return object is expected to be valid");
7679   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7680                                                      /*NoCopyInit*/ false);
7681   if (Res.isInvalid())
7682     return StmtError();
7683   Builder.ReturnValue = Res.get();
7684 
7685   // If during the previous parse the coroutine still had a dependent promise
7686   // statement, we may need to build some implicit coroutine statements
7687   // (such as exception and fallthrough handlers) for the first time.
7688   if (S->hasDependentPromiseType()) {
7689     // We can only build these statements, however, if the current promise type
7690     // is not dependent.
7691     if (!Promise->getType()->isDependentType()) {
7692       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7693              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7694              "these nodes should not have been built yet");
7695       if (!Builder.buildDependentStatements())
7696         return StmtError();
7697     }
7698   } else {
7699     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7700       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7701       if (Res.isInvalid())
7702         return StmtError();
7703       Builder.OnFallthrough = Res.get();
7704     }
7705 
7706     if (auto *OnException = S->getExceptionHandler()) {
7707       StmtResult Res = getDerived().TransformStmt(OnException);
7708       if (Res.isInvalid())
7709         return StmtError();
7710       Builder.OnException = Res.get();
7711     }
7712 
7713     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7714       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7715       if (Res.isInvalid())
7716         return StmtError();
7717       Builder.ReturnStmtOnAllocFailure = Res.get();
7718     }
7719 
7720     // Transform any additional statements we may have already built
7721     assert(S->getAllocate() && S->getDeallocate() &&
7722            "allocation and deallocation calls must already be built");
7723     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7724     if (AllocRes.isInvalid())
7725       return StmtError();
7726     Builder.Allocate = AllocRes.get();
7727 
7728     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7729     if (DeallocRes.isInvalid())
7730       return StmtError();
7731     Builder.Deallocate = DeallocRes.get();
7732 
7733     assert(S->getResultDecl() && "ResultDecl must already be built");
7734     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7735     if (ResultDecl.isInvalid())
7736       return StmtError();
7737     Builder.ResultDecl = ResultDecl.get();
7738 
7739     if (auto *ReturnStmt = S->getReturnStmt()) {
7740       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7741       if (Res.isInvalid())
7742         return StmtError();
7743       Builder.ReturnStmt = Res.get();
7744     }
7745   }
7746 
7747   return getDerived().RebuildCoroutineBodyStmt(Builder);
7748 }
7749 
7750 template<typename Derived>
7751 StmtResult
7752 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7753   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7754                                                         /*NotCopyInit*/false);
7755   if (Result.isInvalid())
7756     return StmtError();
7757 
7758   // Always rebuild; we don't know if this needs to be injected into a new
7759   // context or if the promise type has changed.
7760   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7761                                           S->isImplicit());
7762 }
7763 
7764 template<typename Derived>
7765 ExprResult
7766 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7767   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7768                                                         /*NotCopyInit*/false);
7769   if (Result.isInvalid())
7770     return ExprError();
7771 
7772   // Always rebuild; we don't know if this needs to be injected into a new
7773   // context or if the promise type has changed.
7774   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7775                                          E->isImplicit());
7776 }
7777 
7778 template <typename Derived>
7779 ExprResult
7780 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7781   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7782                                                         /*NotCopyInit*/ false);
7783   if (OperandResult.isInvalid())
7784     return ExprError();
7785 
7786   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7787           E->getOperatorCoawaitLookup());
7788 
7789   if (LookupResult.isInvalid())
7790     return ExprError();
7791 
7792   // Always rebuild; we don't know if this needs to be injected into a new
7793   // context or if the promise type has changed.
7794   return getDerived().RebuildDependentCoawaitExpr(
7795       E->getKeywordLoc(), OperandResult.get(),
7796       cast<UnresolvedLookupExpr>(LookupResult.get()));
7797 }
7798 
7799 template<typename Derived>
7800 ExprResult
7801 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7802   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7803                                                         /*NotCopyInit*/false);
7804   if (Result.isInvalid())
7805     return ExprError();
7806 
7807   // Always rebuild; we don't know if this needs to be injected into a new
7808   // context or if the promise type has changed.
7809   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7810 }
7811 
7812 // Objective-C Statements.
7813 
7814 template<typename Derived>
7815 StmtResult
7816 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7817   // Transform the body of the @try.
7818   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7819   if (TryBody.isInvalid())
7820     return StmtError();
7821 
7822   // Transform the @catch statements (if present).
7823   bool AnyCatchChanged = false;
7824   SmallVector<Stmt*, 8> CatchStmts;
7825   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7826     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7827     if (Catch.isInvalid())
7828       return StmtError();
7829     if (Catch.get() != S->getCatchStmt(I))
7830       AnyCatchChanged = true;
7831     CatchStmts.push_back(Catch.get());
7832   }
7833 
7834   // Transform the @finally statement (if present).
7835   StmtResult Finally;
7836   if (S->getFinallyStmt()) {
7837     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7838     if (Finally.isInvalid())
7839       return StmtError();
7840   }
7841 
7842   // If nothing changed, just retain this statement.
7843   if (!getDerived().AlwaysRebuild() &&
7844       TryBody.get() == S->getTryBody() &&
7845       !AnyCatchChanged &&
7846       Finally.get() == S->getFinallyStmt())
7847     return S;
7848 
7849   // Build a new statement.
7850   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7851                                            CatchStmts, Finally.get());
7852 }
7853 
7854 template<typename Derived>
7855 StmtResult
7856 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7857   // Transform the @catch parameter, if there is one.
7858   VarDecl *Var = nullptr;
7859   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7860     TypeSourceInfo *TSInfo = nullptr;
7861     if (FromVar->getTypeSourceInfo()) {
7862       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7863       if (!TSInfo)
7864         return StmtError();
7865     }
7866 
7867     QualType T;
7868     if (TSInfo)
7869       T = TSInfo->getType();
7870     else {
7871       T = getDerived().TransformType(FromVar->getType());
7872       if (T.isNull())
7873         return StmtError();
7874     }
7875 
7876     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7877     if (!Var)
7878       return StmtError();
7879   }
7880 
7881   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7882   if (Body.isInvalid())
7883     return StmtError();
7884 
7885   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7886                                              S->getRParenLoc(),
7887                                              Var, Body.get());
7888 }
7889 
7890 template<typename Derived>
7891 StmtResult
7892 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7893   // Transform the body.
7894   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7895   if (Body.isInvalid())
7896     return StmtError();
7897 
7898   // If nothing changed, just retain this statement.
7899   if (!getDerived().AlwaysRebuild() &&
7900       Body.get() == S->getFinallyBody())
7901     return S;
7902 
7903   // Build a new statement.
7904   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7905                                                Body.get());
7906 }
7907 
7908 template<typename Derived>
7909 StmtResult
7910 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7911   ExprResult Operand;
7912   if (S->getThrowExpr()) {
7913     Operand = getDerived().TransformExpr(S->getThrowExpr());
7914     if (Operand.isInvalid())
7915       return StmtError();
7916   }
7917 
7918   if (!getDerived().AlwaysRebuild() &&
7919       Operand.get() == S->getThrowExpr())
7920     return S;
7921 
7922   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7923 }
7924 
7925 template<typename Derived>
7926 StmtResult
7927 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7928                                                   ObjCAtSynchronizedStmt *S) {
7929   // Transform the object we are locking.
7930   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7931   if (Object.isInvalid())
7932     return StmtError();
7933   Object =
7934     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7935                                                   Object.get());
7936   if (Object.isInvalid())
7937     return StmtError();
7938 
7939   // Transform the body.
7940   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7941   if (Body.isInvalid())
7942     return StmtError();
7943 
7944   // If nothing change, just retain the current statement.
7945   if (!getDerived().AlwaysRebuild() &&
7946       Object.get() == S->getSynchExpr() &&
7947       Body.get() == S->getSynchBody())
7948     return S;
7949 
7950   // Build a new statement.
7951   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7952                                                     Object.get(), Body.get());
7953 }
7954 
7955 template<typename Derived>
7956 StmtResult
7957 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7958                                               ObjCAutoreleasePoolStmt *S) {
7959   // Transform the body.
7960   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7961   if (Body.isInvalid())
7962     return StmtError();
7963 
7964   // If nothing changed, just retain this statement.
7965   if (!getDerived().AlwaysRebuild() &&
7966       Body.get() == S->getSubStmt())
7967     return S;
7968 
7969   // Build a new statement.
7970   return getDerived().RebuildObjCAutoreleasePoolStmt(
7971                         S->getAtLoc(), Body.get());
7972 }
7973 
7974 template<typename Derived>
7975 StmtResult
7976 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7977                                                   ObjCForCollectionStmt *S) {
7978   // Transform the element statement.
7979   StmtResult Element =
7980       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7981   if (Element.isInvalid())
7982     return StmtError();
7983 
7984   // Transform the collection expression.
7985   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7986   if (Collection.isInvalid())
7987     return StmtError();
7988 
7989   // Transform the body.
7990   StmtResult Body = getDerived().TransformStmt(S->getBody());
7991   if (Body.isInvalid())
7992     return StmtError();
7993 
7994   // If nothing changed, just retain this statement.
7995   if (!getDerived().AlwaysRebuild() &&
7996       Element.get() == S->getElement() &&
7997       Collection.get() == S->getCollection() &&
7998       Body.get() == S->getBody())
7999     return S;
8000 
8001   // Build a new statement.
8002   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
8003                                                    Element.get(),
8004                                                    Collection.get(),
8005                                                    S->getRParenLoc(),
8006                                                    Body.get());
8007 }
8008 
8009 template <typename Derived>
8010 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8011   // Transform the exception declaration, if any.
8012   VarDecl *Var = nullptr;
8013   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8014     TypeSourceInfo *T =
8015         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8016     if (!T)
8017       return StmtError();
8018 
8019     Var = getDerived().RebuildExceptionDecl(
8020         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8021         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8022     if (!Var || Var->isInvalidDecl())
8023       return StmtError();
8024   }
8025 
8026   // Transform the actual exception handler.
8027   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8028   if (Handler.isInvalid())
8029     return StmtError();
8030 
8031   if (!getDerived().AlwaysRebuild() && !Var &&
8032       Handler.get() == S->getHandlerBlock())
8033     return S;
8034 
8035   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8036 }
8037 
8038 template <typename Derived>
8039 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8040   // Transform the try block itself.
8041   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8042   if (TryBlock.isInvalid())
8043     return StmtError();
8044 
8045   // Transform the handlers.
8046   bool HandlerChanged = false;
8047   SmallVector<Stmt *, 8> Handlers;
8048   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8049     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8050     if (Handler.isInvalid())
8051       return StmtError();
8052 
8053     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8054     Handlers.push_back(Handler.getAs<Stmt>());
8055   }
8056 
8057   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8058       !HandlerChanged)
8059     return S;
8060 
8061   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8062                                         Handlers);
8063 }
8064 
8065 template<typename Derived>
8066 StmtResult
8067 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8068   StmtResult Init =
8069       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8070   if (Init.isInvalid())
8071     return StmtError();
8072 
8073   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8074   if (Range.isInvalid())
8075     return StmtError();
8076 
8077   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8078   if (Begin.isInvalid())
8079     return StmtError();
8080   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8081   if (End.isInvalid())
8082     return StmtError();
8083 
8084   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8085   if (Cond.isInvalid())
8086     return StmtError();
8087   if (Cond.get())
8088     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8089   if (Cond.isInvalid())
8090     return StmtError();
8091   if (Cond.get())
8092     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8093 
8094   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8095   if (Inc.isInvalid())
8096     return StmtError();
8097   if (Inc.get())
8098     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8099 
8100   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8101   if (LoopVar.isInvalid())
8102     return StmtError();
8103 
8104   StmtResult NewStmt = S;
8105   if (getDerived().AlwaysRebuild() ||
8106       Init.get() != S->getInit() ||
8107       Range.get() != S->getRangeStmt() ||
8108       Begin.get() != S->getBeginStmt() ||
8109       End.get() != S->getEndStmt() ||
8110       Cond.get() != S->getCond() ||
8111       Inc.get() != S->getInc() ||
8112       LoopVar.get() != S->getLoopVarStmt()) {
8113     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8114                                                   S->getCoawaitLoc(), Init.get(),
8115                                                   S->getColonLoc(), Range.get(),
8116                                                   Begin.get(), End.get(),
8117                                                   Cond.get(),
8118                                                   Inc.get(), LoopVar.get(),
8119                                                   S->getRParenLoc());
8120     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8121       // Might not have attached any initializer to the loop variable.
8122       getSema().ActOnInitializerError(
8123           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8124       return StmtError();
8125     }
8126   }
8127 
8128   StmtResult Body = getDerived().TransformStmt(S->getBody());
8129   if (Body.isInvalid())
8130     return StmtError();
8131 
8132   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8133   // it now so we have a new statement to attach the body to.
8134   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8135     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8136                                                   S->getCoawaitLoc(), Init.get(),
8137                                                   S->getColonLoc(), Range.get(),
8138                                                   Begin.get(), End.get(),
8139                                                   Cond.get(),
8140                                                   Inc.get(), LoopVar.get(),
8141                                                   S->getRParenLoc());
8142     if (NewStmt.isInvalid())
8143       return StmtError();
8144   }
8145 
8146   if (NewStmt.get() == S)
8147     return S;
8148 
8149   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8150 }
8151 
8152 template<typename Derived>
8153 StmtResult
8154 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8155                                                     MSDependentExistsStmt *S) {
8156   // Transform the nested-name-specifier, if any.
8157   NestedNameSpecifierLoc QualifierLoc;
8158   if (S->getQualifierLoc()) {
8159     QualifierLoc
8160       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8161     if (!QualifierLoc)
8162       return StmtError();
8163   }
8164 
8165   // Transform the declaration name.
8166   DeclarationNameInfo NameInfo = S->getNameInfo();
8167   if (NameInfo.getName()) {
8168     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8169     if (!NameInfo.getName())
8170       return StmtError();
8171   }
8172 
8173   // Check whether anything changed.
8174   if (!getDerived().AlwaysRebuild() &&
8175       QualifierLoc == S->getQualifierLoc() &&
8176       NameInfo.getName() == S->getNameInfo().getName())
8177     return S;
8178 
8179   // Determine whether this name exists, if we can.
8180   CXXScopeSpec SS;
8181   SS.Adopt(QualifierLoc);
8182   bool Dependent = false;
8183   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8184   case Sema::IER_Exists:
8185     if (S->isIfExists())
8186       break;
8187 
8188     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8189 
8190   case Sema::IER_DoesNotExist:
8191     if (S->isIfNotExists())
8192       break;
8193 
8194     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8195 
8196   case Sema::IER_Dependent:
8197     Dependent = true;
8198     break;
8199 
8200   case Sema::IER_Error:
8201     return StmtError();
8202   }
8203 
8204   // We need to continue with the instantiation, so do so now.
8205   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8206   if (SubStmt.isInvalid())
8207     return StmtError();
8208 
8209   // If we have resolved the name, just transform to the substatement.
8210   if (!Dependent)
8211     return SubStmt;
8212 
8213   // The name is still dependent, so build a dependent expression again.
8214   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8215                                                    S->isIfExists(),
8216                                                    QualifierLoc,
8217                                                    NameInfo,
8218                                                    SubStmt.get());
8219 }
8220 
8221 template<typename Derived>
8222 ExprResult
8223 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8224   NestedNameSpecifierLoc QualifierLoc;
8225   if (E->getQualifierLoc()) {
8226     QualifierLoc
8227     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8228     if (!QualifierLoc)
8229       return ExprError();
8230   }
8231 
8232   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8233     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8234   if (!PD)
8235     return ExprError();
8236 
8237   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8238   if (Base.isInvalid())
8239     return ExprError();
8240 
8241   return new (SemaRef.getASTContext())
8242       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8243                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8244                         QualifierLoc, E->getMemberLoc());
8245 }
8246 
8247 template <typename Derived>
8248 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8249     MSPropertySubscriptExpr *E) {
8250   auto BaseRes = getDerived().TransformExpr(E->getBase());
8251   if (BaseRes.isInvalid())
8252     return ExprError();
8253   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8254   if (IdxRes.isInvalid())
8255     return ExprError();
8256 
8257   if (!getDerived().AlwaysRebuild() &&
8258       BaseRes.get() == E->getBase() &&
8259       IdxRes.get() == E->getIdx())
8260     return E;
8261 
8262   return getDerived().RebuildArraySubscriptExpr(
8263       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8264 }
8265 
8266 template <typename Derived>
8267 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8268   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8269   if (TryBlock.isInvalid())
8270     return StmtError();
8271 
8272   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8273   if (Handler.isInvalid())
8274     return StmtError();
8275 
8276   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8277       Handler.get() == S->getHandler())
8278     return S;
8279 
8280   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8281                                         TryBlock.get(), Handler.get());
8282 }
8283 
8284 template <typename Derived>
8285 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8286   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8287   if (Block.isInvalid())
8288     return StmtError();
8289 
8290   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8291 }
8292 
8293 template <typename Derived>
8294 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8295   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8296   if (FilterExpr.isInvalid())
8297     return StmtError();
8298 
8299   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8300   if (Block.isInvalid())
8301     return StmtError();
8302 
8303   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8304                                            Block.get());
8305 }
8306 
8307 template <typename Derived>
8308 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8309   if (isa<SEHFinallyStmt>(Handler))
8310     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8311   else
8312     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8313 }
8314 
8315 template<typename Derived>
8316 StmtResult
8317 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8318   return S;
8319 }
8320 
8321 //===----------------------------------------------------------------------===//
8322 // OpenMP directive transformation
8323 //===----------------------------------------------------------------------===//
8324 template <typename Derived>
8325 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8326     OMPExecutableDirective *D) {
8327 
8328   // Transform the clauses
8329   llvm::SmallVector<OMPClause *, 16> TClauses;
8330   ArrayRef<OMPClause *> Clauses = D->clauses();
8331   TClauses.reserve(Clauses.size());
8332   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8333        I != E; ++I) {
8334     if (*I) {
8335       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8336       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8337       getDerived().getSema().EndOpenMPClause();
8338       if (Clause)
8339         TClauses.push_back(Clause);
8340     } else {
8341       TClauses.push_back(nullptr);
8342     }
8343   }
8344   StmtResult AssociatedStmt;
8345   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8346     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8347                                                   /*CurScope=*/nullptr);
8348     StmtResult Body;
8349     {
8350       Sema::CompoundScopeRAII CompoundScope(getSema());
8351       Stmt *CS;
8352       if (D->getDirectiveKind() == OMPD_atomic ||
8353           D->getDirectiveKind() == OMPD_critical ||
8354           D->getDirectiveKind() == OMPD_section ||
8355           D->getDirectiveKind() == OMPD_master)
8356         CS = D->getAssociatedStmt();
8357       else
8358         CS = D->getRawStmt();
8359       Body = getDerived().TransformStmt(CS);
8360     }
8361     AssociatedStmt =
8362         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8363     if (AssociatedStmt.isInvalid()) {
8364       return StmtError();
8365     }
8366   }
8367   if (TClauses.size() != Clauses.size()) {
8368     return StmtError();
8369   }
8370 
8371   // Transform directive name for 'omp critical' directive.
8372   DeclarationNameInfo DirName;
8373   if (D->getDirectiveKind() == OMPD_critical) {
8374     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8375     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8376   }
8377   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8378   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8379     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8380   } else if (D->getDirectiveKind() == OMPD_cancel) {
8381     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8382   }
8383 
8384   return getDerived().RebuildOMPExecutableDirective(
8385       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8386       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8387 }
8388 
8389 template <typename Derived>
8390 StmtResult
8391 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8392   DeclarationNameInfo DirName;
8393   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8394                                              D->getBeginLoc());
8395   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8396   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8397   return Res;
8398 }
8399 
8400 template <typename Derived>
8401 StmtResult
8402 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8403   DeclarationNameInfo DirName;
8404   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8405                                              D->getBeginLoc());
8406   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8407   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8408   return Res;
8409 }
8410 
8411 template <typename Derived>
8412 StmtResult
8413 TreeTransform<Derived>::TransformOMPTileDirective(OMPTileDirective *D) {
8414   DeclarationNameInfo DirName;
8415   getDerived().getSema().StartOpenMPDSABlock(D->getDirectiveKind(), DirName,
8416                                              nullptr, D->getBeginLoc());
8417   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8418   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8419   return Res;
8420 }
8421 
8422 template <typename Derived>
8423 StmtResult
8424 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8425   DeclarationNameInfo DirName;
8426   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8427                                              D->getBeginLoc());
8428   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8429   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8430   return Res;
8431 }
8432 
8433 template <typename Derived>
8434 StmtResult
8435 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8436   DeclarationNameInfo DirName;
8437   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8438                                              D->getBeginLoc());
8439   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8440   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8441   return Res;
8442 }
8443 
8444 template <typename Derived>
8445 StmtResult
8446 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8447   DeclarationNameInfo DirName;
8448   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8449                                              D->getBeginLoc());
8450   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8451   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8452   return Res;
8453 }
8454 
8455 template <typename Derived>
8456 StmtResult
8457 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8458   DeclarationNameInfo DirName;
8459   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8460                                              D->getBeginLoc());
8461   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8462   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8463   return Res;
8464 }
8465 
8466 template <typename Derived>
8467 StmtResult
8468 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8469   DeclarationNameInfo DirName;
8470   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8471                                              D->getBeginLoc());
8472   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8473   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8474   return Res;
8475 }
8476 
8477 template <typename Derived>
8478 StmtResult
8479 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8480   DeclarationNameInfo DirName;
8481   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8482                                              D->getBeginLoc());
8483   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8484   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8485   return Res;
8486 }
8487 
8488 template <typename Derived>
8489 StmtResult
8490 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8491   getDerived().getSema().StartOpenMPDSABlock(
8492       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8493   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8494   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8495   return Res;
8496 }
8497 
8498 template <typename Derived>
8499 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8500     OMPParallelForDirective *D) {
8501   DeclarationNameInfo DirName;
8502   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8503                                              nullptr, D->getBeginLoc());
8504   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8505   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8506   return Res;
8507 }
8508 
8509 template <typename Derived>
8510 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8511     OMPParallelForSimdDirective *D) {
8512   DeclarationNameInfo DirName;
8513   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8514                                              nullptr, D->getBeginLoc());
8515   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8516   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8517   return Res;
8518 }
8519 
8520 template <typename Derived>
8521 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8522     OMPParallelMasterDirective *D) {
8523   DeclarationNameInfo DirName;
8524   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8525                                              nullptr, D->getBeginLoc());
8526   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8527   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8528   return Res;
8529 }
8530 
8531 template <typename Derived>
8532 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8533     OMPParallelSectionsDirective *D) {
8534   DeclarationNameInfo DirName;
8535   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8536                                              nullptr, D->getBeginLoc());
8537   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8538   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8539   return Res;
8540 }
8541 
8542 template <typename Derived>
8543 StmtResult
8544 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8545   DeclarationNameInfo DirName;
8546   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8547                                              D->getBeginLoc());
8548   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8549   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8550   return Res;
8551 }
8552 
8553 template <typename Derived>
8554 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8555     OMPTaskyieldDirective *D) {
8556   DeclarationNameInfo DirName;
8557   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8558                                              D->getBeginLoc());
8559   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8560   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8561   return Res;
8562 }
8563 
8564 template <typename Derived>
8565 StmtResult
8566 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8567   DeclarationNameInfo DirName;
8568   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8569                                              D->getBeginLoc());
8570   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8571   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8572   return Res;
8573 }
8574 
8575 template <typename Derived>
8576 StmtResult
8577 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8578   DeclarationNameInfo DirName;
8579   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8580                                              D->getBeginLoc());
8581   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8582   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8583   return Res;
8584 }
8585 
8586 template <typename Derived>
8587 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8588     OMPTaskgroupDirective *D) {
8589   DeclarationNameInfo DirName;
8590   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8591                                              D->getBeginLoc());
8592   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8593   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8594   return Res;
8595 }
8596 
8597 template <typename Derived>
8598 StmtResult
8599 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8600   DeclarationNameInfo DirName;
8601   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8602                                              D->getBeginLoc());
8603   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8604   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8605   return Res;
8606 }
8607 
8608 template <typename Derived>
8609 StmtResult
8610 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8611   DeclarationNameInfo DirName;
8612   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8613                                              D->getBeginLoc());
8614   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8615   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8616   return Res;
8617 }
8618 
8619 template <typename Derived>
8620 StmtResult
8621 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8622   DeclarationNameInfo DirName;
8623   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8624                                              D->getBeginLoc());
8625   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8626   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8627   return Res;
8628 }
8629 
8630 template <typename Derived>
8631 StmtResult
8632 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8633   DeclarationNameInfo DirName;
8634   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8635                                              D->getBeginLoc());
8636   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8637   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8638   return Res;
8639 }
8640 
8641 template <typename Derived>
8642 StmtResult
8643 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8644   DeclarationNameInfo DirName;
8645   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8646                                              D->getBeginLoc());
8647   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8648   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8649   return Res;
8650 }
8651 
8652 template <typename Derived>
8653 StmtResult
8654 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8655   DeclarationNameInfo DirName;
8656   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8657                                              D->getBeginLoc());
8658   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8659   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8660   return Res;
8661 }
8662 
8663 template <typename Derived>
8664 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8665     OMPTargetDataDirective *D) {
8666   DeclarationNameInfo DirName;
8667   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8668                                              D->getBeginLoc());
8669   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8670   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8671   return Res;
8672 }
8673 
8674 template <typename Derived>
8675 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8676     OMPTargetEnterDataDirective *D) {
8677   DeclarationNameInfo DirName;
8678   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8679                                              nullptr, D->getBeginLoc());
8680   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8681   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8682   return Res;
8683 }
8684 
8685 template <typename Derived>
8686 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8687     OMPTargetExitDataDirective *D) {
8688   DeclarationNameInfo DirName;
8689   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8690                                              nullptr, D->getBeginLoc());
8691   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8692   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8693   return Res;
8694 }
8695 
8696 template <typename Derived>
8697 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8698     OMPTargetParallelDirective *D) {
8699   DeclarationNameInfo DirName;
8700   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8701                                              nullptr, D->getBeginLoc());
8702   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8703   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8704   return Res;
8705 }
8706 
8707 template <typename Derived>
8708 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8709     OMPTargetParallelForDirective *D) {
8710   DeclarationNameInfo DirName;
8711   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8712                                              nullptr, D->getBeginLoc());
8713   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8714   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8715   return Res;
8716 }
8717 
8718 template <typename Derived>
8719 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8720     OMPTargetUpdateDirective *D) {
8721   DeclarationNameInfo DirName;
8722   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8723                                              nullptr, D->getBeginLoc());
8724   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8725   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8726   return Res;
8727 }
8728 
8729 template <typename Derived>
8730 StmtResult
8731 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8732   DeclarationNameInfo DirName;
8733   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8734                                              D->getBeginLoc());
8735   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8736   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8737   return Res;
8738 }
8739 
8740 template <typename Derived>
8741 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8742     OMPCancellationPointDirective *D) {
8743   DeclarationNameInfo DirName;
8744   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8745                                              nullptr, D->getBeginLoc());
8746   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8747   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8748   return Res;
8749 }
8750 
8751 template <typename Derived>
8752 StmtResult
8753 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8754   DeclarationNameInfo DirName;
8755   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8756                                              D->getBeginLoc());
8757   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8758   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8759   return Res;
8760 }
8761 
8762 template <typename Derived>
8763 StmtResult
8764 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8765   DeclarationNameInfo DirName;
8766   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8767                                              D->getBeginLoc());
8768   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8769   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8770   return Res;
8771 }
8772 
8773 template <typename Derived>
8774 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8775     OMPTaskLoopSimdDirective *D) {
8776   DeclarationNameInfo DirName;
8777   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8778                                              nullptr, D->getBeginLoc());
8779   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8780   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8781   return Res;
8782 }
8783 
8784 template <typename Derived>
8785 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8786     OMPMasterTaskLoopDirective *D) {
8787   DeclarationNameInfo DirName;
8788   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8789                                              nullptr, D->getBeginLoc());
8790   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8791   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8792   return Res;
8793 }
8794 
8795 template <typename Derived>
8796 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8797     OMPMasterTaskLoopSimdDirective *D) {
8798   DeclarationNameInfo DirName;
8799   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8800                                              nullptr, D->getBeginLoc());
8801   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8802   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8803   return Res;
8804 }
8805 
8806 template <typename Derived>
8807 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8808     OMPParallelMasterTaskLoopDirective *D) {
8809   DeclarationNameInfo DirName;
8810   getDerived().getSema().StartOpenMPDSABlock(
8811       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8812   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8813   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8814   return Res;
8815 }
8816 
8817 template <typename Derived>
8818 StmtResult
8819 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8820     OMPParallelMasterTaskLoopSimdDirective *D) {
8821   DeclarationNameInfo DirName;
8822   getDerived().getSema().StartOpenMPDSABlock(
8823       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8824   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8825   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8826   return Res;
8827 }
8828 
8829 template <typename Derived>
8830 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8831     OMPDistributeDirective *D) {
8832   DeclarationNameInfo DirName;
8833   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8834                                              D->getBeginLoc());
8835   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8836   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8837   return Res;
8838 }
8839 
8840 template <typename Derived>
8841 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8842     OMPDistributeParallelForDirective *D) {
8843   DeclarationNameInfo DirName;
8844   getDerived().getSema().StartOpenMPDSABlock(
8845       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8846   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8847   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8848   return Res;
8849 }
8850 
8851 template <typename Derived>
8852 StmtResult
8853 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8854     OMPDistributeParallelForSimdDirective *D) {
8855   DeclarationNameInfo DirName;
8856   getDerived().getSema().StartOpenMPDSABlock(
8857       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8858   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8859   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8860   return Res;
8861 }
8862 
8863 template <typename Derived>
8864 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8865     OMPDistributeSimdDirective *D) {
8866   DeclarationNameInfo DirName;
8867   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8868                                              nullptr, D->getBeginLoc());
8869   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8870   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8871   return Res;
8872 }
8873 
8874 template <typename Derived>
8875 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8876     OMPTargetParallelForSimdDirective *D) {
8877   DeclarationNameInfo DirName;
8878   getDerived().getSema().StartOpenMPDSABlock(
8879       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8880   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8881   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8882   return Res;
8883 }
8884 
8885 template <typename Derived>
8886 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8887     OMPTargetSimdDirective *D) {
8888   DeclarationNameInfo DirName;
8889   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8890                                              D->getBeginLoc());
8891   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8892   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8893   return Res;
8894 }
8895 
8896 template <typename Derived>
8897 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8898     OMPTeamsDistributeDirective *D) {
8899   DeclarationNameInfo DirName;
8900   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8901                                              nullptr, D->getBeginLoc());
8902   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8903   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8904   return Res;
8905 }
8906 
8907 template <typename Derived>
8908 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8909     OMPTeamsDistributeSimdDirective *D) {
8910   DeclarationNameInfo DirName;
8911   getDerived().getSema().StartOpenMPDSABlock(
8912       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8913   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8914   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8915   return Res;
8916 }
8917 
8918 template <typename Derived>
8919 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8920     OMPTeamsDistributeParallelForSimdDirective *D) {
8921   DeclarationNameInfo DirName;
8922   getDerived().getSema().StartOpenMPDSABlock(
8923       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8924       D->getBeginLoc());
8925   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8926   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8927   return Res;
8928 }
8929 
8930 template <typename Derived>
8931 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8932     OMPTeamsDistributeParallelForDirective *D) {
8933   DeclarationNameInfo DirName;
8934   getDerived().getSema().StartOpenMPDSABlock(
8935       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8936   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8937   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8938   return Res;
8939 }
8940 
8941 template <typename Derived>
8942 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8943     OMPTargetTeamsDirective *D) {
8944   DeclarationNameInfo DirName;
8945   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8946                                              nullptr, D->getBeginLoc());
8947   auto Res = getDerived().TransformOMPExecutableDirective(D);
8948   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8949   return Res;
8950 }
8951 
8952 template <typename Derived>
8953 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8954     OMPTargetTeamsDistributeDirective *D) {
8955   DeclarationNameInfo DirName;
8956   getDerived().getSema().StartOpenMPDSABlock(
8957       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8958   auto Res = getDerived().TransformOMPExecutableDirective(D);
8959   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8960   return Res;
8961 }
8962 
8963 template <typename Derived>
8964 StmtResult
8965 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8966     OMPTargetTeamsDistributeParallelForDirective *D) {
8967   DeclarationNameInfo DirName;
8968   getDerived().getSema().StartOpenMPDSABlock(
8969       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8970       D->getBeginLoc());
8971   auto Res = getDerived().TransformOMPExecutableDirective(D);
8972   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8973   return Res;
8974 }
8975 
8976 template <typename Derived>
8977 StmtResult TreeTransform<Derived>::
8978     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8979         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8980   DeclarationNameInfo DirName;
8981   getDerived().getSema().StartOpenMPDSABlock(
8982       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8983       D->getBeginLoc());
8984   auto Res = getDerived().TransformOMPExecutableDirective(D);
8985   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8986   return Res;
8987 }
8988 
8989 template <typename Derived>
8990 StmtResult
8991 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8992     OMPTargetTeamsDistributeSimdDirective *D) {
8993   DeclarationNameInfo DirName;
8994   getDerived().getSema().StartOpenMPDSABlock(
8995       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8996   auto Res = getDerived().TransformOMPExecutableDirective(D);
8997   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8998   return Res;
8999 }
9000 
9001 
9002 //===----------------------------------------------------------------------===//
9003 // OpenMP clause transformation
9004 //===----------------------------------------------------------------------===//
9005 template <typename Derived>
9006 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
9007   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9008   if (Cond.isInvalid())
9009     return nullptr;
9010   return getDerived().RebuildOMPIfClause(
9011       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
9012       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
9013 }
9014 
9015 template <typename Derived>
9016 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
9017   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
9018   if (Cond.isInvalid())
9019     return nullptr;
9020   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9021                                             C->getLParenLoc(), C->getEndLoc());
9022 }
9023 
9024 template <typename Derived>
9025 OMPClause *
9026 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9027   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9028   if (NumThreads.isInvalid())
9029     return nullptr;
9030   return getDerived().RebuildOMPNumThreadsClause(
9031       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9032 }
9033 
9034 template <typename Derived>
9035 OMPClause *
9036 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9037   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9038   if (E.isInvalid())
9039     return nullptr;
9040   return getDerived().RebuildOMPSafelenClause(
9041       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9042 }
9043 
9044 template <typename Derived>
9045 OMPClause *
9046 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9047   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9048   if (E.isInvalid())
9049     return nullptr;
9050   return getDerived().RebuildOMPAllocatorClause(
9051       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9052 }
9053 
9054 template <typename Derived>
9055 OMPClause *
9056 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9057   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9058   if (E.isInvalid())
9059     return nullptr;
9060   return getDerived().RebuildOMPSimdlenClause(
9061       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9062 }
9063 
9064 template <typename Derived>
9065 OMPClause *TreeTransform<Derived>::TransformOMPSizesClause(OMPSizesClause *C) {
9066   SmallVector<Expr *, 4> TransformedSizes;
9067   TransformedSizes.reserve(C->getNumSizes());
9068   bool Changed = false;
9069   for (Expr *E : C->getSizesRefs()) {
9070     if (!E) {
9071       TransformedSizes.push_back(nullptr);
9072       continue;
9073     }
9074 
9075     ExprResult T = getDerived().TransformExpr(E);
9076     if (T.isInvalid())
9077       return nullptr;
9078     if (E != T.get())
9079       Changed = true;
9080     TransformedSizes.push_back(T.get());
9081   }
9082 
9083   if (!Changed && !getDerived().AlwaysRebuild())
9084     return C;
9085   return RebuildOMPSizesClause(TransformedSizes, C->getBeginLoc(),
9086                                C->getLParenLoc(), C->getEndLoc());
9087 }
9088 
9089 template <typename Derived>
9090 OMPClause *
9091 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9092   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9093   if (E.isInvalid())
9094     return nullptr;
9095   return getDerived().RebuildOMPCollapseClause(
9096       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9097 }
9098 
9099 template <typename Derived>
9100 OMPClause *
9101 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9102   return getDerived().RebuildOMPDefaultClause(
9103       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9104       C->getLParenLoc(), C->getEndLoc());
9105 }
9106 
9107 template <typename Derived>
9108 OMPClause *
9109 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9110   return getDerived().RebuildOMPProcBindClause(
9111       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9112       C->getLParenLoc(), C->getEndLoc());
9113 }
9114 
9115 template <typename Derived>
9116 OMPClause *
9117 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9118   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9119   if (E.isInvalid())
9120     return nullptr;
9121   return getDerived().RebuildOMPScheduleClause(
9122       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9123       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9124       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9125       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9126 }
9127 
9128 template <typename Derived>
9129 OMPClause *
9130 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9131   ExprResult E;
9132   if (auto *Num = C->getNumForLoops()) {
9133     E = getDerived().TransformExpr(Num);
9134     if (E.isInvalid())
9135       return nullptr;
9136   }
9137   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9138                                               C->getLParenLoc(), E.get());
9139 }
9140 
9141 template <typename Derived>
9142 OMPClause *
9143 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9144   ExprResult E;
9145   if (Expr *Evt = C->getEventHandler()) {
9146     E = getDerived().TransformExpr(Evt);
9147     if (E.isInvalid())
9148       return nullptr;
9149   }
9150   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9151                                              C->getLParenLoc(), C->getEndLoc());
9152 }
9153 
9154 template <typename Derived>
9155 OMPClause *
9156 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9157   // No need to rebuild this clause, no template-dependent parameters.
9158   return C;
9159 }
9160 
9161 template <typename Derived>
9162 OMPClause *
9163 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9164   // No need to rebuild this clause, no template-dependent parameters.
9165   return C;
9166 }
9167 
9168 template <typename Derived>
9169 OMPClause *
9170 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9171   // No need to rebuild this clause, no template-dependent parameters.
9172   return C;
9173 }
9174 
9175 template <typename Derived>
9176 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9177   // No need to rebuild this clause, no template-dependent parameters.
9178   return C;
9179 }
9180 
9181 template <typename Derived>
9182 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9183   // No need to rebuild this clause, no template-dependent parameters.
9184   return C;
9185 }
9186 
9187 template <typename Derived>
9188 OMPClause *
9189 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9190   // No need to rebuild this clause, no template-dependent parameters.
9191   return C;
9192 }
9193 
9194 template <typename Derived>
9195 OMPClause *
9196 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9197   // No need to rebuild this clause, no template-dependent parameters.
9198   return C;
9199 }
9200 
9201 template <typename Derived>
9202 OMPClause *
9203 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9204   // No need to rebuild this clause, no template-dependent parameters.
9205   return C;
9206 }
9207 
9208 template <typename Derived>
9209 OMPClause *
9210 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9211   // No need to rebuild this clause, no template-dependent parameters.
9212   return C;
9213 }
9214 
9215 template <typename Derived>
9216 OMPClause *
9217 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9218   // No need to rebuild this clause, no template-dependent parameters.
9219   return C;
9220 }
9221 
9222 template <typename Derived>
9223 OMPClause *
9224 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9225   // No need to rebuild this clause, no template-dependent parameters.
9226   return C;
9227 }
9228 
9229 template <typename Derived>
9230 OMPClause *
9231 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9232   // No need to rebuild this clause, no template-dependent parameters.
9233   return C;
9234 }
9235 
9236 template <typename Derived>
9237 OMPClause *
9238 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9239   // No need to rebuild this clause, no template-dependent parameters.
9240   return C;
9241 }
9242 
9243 template <typename Derived>
9244 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9245   // No need to rebuild this clause, no template-dependent parameters.
9246   return C;
9247 }
9248 
9249 template <typename Derived>
9250 OMPClause *
9251 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9252   // No need to rebuild this clause, no template-dependent parameters.
9253   return C;
9254 }
9255 
9256 template <typename Derived>
9257 OMPClause *
9258 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9259   // No need to rebuild this clause, no template-dependent parameters.
9260   return C;
9261 }
9262 
9263 template <typename Derived>
9264 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9265     OMPUnifiedAddressClause *C) {
9266   llvm_unreachable("unified_address clause cannot appear in dependent context");
9267 }
9268 
9269 template <typename Derived>
9270 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9271     OMPUnifiedSharedMemoryClause *C) {
9272   llvm_unreachable(
9273       "unified_shared_memory clause cannot appear in dependent context");
9274 }
9275 
9276 template <typename Derived>
9277 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9278     OMPReverseOffloadClause *C) {
9279   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9280 }
9281 
9282 template <typename Derived>
9283 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9284     OMPDynamicAllocatorsClause *C) {
9285   llvm_unreachable(
9286       "dynamic_allocators clause cannot appear in dependent context");
9287 }
9288 
9289 template <typename Derived>
9290 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9291     OMPAtomicDefaultMemOrderClause *C) {
9292   llvm_unreachable(
9293       "atomic_default_mem_order clause cannot appear in dependent context");
9294 }
9295 
9296 template <typename Derived>
9297 OMPClause *
9298 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9299   llvm::SmallVector<Expr *, 16> Vars;
9300   Vars.reserve(C->varlist_size());
9301   for (auto *VE : C->varlists()) {
9302     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9303     if (EVar.isInvalid())
9304       return nullptr;
9305     Vars.push_back(EVar.get());
9306   }
9307   return getDerived().RebuildOMPPrivateClause(
9308       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9309 }
9310 
9311 template <typename Derived>
9312 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9313     OMPFirstprivateClause *C) {
9314   llvm::SmallVector<Expr *, 16> Vars;
9315   Vars.reserve(C->varlist_size());
9316   for (auto *VE : C->varlists()) {
9317     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9318     if (EVar.isInvalid())
9319       return nullptr;
9320     Vars.push_back(EVar.get());
9321   }
9322   return getDerived().RebuildOMPFirstprivateClause(
9323       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9324 }
9325 
9326 template <typename Derived>
9327 OMPClause *
9328 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9329   llvm::SmallVector<Expr *, 16> Vars;
9330   Vars.reserve(C->varlist_size());
9331   for (auto *VE : C->varlists()) {
9332     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9333     if (EVar.isInvalid())
9334       return nullptr;
9335     Vars.push_back(EVar.get());
9336   }
9337   return getDerived().RebuildOMPLastprivateClause(
9338       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9339       C->getLParenLoc(), C->getEndLoc());
9340 }
9341 
9342 template <typename Derived>
9343 OMPClause *
9344 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9345   llvm::SmallVector<Expr *, 16> Vars;
9346   Vars.reserve(C->varlist_size());
9347   for (auto *VE : C->varlists()) {
9348     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9349     if (EVar.isInvalid())
9350       return nullptr;
9351     Vars.push_back(EVar.get());
9352   }
9353   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9354                                              C->getLParenLoc(), C->getEndLoc());
9355 }
9356 
9357 template <typename Derived>
9358 OMPClause *
9359 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9360   llvm::SmallVector<Expr *, 16> Vars;
9361   Vars.reserve(C->varlist_size());
9362   for (auto *VE : C->varlists()) {
9363     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9364     if (EVar.isInvalid())
9365       return nullptr;
9366     Vars.push_back(EVar.get());
9367   }
9368   CXXScopeSpec ReductionIdScopeSpec;
9369   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9370 
9371   DeclarationNameInfo NameInfo = C->getNameInfo();
9372   if (NameInfo.getName()) {
9373     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9374     if (!NameInfo.getName())
9375       return nullptr;
9376   }
9377   // Build a list of all UDR decls with the same names ranged by the Scopes.
9378   // The Scope boundary is a duplication of the previous decl.
9379   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9380   for (auto *E : C->reduction_ops()) {
9381     // Transform all the decls.
9382     if (E) {
9383       auto *ULE = cast<UnresolvedLookupExpr>(E);
9384       UnresolvedSet<8> Decls;
9385       for (auto *D : ULE->decls()) {
9386         NamedDecl *InstD =
9387             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9388         Decls.addDecl(InstD, InstD->getAccess());
9389       }
9390       UnresolvedReductions.push_back(
9391        UnresolvedLookupExpr::Create(
9392           SemaRef.Context, /*NamingClass=*/nullptr,
9393           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9394           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9395           Decls.begin(), Decls.end()));
9396     } else
9397       UnresolvedReductions.push_back(nullptr);
9398   }
9399   return getDerived().RebuildOMPReductionClause(
9400       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9401       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9402       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9403 }
9404 
9405 template <typename Derived>
9406 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9407     OMPTaskReductionClause *C) {
9408   llvm::SmallVector<Expr *, 16> Vars;
9409   Vars.reserve(C->varlist_size());
9410   for (auto *VE : C->varlists()) {
9411     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9412     if (EVar.isInvalid())
9413       return nullptr;
9414     Vars.push_back(EVar.get());
9415   }
9416   CXXScopeSpec ReductionIdScopeSpec;
9417   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9418 
9419   DeclarationNameInfo NameInfo = C->getNameInfo();
9420   if (NameInfo.getName()) {
9421     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9422     if (!NameInfo.getName())
9423       return nullptr;
9424   }
9425   // Build a list of all UDR decls with the same names ranged by the Scopes.
9426   // The Scope boundary is a duplication of the previous decl.
9427   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9428   for (auto *E : C->reduction_ops()) {
9429     // Transform all the decls.
9430     if (E) {
9431       auto *ULE = cast<UnresolvedLookupExpr>(E);
9432       UnresolvedSet<8> Decls;
9433       for (auto *D : ULE->decls()) {
9434         NamedDecl *InstD =
9435             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9436         Decls.addDecl(InstD, InstD->getAccess());
9437       }
9438       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9439           SemaRef.Context, /*NamingClass=*/nullptr,
9440           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9441           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9442     } else
9443       UnresolvedReductions.push_back(nullptr);
9444   }
9445   return getDerived().RebuildOMPTaskReductionClause(
9446       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9447       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9448 }
9449 
9450 template <typename Derived>
9451 OMPClause *
9452 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
9453   llvm::SmallVector<Expr *, 16> Vars;
9454   Vars.reserve(C->varlist_size());
9455   for (auto *VE : C->varlists()) {
9456     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9457     if (EVar.isInvalid())
9458       return nullptr;
9459     Vars.push_back(EVar.get());
9460   }
9461   CXXScopeSpec ReductionIdScopeSpec;
9462   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9463 
9464   DeclarationNameInfo NameInfo = C->getNameInfo();
9465   if (NameInfo.getName()) {
9466     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9467     if (!NameInfo.getName())
9468       return nullptr;
9469   }
9470   // Build a list of all UDR decls with the same names ranged by the Scopes.
9471   // The Scope boundary is a duplication of the previous decl.
9472   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9473   for (auto *E : C->reduction_ops()) {
9474     // Transform all the decls.
9475     if (E) {
9476       auto *ULE = cast<UnresolvedLookupExpr>(E);
9477       UnresolvedSet<8> Decls;
9478       for (auto *D : ULE->decls()) {
9479         NamedDecl *InstD =
9480             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9481         Decls.addDecl(InstD, InstD->getAccess());
9482       }
9483       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9484           SemaRef.Context, /*NamingClass=*/nullptr,
9485           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9486           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9487     } else
9488       UnresolvedReductions.push_back(nullptr);
9489   }
9490   return getDerived().RebuildOMPInReductionClause(
9491       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9492       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9493 }
9494 
9495 template <typename Derived>
9496 OMPClause *
9497 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
9498   llvm::SmallVector<Expr *, 16> Vars;
9499   Vars.reserve(C->varlist_size());
9500   for (auto *VE : C->varlists()) {
9501     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9502     if (EVar.isInvalid())
9503       return nullptr;
9504     Vars.push_back(EVar.get());
9505   }
9506   ExprResult Step = getDerived().TransformExpr(C->getStep());
9507   if (Step.isInvalid())
9508     return nullptr;
9509   return getDerived().RebuildOMPLinearClause(
9510       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9511       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9512 }
9513 
9514 template <typename Derived>
9515 OMPClause *
9516 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9517   llvm::SmallVector<Expr *, 16> Vars;
9518   Vars.reserve(C->varlist_size());
9519   for (auto *VE : C->varlists()) {
9520     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9521     if (EVar.isInvalid())
9522       return nullptr;
9523     Vars.push_back(EVar.get());
9524   }
9525   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9526   if (Alignment.isInvalid())
9527     return nullptr;
9528   return getDerived().RebuildOMPAlignedClause(
9529       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9530       C->getColonLoc(), C->getEndLoc());
9531 }
9532 
9533 template <typename Derived>
9534 OMPClause *
9535 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9536   llvm::SmallVector<Expr *, 16> Vars;
9537   Vars.reserve(C->varlist_size());
9538   for (auto *VE : C->varlists()) {
9539     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9540     if (EVar.isInvalid())
9541       return nullptr;
9542     Vars.push_back(EVar.get());
9543   }
9544   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9545                                              C->getLParenLoc(), C->getEndLoc());
9546 }
9547 
9548 template <typename Derived>
9549 OMPClause *
9550 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9551   llvm::SmallVector<Expr *, 16> Vars;
9552   Vars.reserve(C->varlist_size());
9553   for (auto *VE : C->varlists()) {
9554     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9555     if (EVar.isInvalid())
9556       return nullptr;
9557     Vars.push_back(EVar.get());
9558   }
9559   return getDerived().RebuildOMPCopyprivateClause(
9560       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9561 }
9562 
9563 template <typename Derived>
9564 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9565   llvm::SmallVector<Expr *, 16> Vars;
9566   Vars.reserve(C->varlist_size());
9567   for (auto *VE : C->varlists()) {
9568     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9569     if (EVar.isInvalid())
9570       return nullptr;
9571     Vars.push_back(EVar.get());
9572   }
9573   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9574                                             C->getLParenLoc(), C->getEndLoc());
9575 }
9576 
9577 template <typename Derived>
9578 OMPClause *
9579 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9580   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9581   if (E.isInvalid())
9582     return nullptr;
9583   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9584                                              C->getLParenLoc(), C->getEndLoc());
9585 }
9586 
9587 template <typename Derived>
9588 OMPClause *
9589 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9590   llvm::SmallVector<Expr *, 16> Vars;
9591   Expr *DepModifier = C->getModifier();
9592   if (DepModifier) {
9593     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9594     if (DepModRes.isInvalid())
9595       return nullptr;
9596     DepModifier = DepModRes.get();
9597   }
9598   Vars.reserve(C->varlist_size());
9599   for (auto *VE : C->varlists()) {
9600     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9601     if (EVar.isInvalid())
9602       return nullptr;
9603     Vars.push_back(EVar.get());
9604   }
9605   return getDerived().RebuildOMPDependClause(
9606       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9607       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9608       C->getEndLoc());
9609 }
9610 
9611 template <typename Derived>
9612 OMPClause *
9613 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9614   ExprResult E = getDerived().TransformExpr(C->getDevice());
9615   if (E.isInvalid())
9616     return nullptr;
9617   return getDerived().RebuildOMPDeviceClause(
9618       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9619       C->getModifierLoc(), C->getEndLoc());
9620 }
9621 
9622 template <typename Derived, class T>
9623 bool transformOMPMappableExprListClause(
9624     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9625     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9626     DeclarationNameInfo &MapperIdInfo,
9627     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9628   // Transform expressions in the list.
9629   Vars.reserve(C->varlist_size());
9630   for (auto *VE : C->varlists()) {
9631     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9632     if (EVar.isInvalid())
9633       return true;
9634     Vars.push_back(EVar.get());
9635   }
9636   // Transform mapper scope specifier and identifier.
9637   NestedNameSpecifierLoc QualifierLoc;
9638   if (C->getMapperQualifierLoc()) {
9639     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9640         C->getMapperQualifierLoc());
9641     if (!QualifierLoc)
9642       return true;
9643   }
9644   MapperIdScopeSpec.Adopt(QualifierLoc);
9645   MapperIdInfo = C->getMapperIdInfo();
9646   if (MapperIdInfo.getName()) {
9647     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9648     if (!MapperIdInfo.getName())
9649       return true;
9650   }
9651   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9652   // the previous user-defined mapper lookup in dependent environment.
9653   for (auto *E : C->mapperlists()) {
9654     // Transform all the decls.
9655     if (E) {
9656       auto *ULE = cast<UnresolvedLookupExpr>(E);
9657       UnresolvedSet<8> Decls;
9658       for (auto *D : ULE->decls()) {
9659         NamedDecl *InstD =
9660             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9661         Decls.addDecl(InstD, InstD->getAccess());
9662       }
9663       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9664           TT.getSema().Context, /*NamingClass=*/nullptr,
9665           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9666           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9667           Decls.end()));
9668     } else {
9669       UnresolvedMappers.push_back(nullptr);
9670     }
9671   }
9672   return false;
9673 }
9674 
9675 template <typename Derived>
9676 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9677   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9678   llvm::SmallVector<Expr *, 16> Vars;
9679   CXXScopeSpec MapperIdScopeSpec;
9680   DeclarationNameInfo MapperIdInfo;
9681   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9682   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9683           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9684     return nullptr;
9685   return getDerived().RebuildOMPMapClause(
9686       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9687       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9688       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9689 }
9690 
9691 template <typename Derived>
9692 OMPClause *
9693 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9694   Expr *Allocator = C->getAllocator();
9695   if (Allocator) {
9696     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9697     if (AllocatorRes.isInvalid())
9698       return nullptr;
9699     Allocator = AllocatorRes.get();
9700   }
9701   llvm::SmallVector<Expr *, 16> Vars;
9702   Vars.reserve(C->varlist_size());
9703   for (auto *VE : C->varlists()) {
9704     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9705     if (EVar.isInvalid())
9706       return nullptr;
9707     Vars.push_back(EVar.get());
9708   }
9709   return getDerived().RebuildOMPAllocateClause(
9710       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9711       C->getEndLoc());
9712 }
9713 
9714 template <typename Derived>
9715 OMPClause *
9716 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9717   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9718   if (E.isInvalid())
9719     return nullptr;
9720   return getDerived().RebuildOMPNumTeamsClause(
9721       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9722 }
9723 
9724 template <typename Derived>
9725 OMPClause *
9726 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9727   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9728   if (E.isInvalid())
9729     return nullptr;
9730   return getDerived().RebuildOMPThreadLimitClause(
9731       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9732 }
9733 
9734 template <typename Derived>
9735 OMPClause *
9736 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9737   ExprResult E = getDerived().TransformExpr(C->getPriority());
9738   if (E.isInvalid())
9739     return nullptr;
9740   return getDerived().RebuildOMPPriorityClause(
9741       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9742 }
9743 
9744 template <typename Derived>
9745 OMPClause *
9746 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9747   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9748   if (E.isInvalid())
9749     return nullptr;
9750   return getDerived().RebuildOMPGrainsizeClause(
9751       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9752 }
9753 
9754 template <typename Derived>
9755 OMPClause *
9756 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9757   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9758   if (E.isInvalid())
9759     return nullptr;
9760   return getDerived().RebuildOMPNumTasksClause(
9761       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9762 }
9763 
9764 template <typename Derived>
9765 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9766   ExprResult E = getDerived().TransformExpr(C->getHint());
9767   if (E.isInvalid())
9768     return nullptr;
9769   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9770                                            C->getLParenLoc(), C->getEndLoc());
9771 }
9772 
9773 template <typename Derived>
9774 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9775     OMPDistScheduleClause *C) {
9776   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9777   if (E.isInvalid())
9778     return nullptr;
9779   return getDerived().RebuildOMPDistScheduleClause(
9780       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9781       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9782 }
9783 
9784 template <typename Derived>
9785 OMPClause *
9786 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9787   // Rebuild Defaultmap Clause since we need to invoke the checking of
9788   // defaultmap(none:variable-category) after template initialization.
9789   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9790                                                  C->getDefaultmapKind(),
9791                                                  C->getBeginLoc(),
9792                                                  C->getLParenLoc(),
9793                                                  C->getDefaultmapModifierLoc(),
9794                                                  C->getDefaultmapKindLoc(),
9795                                                  C->getEndLoc());
9796 }
9797 
9798 template <typename Derived>
9799 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9800   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9801   llvm::SmallVector<Expr *, 16> Vars;
9802   CXXScopeSpec MapperIdScopeSpec;
9803   DeclarationNameInfo MapperIdInfo;
9804   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9805   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9806           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9807     return nullptr;
9808   return getDerived().RebuildOMPToClause(
9809       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9810       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9811 }
9812 
9813 template <typename Derived>
9814 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9815   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9816   llvm::SmallVector<Expr *, 16> Vars;
9817   CXXScopeSpec MapperIdScopeSpec;
9818   DeclarationNameInfo MapperIdInfo;
9819   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9820   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9821           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9822     return nullptr;
9823   return getDerived().RebuildOMPFromClause(
9824       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9825       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9826 }
9827 
9828 template <typename Derived>
9829 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9830     OMPUseDevicePtrClause *C) {
9831   llvm::SmallVector<Expr *, 16> Vars;
9832   Vars.reserve(C->varlist_size());
9833   for (auto *VE : C->varlists()) {
9834     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9835     if (EVar.isInvalid())
9836       return nullptr;
9837     Vars.push_back(EVar.get());
9838   }
9839   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9840   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9841 }
9842 
9843 template <typename Derived>
9844 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
9845     OMPUseDeviceAddrClause *C) {
9846   llvm::SmallVector<Expr *, 16> Vars;
9847   Vars.reserve(C->varlist_size());
9848   for (auto *VE : C->varlists()) {
9849     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9850     if (EVar.isInvalid())
9851       return nullptr;
9852     Vars.push_back(EVar.get());
9853   }
9854   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9855   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
9856 }
9857 
9858 template <typename Derived>
9859 OMPClause *
9860 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9861   llvm::SmallVector<Expr *, 16> Vars;
9862   Vars.reserve(C->varlist_size());
9863   for (auto *VE : C->varlists()) {
9864     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9865     if (EVar.isInvalid())
9866       return nullptr;
9867     Vars.push_back(EVar.get());
9868   }
9869   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9870   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9871 }
9872 
9873 template <typename Derived>
9874 OMPClause *
9875 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *C) {
9876   llvm::SmallVector<Expr *, 16> Vars;
9877   Vars.reserve(C->varlist_size());
9878   for (auto *VE : C->varlists()) {
9879     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9880     if (EVar.isInvalid())
9881       return nullptr;
9882     Vars.push_back(EVar.get());
9883   }
9884   return getDerived().RebuildOMPNontemporalClause(
9885       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9886 }
9887 
9888 template <typename Derived>
9889 OMPClause *
9890 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *C) {
9891   llvm::SmallVector<Expr *, 16> Vars;
9892   Vars.reserve(C->varlist_size());
9893   for (auto *VE : C->varlists()) {
9894     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9895     if (EVar.isInvalid())
9896       return nullptr;
9897     Vars.push_back(EVar.get());
9898   }
9899   return getDerived().RebuildOMPInclusiveClause(
9900       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9901 }
9902 
9903 template <typename Derived>
9904 OMPClause *
9905 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *C) {
9906   llvm::SmallVector<Expr *, 16> Vars;
9907   Vars.reserve(C->varlist_size());
9908   for (auto *VE : C->varlists()) {
9909     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9910     if (EVar.isInvalid())
9911       return nullptr;
9912     Vars.push_back(EVar.get());
9913   }
9914   return getDerived().RebuildOMPExclusiveClause(
9915       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9916 }
9917 
9918 template <typename Derived>
9919 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
9920     OMPUsesAllocatorsClause *C) {
9921   SmallVector<Sema::UsesAllocatorsData, 16> Data;
9922   Data.reserve(C->getNumberOfAllocators());
9923   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
9924     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
9925     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
9926     if (Allocator.isInvalid())
9927       continue;
9928     ExprResult AllocatorTraits;
9929     if (Expr *AT = D.AllocatorTraits) {
9930       AllocatorTraits = getDerived().TransformExpr(AT);
9931       if (AllocatorTraits.isInvalid())
9932         continue;
9933     }
9934     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
9935     NewD.Allocator = Allocator.get();
9936     NewD.AllocatorTraits = AllocatorTraits.get();
9937     NewD.LParenLoc = D.LParenLoc;
9938     NewD.RParenLoc = D.RParenLoc;
9939   }
9940   return getDerived().RebuildOMPUsesAllocatorsClause(
9941       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9942 }
9943 
9944 template <typename Derived>
9945 OMPClause *
9946 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
9947   SmallVector<Expr *, 4> Locators;
9948   Locators.reserve(C->varlist_size());
9949   ExprResult ModifierRes;
9950   if (Expr *Modifier = C->getModifier()) {
9951     ModifierRes = getDerived().TransformExpr(Modifier);
9952     if (ModifierRes.isInvalid())
9953       return nullptr;
9954   }
9955   for (Expr *E : C->varlists()) {
9956     ExprResult Locator = getDerived().TransformExpr(E);
9957     if (Locator.isInvalid())
9958       continue;
9959     Locators.push_back(Locator.get());
9960   }
9961   return getDerived().RebuildOMPAffinityClause(
9962       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
9963       ModifierRes.get(), Locators);
9964 }
9965 
9966 template <typename Derived>
9967 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9968   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9969                                             C->getBeginLoc(), C->getLParenLoc(),
9970                                             C->getEndLoc());
9971 }
9972 
9973 //===----------------------------------------------------------------------===//
9974 // Expression transformation
9975 //===----------------------------------------------------------------------===//
9976 template<typename Derived>
9977 ExprResult
9978 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9979   return TransformExpr(E->getSubExpr());
9980 }
9981 
9982 template<typename Derived>
9983 ExprResult
9984 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9985   if (!E->isTypeDependent())
9986     return E;
9987 
9988   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9989                                             E->getIdentKind());
9990 }
9991 
9992 template<typename Derived>
9993 ExprResult
9994 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9995   NestedNameSpecifierLoc QualifierLoc;
9996   if (E->getQualifierLoc()) {
9997     QualifierLoc
9998       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9999     if (!QualifierLoc)
10000       return ExprError();
10001   }
10002 
10003   ValueDecl *ND
10004     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
10005                                                          E->getDecl()));
10006   if (!ND)
10007     return ExprError();
10008 
10009   NamedDecl *Found = ND;
10010   if (E->getFoundDecl() != E->getDecl()) {
10011     Found = cast_or_null<NamedDecl>(
10012         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
10013     if (!Found)
10014       return ExprError();
10015   }
10016 
10017   DeclarationNameInfo NameInfo = E->getNameInfo();
10018   if (NameInfo.getName()) {
10019     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
10020     if (!NameInfo.getName())
10021       return ExprError();
10022   }
10023 
10024   if (!getDerived().AlwaysRebuild() &&
10025       QualifierLoc == E->getQualifierLoc() &&
10026       ND == E->getDecl() &&
10027       Found == E->getFoundDecl() &&
10028       NameInfo.getName() == E->getDecl()->getDeclName() &&
10029       !E->hasExplicitTemplateArgs()) {
10030 
10031     // Mark it referenced in the new context regardless.
10032     // FIXME: this is a bit instantiation-specific.
10033     SemaRef.MarkDeclRefReferenced(E);
10034 
10035     return E;
10036   }
10037 
10038   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
10039   if (E->hasExplicitTemplateArgs()) {
10040     TemplateArgs = &TransArgs;
10041     TransArgs.setLAngleLoc(E->getLAngleLoc());
10042     TransArgs.setRAngleLoc(E->getRAngleLoc());
10043     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10044                                                 E->getNumTemplateArgs(),
10045                                                 TransArgs))
10046       return ExprError();
10047   }
10048 
10049   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10050                                          Found, TemplateArgs);
10051 }
10052 
10053 template<typename Derived>
10054 ExprResult
10055 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10056   return E;
10057 }
10058 
10059 template <typename Derived>
10060 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10061     FixedPointLiteral *E) {
10062   return E;
10063 }
10064 
10065 template<typename Derived>
10066 ExprResult
10067 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10068   return E;
10069 }
10070 
10071 template<typename Derived>
10072 ExprResult
10073 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10074   return E;
10075 }
10076 
10077 template<typename Derived>
10078 ExprResult
10079 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10080   return E;
10081 }
10082 
10083 template<typename Derived>
10084 ExprResult
10085 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10086   return E;
10087 }
10088 
10089 template<typename Derived>
10090 ExprResult
10091 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10092   if (FunctionDecl *FD = E->getDirectCallee())
10093     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10094   return SemaRef.MaybeBindToTemporary(E);
10095 }
10096 
10097 template<typename Derived>
10098 ExprResult
10099 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10100   ExprResult ControllingExpr =
10101     getDerived().TransformExpr(E->getControllingExpr());
10102   if (ControllingExpr.isInvalid())
10103     return ExprError();
10104 
10105   SmallVector<Expr *, 4> AssocExprs;
10106   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10107   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10108     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10109     if (TSI) {
10110       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10111       if (!AssocType)
10112         return ExprError();
10113       AssocTypes.push_back(AssocType);
10114     } else {
10115       AssocTypes.push_back(nullptr);
10116     }
10117 
10118     ExprResult AssocExpr =
10119         getDerived().TransformExpr(Assoc.getAssociationExpr());
10120     if (AssocExpr.isInvalid())
10121       return ExprError();
10122     AssocExprs.push_back(AssocExpr.get());
10123   }
10124 
10125   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10126                                                   E->getDefaultLoc(),
10127                                                   E->getRParenLoc(),
10128                                                   ControllingExpr.get(),
10129                                                   AssocTypes,
10130                                                   AssocExprs);
10131 }
10132 
10133 template<typename Derived>
10134 ExprResult
10135 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10136   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10137   if (SubExpr.isInvalid())
10138     return ExprError();
10139 
10140   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10141     return E;
10142 
10143   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10144                                        E->getRParen());
10145 }
10146 
10147 /// The operand of a unary address-of operator has special rules: it's
10148 /// allowed to refer to a non-static member of a class even if there's no 'this'
10149 /// object available.
10150 template<typename Derived>
10151 ExprResult
10152 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10153   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10154     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10155   else
10156     return getDerived().TransformExpr(E);
10157 }
10158 
10159 template<typename Derived>
10160 ExprResult
10161 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10162   ExprResult SubExpr;
10163   if (E->getOpcode() == UO_AddrOf)
10164     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10165   else
10166     SubExpr = TransformExpr(E->getSubExpr());
10167   if (SubExpr.isInvalid())
10168     return ExprError();
10169 
10170   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10171     return E;
10172 
10173   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10174                                            E->getOpcode(),
10175                                            SubExpr.get());
10176 }
10177 
10178 template<typename Derived>
10179 ExprResult
10180 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10181   // Transform the type.
10182   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10183   if (!Type)
10184     return ExprError();
10185 
10186   // Transform all of the components into components similar to what the
10187   // parser uses.
10188   // FIXME: It would be slightly more efficient in the non-dependent case to
10189   // just map FieldDecls, rather than requiring the rebuilder to look for
10190   // the fields again. However, __builtin_offsetof is rare enough in
10191   // template code that we don't care.
10192   bool ExprChanged = false;
10193   typedef Sema::OffsetOfComponent Component;
10194   SmallVector<Component, 4> Components;
10195   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10196     const OffsetOfNode &ON = E->getComponent(I);
10197     Component Comp;
10198     Comp.isBrackets = true;
10199     Comp.LocStart = ON.getSourceRange().getBegin();
10200     Comp.LocEnd = ON.getSourceRange().getEnd();
10201     switch (ON.getKind()) {
10202     case OffsetOfNode::Array: {
10203       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10204       ExprResult Index = getDerived().TransformExpr(FromIndex);
10205       if (Index.isInvalid())
10206         return ExprError();
10207 
10208       ExprChanged = ExprChanged || Index.get() != FromIndex;
10209       Comp.isBrackets = true;
10210       Comp.U.E = Index.get();
10211       break;
10212     }
10213 
10214     case OffsetOfNode::Field:
10215     case OffsetOfNode::Identifier:
10216       Comp.isBrackets = false;
10217       Comp.U.IdentInfo = ON.getFieldName();
10218       if (!Comp.U.IdentInfo)
10219         continue;
10220 
10221       break;
10222 
10223     case OffsetOfNode::Base:
10224       // Will be recomputed during the rebuild.
10225       continue;
10226     }
10227 
10228     Components.push_back(Comp);
10229   }
10230 
10231   // If nothing changed, retain the existing expression.
10232   if (!getDerived().AlwaysRebuild() &&
10233       Type == E->getTypeSourceInfo() &&
10234       !ExprChanged)
10235     return E;
10236 
10237   // Build a new offsetof expression.
10238   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10239                                           Components, E->getRParenLoc());
10240 }
10241 
10242 template<typename Derived>
10243 ExprResult
10244 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10245   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10246          "opaque value expression requires transformation");
10247   return E;
10248 }
10249 
10250 template<typename Derived>
10251 ExprResult
10252 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10253   return E;
10254 }
10255 
10256 template <typename Derived>
10257 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10258   llvm::SmallVector<Expr *, 8> Children;
10259   bool Changed = false;
10260   for (Expr *C : E->subExpressions()) {
10261     ExprResult NewC = getDerived().TransformExpr(C);
10262     if (NewC.isInvalid())
10263       return ExprError();
10264     Children.push_back(NewC.get());
10265 
10266     Changed |= NewC.get() != C;
10267   }
10268   if (!getDerived().AlwaysRebuild() && !Changed)
10269     return E;
10270   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10271                                           Children, E->getType());
10272 }
10273 
10274 template<typename Derived>
10275 ExprResult
10276 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10277   // Rebuild the syntactic form.  The original syntactic form has
10278   // opaque-value expressions in it, so strip those away and rebuild
10279   // the result.  This is a really awful way of doing this, but the
10280   // better solution (rebuilding the semantic expressions and
10281   // rebinding OVEs as necessary) doesn't work; we'd need
10282   // TreeTransform to not strip away implicit conversions.
10283   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10284   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10285   if (result.isInvalid()) return ExprError();
10286 
10287   // If that gives us a pseudo-object result back, the pseudo-object
10288   // expression must have been an lvalue-to-rvalue conversion which we
10289   // should reapply.
10290   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10291     result = SemaRef.checkPseudoObjectRValue(result.get());
10292 
10293   return result;
10294 }
10295 
10296 template<typename Derived>
10297 ExprResult
10298 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10299                                                 UnaryExprOrTypeTraitExpr *E) {
10300   if (E->isArgumentType()) {
10301     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10302 
10303     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10304     if (!NewT)
10305       return ExprError();
10306 
10307     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10308       return E;
10309 
10310     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10311                                                     E->getKind(),
10312                                                     E->getSourceRange());
10313   }
10314 
10315   // C++0x [expr.sizeof]p1:
10316   //   The operand is either an expression, which is an unevaluated operand
10317   //   [...]
10318   EnterExpressionEvaluationContext Unevaluated(
10319       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10320       Sema::ReuseLambdaContextDecl);
10321 
10322   // Try to recover if we have something like sizeof(T::X) where X is a type.
10323   // Notably, there must be *exactly* one set of parens if X is a type.
10324   TypeSourceInfo *RecoveryTSI = nullptr;
10325   ExprResult SubExpr;
10326   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10327   if (auto *DRE =
10328           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10329     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10330         PE, DRE, false, &RecoveryTSI);
10331   else
10332     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10333 
10334   if (RecoveryTSI) {
10335     return getDerived().RebuildUnaryExprOrTypeTrait(
10336         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10337   } else if (SubExpr.isInvalid())
10338     return ExprError();
10339 
10340   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10341     return E;
10342 
10343   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10344                                                   E->getOperatorLoc(),
10345                                                   E->getKind(),
10346                                                   E->getSourceRange());
10347 }
10348 
10349 template<typename Derived>
10350 ExprResult
10351 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10352   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10353   if (LHS.isInvalid())
10354     return ExprError();
10355 
10356   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10357   if (RHS.isInvalid())
10358     return ExprError();
10359 
10360 
10361   if (!getDerived().AlwaysRebuild() &&
10362       LHS.get() == E->getLHS() &&
10363       RHS.get() == E->getRHS())
10364     return E;
10365 
10366   return getDerived().RebuildArraySubscriptExpr(
10367       LHS.get(),
10368       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10369 }
10370 
10371 template <typename Derived>
10372 ExprResult
10373 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10374   ExprResult Base = getDerived().TransformExpr(E->getBase());
10375   if (Base.isInvalid())
10376     return ExprError();
10377 
10378   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10379   if (RowIdx.isInvalid())
10380     return ExprError();
10381 
10382   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10383   if (ColumnIdx.isInvalid())
10384     return ExprError();
10385 
10386   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10387       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10388     return E;
10389 
10390   return getDerived().RebuildMatrixSubscriptExpr(
10391       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10392 }
10393 
10394 template <typename Derived>
10395 ExprResult
10396 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10397   ExprResult Base = getDerived().TransformExpr(E->getBase());
10398   if (Base.isInvalid())
10399     return ExprError();
10400 
10401   ExprResult LowerBound;
10402   if (E->getLowerBound()) {
10403     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10404     if (LowerBound.isInvalid())
10405       return ExprError();
10406   }
10407 
10408   ExprResult Length;
10409   if (E->getLength()) {
10410     Length = getDerived().TransformExpr(E->getLength());
10411     if (Length.isInvalid())
10412       return ExprError();
10413   }
10414 
10415   ExprResult Stride;
10416   if (Expr *Str = E->getStride()) {
10417     Stride = getDerived().TransformExpr(Str);
10418     if (Stride.isInvalid())
10419       return ExprError();
10420   }
10421 
10422   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10423       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10424     return E;
10425 
10426   return getDerived().RebuildOMPArraySectionExpr(
10427       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10428       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10429       E->getRBracketLoc());
10430 }
10431 
10432 template <typename Derived>
10433 ExprResult
10434 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10435   ExprResult Base = getDerived().TransformExpr(E->getBase());
10436   if (Base.isInvalid())
10437     return ExprError();
10438 
10439   SmallVector<Expr *, 4> Dims;
10440   bool ErrorFound = false;
10441   for (Expr *Dim : E->getDimensions()) {
10442     ExprResult DimRes = getDerived().TransformExpr(Dim);
10443     if (DimRes.isInvalid()) {
10444       ErrorFound = true;
10445       continue;
10446     }
10447     Dims.push_back(DimRes.get());
10448   }
10449 
10450   if (ErrorFound)
10451     return ExprError();
10452   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10453                                                  E->getRParenLoc(), Dims,
10454                                                  E->getBracketsRanges());
10455 }
10456 
10457 template <typename Derived>
10458 ExprResult
10459 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10460   unsigned NumIterators = E->numOfIterators();
10461   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10462 
10463   bool ErrorFound = false;
10464   bool NeedToRebuild = getDerived().AlwaysRebuild();
10465   for (unsigned I = 0; I < NumIterators; ++I) {
10466     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10467     Data[I].DeclIdent = D->getIdentifier();
10468     Data[I].DeclIdentLoc = D->getLocation();
10469     if (D->getLocation() == D->getBeginLoc()) {
10470       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10471              "Implicit type must be int.");
10472     } else {
10473       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10474       QualType DeclTy = getDerived().TransformType(D->getType());
10475       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10476     }
10477     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10478     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10479     ExprResult End = getDerived().TransformExpr(Range.End);
10480     ExprResult Step = getDerived().TransformExpr(Range.Step);
10481     ErrorFound = ErrorFound ||
10482                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10483                                                !Data[I].Type.get().isNull())) ||
10484                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10485     if (ErrorFound)
10486       continue;
10487     Data[I].Range.Begin = Begin.get();
10488     Data[I].Range.End = End.get();
10489     Data[I].Range.Step = Step.get();
10490     Data[I].AssignLoc = E->getAssignLoc(I);
10491     Data[I].ColonLoc = E->getColonLoc(I);
10492     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10493     NeedToRebuild =
10494         NeedToRebuild ||
10495         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10496                                        D->getType().getTypePtrOrNull()) ||
10497         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10498         Range.Step != Data[I].Range.Step;
10499   }
10500   if (ErrorFound)
10501     return ExprError();
10502   if (!NeedToRebuild)
10503     return E;
10504 
10505   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10506       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10507   if (!Res.isUsable())
10508     return Res;
10509   auto *IE = cast<OMPIteratorExpr>(Res.get());
10510   for (unsigned I = 0; I < NumIterators; ++I)
10511     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10512                                       IE->getIteratorDecl(I));
10513   return Res;
10514 }
10515 
10516 template<typename Derived>
10517 ExprResult
10518 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10519   // Transform the callee.
10520   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10521   if (Callee.isInvalid())
10522     return ExprError();
10523 
10524   // Transform arguments.
10525   bool ArgChanged = false;
10526   SmallVector<Expr*, 8> Args;
10527   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10528                                   &ArgChanged))
10529     return ExprError();
10530 
10531   if (!getDerived().AlwaysRebuild() &&
10532       Callee.get() == E->getCallee() &&
10533       !ArgChanged)
10534     return SemaRef.MaybeBindToTemporary(E);
10535 
10536   // FIXME: Wrong source location information for the '('.
10537   SourceLocation FakeLParenLoc
10538     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10539 
10540   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10541   if (E->hasStoredFPFeatures()) {
10542     FPOptionsOverride NewOverrides = E->getFPFeatures();
10543     getSema().CurFPFeatures =
10544         NewOverrides.applyOverrides(getSema().getLangOpts());
10545     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10546   }
10547 
10548   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10549                                       Args,
10550                                       E->getRParenLoc());
10551 }
10552 
10553 template<typename Derived>
10554 ExprResult
10555 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10556   ExprResult Base = getDerived().TransformExpr(E->getBase());
10557   if (Base.isInvalid())
10558     return ExprError();
10559 
10560   NestedNameSpecifierLoc QualifierLoc;
10561   if (E->hasQualifier()) {
10562     QualifierLoc
10563       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10564 
10565     if (!QualifierLoc)
10566       return ExprError();
10567   }
10568   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10569 
10570   ValueDecl *Member
10571     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10572                                                          E->getMemberDecl()));
10573   if (!Member)
10574     return ExprError();
10575 
10576   NamedDecl *FoundDecl = E->getFoundDecl();
10577   if (FoundDecl == E->getMemberDecl()) {
10578     FoundDecl = Member;
10579   } else {
10580     FoundDecl = cast_or_null<NamedDecl>(
10581                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10582     if (!FoundDecl)
10583       return ExprError();
10584   }
10585 
10586   if (!getDerived().AlwaysRebuild() &&
10587       Base.get() == E->getBase() &&
10588       QualifierLoc == E->getQualifierLoc() &&
10589       Member == E->getMemberDecl() &&
10590       FoundDecl == E->getFoundDecl() &&
10591       !E->hasExplicitTemplateArgs()) {
10592 
10593     // Mark it referenced in the new context regardless.
10594     // FIXME: this is a bit instantiation-specific.
10595     SemaRef.MarkMemberReferenced(E);
10596 
10597     return E;
10598   }
10599 
10600   TemplateArgumentListInfo TransArgs;
10601   if (E->hasExplicitTemplateArgs()) {
10602     TransArgs.setLAngleLoc(E->getLAngleLoc());
10603     TransArgs.setRAngleLoc(E->getRAngleLoc());
10604     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10605                                                 E->getNumTemplateArgs(),
10606                                                 TransArgs))
10607       return ExprError();
10608   }
10609 
10610   // FIXME: Bogus source location for the operator
10611   SourceLocation FakeOperatorLoc =
10612       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10613 
10614   // FIXME: to do this check properly, we will need to preserve the
10615   // first-qualifier-in-scope here, just in case we had a dependent
10616   // base (and therefore couldn't do the check) and a
10617   // nested-name-qualifier (and therefore could do the lookup).
10618   NamedDecl *FirstQualifierInScope = nullptr;
10619   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10620   if (MemberNameInfo.getName()) {
10621     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10622     if (!MemberNameInfo.getName())
10623       return ExprError();
10624   }
10625 
10626   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10627                                         E->isArrow(),
10628                                         QualifierLoc,
10629                                         TemplateKWLoc,
10630                                         MemberNameInfo,
10631                                         Member,
10632                                         FoundDecl,
10633                                         (E->hasExplicitTemplateArgs()
10634                                            ? &TransArgs : nullptr),
10635                                         FirstQualifierInScope);
10636 }
10637 
10638 template<typename Derived>
10639 ExprResult
10640 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10641   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10642   if (LHS.isInvalid())
10643     return ExprError();
10644 
10645   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10646   if (RHS.isInvalid())
10647     return ExprError();
10648 
10649   if (!getDerived().AlwaysRebuild() &&
10650       LHS.get() == E->getLHS() &&
10651       RHS.get() == E->getRHS())
10652     return E;
10653 
10654   if (E->isCompoundAssignmentOp())
10655     // FPFeatures has already been established from trailing storage
10656     return getDerived().RebuildBinaryOperator(
10657         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10658   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10659   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10660   getSema().CurFPFeatures =
10661       NewOverrides.applyOverrides(getSema().getLangOpts());
10662   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10663   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10664                                             LHS.get(), RHS.get());
10665 }
10666 
10667 template <typename Derived>
10668 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10669     CXXRewrittenBinaryOperator *E) {
10670   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10671 
10672   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10673   if (LHS.isInvalid())
10674     return ExprError();
10675 
10676   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10677   if (RHS.isInvalid())
10678     return ExprError();
10679 
10680   if (!getDerived().AlwaysRebuild() &&
10681       LHS.get() == Decomp.LHS &&
10682       RHS.get() == Decomp.RHS)
10683     return E;
10684 
10685   // Extract the already-resolved callee declarations so that we can restrict
10686   // ourselves to using them as the unqualified lookup results when rebuilding.
10687   UnresolvedSet<2> UnqualLookups;
10688   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10689                             const_cast<Expr *>(Decomp.InnerBinOp)};
10690   for (Expr *PossibleBinOp : PossibleBinOps) {
10691     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10692     if (!Op)
10693       continue;
10694     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10695     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10696       continue;
10697 
10698     // Transform the callee in case we built a call to a local extern
10699     // declaration.
10700     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10701         E->getOperatorLoc(), Callee->getFoundDecl()));
10702     if (!Found)
10703       return ExprError();
10704     UnqualLookups.addDecl(Found);
10705   }
10706 
10707   return getDerived().RebuildCXXRewrittenBinaryOperator(
10708       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10709 }
10710 
10711 template<typename Derived>
10712 ExprResult
10713 TreeTransform<Derived>::TransformCompoundAssignOperator(
10714                                                       CompoundAssignOperator *E) {
10715   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10716   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10717   getSema().CurFPFeatures =
10718       NewOverrides.applyOverrides(getSema().getLangOpts());
10719   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10720   return getDerived().TransformBinaryOperator(E);
10721 }
10722 
10723 template<typename Derived>
10724 ExprResult TreeTransform<Derived>::
10725 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10726   // Just rebuild the common and RHS expressions and see whether we
10727   // get any changes.
10728 
10729   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10730   if (commonExpr.isInvalid())
10731     return ExprError();
10732 
10733   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10734   if (rhs.isInvalid())
10735     return ExprError();
10736 
10737   if (!getDerived().AlwaysRebuild() &&
10738       commonExpr.get() == e->getCommon() &&
10739       rhs.get() == e->getFalseExpr())
10740     return e;
10741 
10742   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10743                                                  e->getQuestionLoc(),
10744                                                  nullptr,
10745                                                  e->getColonLoc(),
10746                                                  rhs.get());
10747 }
10748 
10749 template<typename Derived>
10750 ExprResult
10751 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10752   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10753   if (Cond.isInvalid())
10754     return ExprError();
10755 
10756   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10757   if (LHS.isInvalid())
10758     return ExprError();
10759 
10760   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10761   if (RHS.isInvalid())
10762     return ExprError();
10763 
10764   if (!getDerived().AlwaysRebuild() &&
10765       Cond.get() == E->getCond() &&
10766       LHS.get() == E->getLHS() &&
10767       RHS.get() == E->getRHS())
10768     return E;
10769 
10770   return getDerived().RebuildConditionalOperator(Cond.get(),
10771                                                  E->getQuestionLoc(),
10772                                                  LHS.get(),
10773                                                  E->getColonLoc(),
10774                                                  RHS.get());
10775 }
10776 
10777 template<typename Derived>
10778 ExprResult
10779 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10780   // Implicit casts are eliminated during transformation, since they
10781   // will be recomputed by semantic analysis after transformation.
10782   return getDerived().TransformExpr(E->getSubExprAsWritten());
10783 }
10784 
10785 template<typename Derived>
10786 ExprResult
10787 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10788   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10789   if (!Type)
10790     return ExprError();
10791 
10792   ExprResult SubExpr
10793     = getDerived().TransformExpr(E->getSubExprAsWritten());
10794   if (SubExpr.isInvalid())
10795     return ExprError();
10796 
10797   if (!getDerived().AlwaysRebuild() &&
10798       Type == E->getTypeInfoAsWritten() &&
10799       SubExpr.get() == E->getSubExpr())
10800     return E;
10801 
10802   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10803                                             Type,
10804                                             E->getRParenLoc(),
10805                                             SubExpr.get());
10806 }
10807 
10808 template<typename Derived>
10809 ExprResult
10810 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10811   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10812   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10813   if (!NewT)
10814     return ExprError();
10815 
10816   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10817   if (Init.isInvalid())
10818     return ExprError();
10819 
10820   if (!getDerived().AlwaysRebuild() &&
10821       OldT == NewT &&
10822       Init.get() == E->getInitializer())
10823     return SemaRef.MaybeBindToTemporary(E);
10824 
10825   // Note: the expression type doesn't necessarily match the
10826   // type-as-written, but that's okay, because it should always be
10827   // derivable from the initializer.
10828 
10829   return getDerived().RebuildCompoundLiteralExpr(
10830       E->getLParenLoc(), NewT,
10831       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10832 }
10833 
10834 template<typename Derived>
10835 ExprResult
10836 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10837   ExprResult Base = getDerived().TransformExpr(E->getBase());
10838   if (Base.isInvalid())
10839     return ExprError();
10840 
10841   if (!getDerived().AlwaysRebuild() &&
10842       Base.get() == E->getBase())
10843     return E;
10844 
10845   // FIXME: Bad source location
10846   SourceLocation FakeOperatorLoc =
10847       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10848   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10849                                                   E->getAccessorLoc(),
10850                                                   E->getAccessor());
10851 }
10852 
10853 template<typename Derived>
10854 ExprResult
10855 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10856   if (InitListExpr *Syntactic = E->getSyntacticForm())
10857     E = Syntactic;
10858 
10859   bool InitChanged = false;
10860 
10861   EnterExpressionEvaluationContext Context(
10862       getSema(), EnterExpressionEvaluationContext::InitList);
10863 
10864   SmallVector<Expr*, 4> Inits;
10865   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10866                                   Inits, &InitChanged))
10867     return ExprError();
10868 
10869   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10870     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10871     // in some cases. We can't reuse it in general, because the syntactic and
10872     // semantic forms are linked, and we can't know that semantic form will
10873     // match even if the syntactic form does.
10874   }
10875 
10876   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10877                                       E->getRBraceLoc());
10878 }
10879 
10880 template<typename Derived>
10881 ExprResult
10882 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10883   Designation Desig;
10884 
10885   // transform the initializer value
10886   ExprResult Init = getDerived().TransformExpr(E->getInit());
10887   if (Init.isInvalid())
10888     return ExprError();
10889 
10890   // transform the designators.
10891   SmallVector<Expr*, 4> ArrayExprs;
10892   bool ExprChanged = false;
10893   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10894     if (D.isFieldDesignator()) {
10895       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10896                                                D.getDotLoc(),
10897                                                D.getFieldLoc()));
10898       if (D.getField()) {
10899         FieldDecl *Field = cast_or_null<FieldDecl>(
10900             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10901         if (Field != D.getField())
10902           // Rebuild the expression when the transformed FieldDecl is
10903           // different to the already assigned FieldDecl.
10904           ExprChanged = true;
10905       } else {
10906         // Ensure that the designator expression is rebuilt when there isn't
10907         // a resolved FieldDecl in the designator as we don't want to assign
10908         // a FieldDecl to a pattern designator that will be instantiated again.
10909         ExprChanged = true;
10910       }
10911       continue;
10912     }
10913 
10914     if (D.isArrayDesignator()) {
10915       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10916       if (Index.isInvalid())
10917         return ExprError();
10918 
10919       Desig.AddDesignator(
10920           Designator::getArray(Index.get(), D.getLBracketLoc()));
10921 
10922       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10923       ArrayExprs.push_back(Index.get());
10924       continue;
10925     }
10926 
10927     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10928     ExprResult Start
10929       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10930     if (Start.isInvalid())
10931       return ExprError();
10932 
10933     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10934     if (End.isInvalid())
10935       return ExprError();
10936 
10937     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10938                                                   End.get(),
10939                                                   D.getLBracketLoc(),
10940                                                   D.getEllipsisLoc()));
10941 
10942     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10943                   End.get() != E->getArrayRangeEnd(D);
10944 
10945     ArrayExprs.push_back(Start.get());
10946     ArrayExprs.push_back(End.get());
10947   }
10948 
10949   if (!getDerived().AlwaysRebuild() &&
10950       Init.get() == E->getInit() &&
10951       !ExprChanged)
10952     return E;
10953 
10954   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10955                                                 E->getEqualOrColonLoc(),
10956                                                 E->usesGNUSyntax(), Init.get());
10957 }
10958 
10959 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10960 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10961 template<typename Derived>
10962 ExprResult
10963 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10964     DesignatedInitUpdateExpr *E) {
10965   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10966                    "initializer");
10967   return ExprError();
10968 }
10969 
10970 template<typename Derived>
10971 ExprResult
10972 TreeTransform<Derived>::TransformNoInitExpr(
10973     NoInitExpr *E) {
10974   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10975   return ExprError();
10976 }
10977 
10978 template<typename Derived>
10979 ExprResult
10980 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10981   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10982   return ExprError();
10983 }
10984 
10985 template<typename Derived>
10986 ExprResult
10987 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10988   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10989   return ExprError();
10990 }
10991 
10992 template<typename Derived>
10993 ExprResult
10994 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10995                                                      ImplicitValueInitExpr *E) {
10996   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10997 
10998   // FIXME: Will we ever have proper type location here? Will we actually
10999   // need to transform the type?
11000   QualType T = getDerived().TransformType(E->getType());
11001   if (T.isNull())
11002     return ExprError();
11003 
11004   if (!getDerived().AlwaysRebuild() &&
11005       T == E->getType())
11006     return E;
11007 
11008   return getDerived().RebuildImplicitValueInitExpr(T);
11009 }
11010 
11011 template<typename Derived>
11012 ExprResult
11013 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
11014   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
11015   if (!TInfo)
11016     return ExprError();
11017 
11018   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11019   if (SubExpr.isInvalid())
11020     return ExprError();
11021 
11022   if (!getDerived().AlwaysRebuild() &&
11023       TInfo == E->getWrittenTypeInfo() &&
11024       SubExpr.get() == E->getSubExpr())
11025     return E;
11026 
11027   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
11028                                        TInfo, E->getRParenLoc());
11029 }
11030 
11031 template<typename Derived>
11032 ExprResult
11033 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
11034   bool ArgumentChanged = false;
11035   SmallVector<Expr*, 4> Inits;
11036   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
11037                      &ArgumentChanged))
11038     return ExprError();
11039 
11040   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
11041                                            Inits,
11042                                            E->getRParenLoc());
11043 }
11044 
11045 /// Transform an address-of-label expression.
11046 ///
11047 /// By default, the transformation of an address-of-label expression always
11048 /// rebuilds the expression, so that the label identifier can be resolved to
11049 /// the corresponding label statement by semantic analysis.
11050 template<typename Derived>
11051 ExprResult
11052 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11053   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11054                                         E->getLabel());
11055   if (!LD)
11056     return ExprError();
11057 
11058   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11059                                            cast<LabelDecl>(LD));
11060 }
11061 
11062 template<typename Derived>
11063 ExprResult
11064 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11065   SemaRef.ActOnStartStmtExpr();
11066   StmtResult SubStmt
11067     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11068   if (SubStmt.isInvalid()) {
11069     SemaRef.ActOnStmtExprError();
11070     return ExprError();
11071   }
11072 
11073   unsigned OldDepth = E->getTemplateDepth();
11074   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11075 
11076   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11077       SubStmt.get() == E->getSubStmt()) {
11078     // Calling this an 'error' is unintuitive, but it does the right thing.
11079     SemaRef.ActOnStmtExprError();
11080     return SemaRef.MaybeBindToTemporary(E);
11081   }
11082 
11083   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11084                                       E->getRParenLoc(), NewDepth);
11085 }
11086 
11087 template<typename Derived>
11088 ExprResult
11089 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11090   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11091   if (Cond.isInvalid())
11092     return ExprError();
11093 
11094   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11095   if (LHS.isInvalid())
11096     return ExprError();
11097 
11098   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11099   if (RHS.isInvalid())
11100     return ExprError();
11101 
11102   if (!getDerived().AlwaysRebuild() &&
11103       Cond.get() == E->getCond() &&
11104       LHS.get() == E->getLHS() &&
11105       RHS.get() == E->getRHS())
11106     return E;
11107 
11108   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11109                                         Cond.get(), LHS.get(), RHS.get(),
11110                                         E->getRParenLoc());
11111 }
11112 
11113 template<typename Derived>
11114 ExprResult
11115 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11116   return E;
11117 }
11118 
11119 template<typename Derived>
11120 ExprResult
11121 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11122   switch (E->getOperator()) {
11123   case OO_New:
11124   case OO_Delete:
11125   case OO_Array_New:
11126   case OO_Array_Delete:
11127     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11128 
11129   case OO_Call: {
11130     // This is a call to an object's operator().
11131     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11132 
11133     // Transform the object itself.
11134     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11135     if (Object.isInvalid())
11136       return ExprError();
11137 
11138     // FIXME: Poor location information
11139     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11140         static_cast<Expr *>(Object.get())->getEndLoc());
11141 
11142     // Transform the call arguments.
11143     SmallVector<Expr*, 8> Args;
11144     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11145                                     Args))
11146       return ExprError();
11147 
11148     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11149                                         E->getEndLoc());
11150   }
11151 
11152 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11153   case OO_##Name:
11154 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11155 #include "clang/Basic/OperatorKinds.def"
11156   case OO_Subscript:
11157     // Handled below.
11158     break;
11159 
11160   case OO_Conditional:
11161     llvm_unreachable("conditional operator is not actually overloadable");
11162 
11163   case OO_None:
11164   case NUM_OVERLOADED_OPERATORS:
11165     llvm_unreachable("not an overloaded operator?");
11166   }
11167 
11168   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11169   if (Callee.isInvalid())
11170     return ExprError();
11171 
11172   ExprResult First;
11173   if (E->getOperator() == OO_Amp)
11174     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11175   else
11176     First = getDerived().TransformExpr(E->getArg(0));
11177   if (First.isInvalid())
11178     return ExprError();
11179 
11180   ExprResult Second;
11181   if (E->getNumArgs() == 2) {
11182     Second = getDerived().TransformExpr(E->getArg(1));
11183     if (Second.isInvalid())
11184       return ExprError();
11185   }
11186 
11187   if (!getDerived().AlwaysRebuild() &&
11188       Callee.get() == E->getCallee() &&
11189       First.get() == E->getArg(0) &&
11190       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11191     return SemaRef.MaybeBindToTemporary(E);
11192 
11193   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11194   FPOptionsOverride NewOverrides(E->getFPFeatures());
11195   getSema().CurFPFeatures =
11196       NewOverrides.applyOverrides(getSema().getLangOpts());
11197   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11198 
11199   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11200                                                  E->getOperatorLoc(),
11201                                                  Callee.get(),
11202                                                  First.get(),
11203                                                  Second.get());
11204 }
11205 
11206 template<typename Derived>
11207 ExprResult
11208 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11209   return getDerived().TransformCallExpr(E);
11210 }
11211 
11212 template <typename Derived>
11213 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11214   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11215                          getSema().CurContext != E->getParentContext();
11216 
11217   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11218     return E;
11219 
11220   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11221                                            E->getEndLoc(),
11222                                            getSema().CurContext);
11223 }
11224 
11225 template<typename Derived>
11226 ExprResult
11227 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11228   // Transform the callee.
11229   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11230   if (Callee.isInvalid())
11231     return ExprError();
11232 
11233   // Transform exec config.
11234   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11235   if (EC.isInvalid())
11236     return ExprError();
11237 
11238   // Transform arguments.
11239   bool ArgChanged = false;
11240   SmallVector<Expr*, 8> Args;
11241   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11242                                   &ArgChanged))
11243     return ExprError();
11244 
11245   if (!getDerived().AlwaysRebuild() &&
11246       Callee.get() == E->getCallee() &&
11247       !ArgChanged)
11248     return SemaRef.MaybeBindToTemporary(E);
11249 
11250   // FIXME: Wrong source location information for the '('.
11251   SourceLocation FakeLParenLoc
11252     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11253   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11254                                       Args,
11255                                       E->getRParenLoc(), EC.get());
11256 }
11257 
11258 template<typename Derived>
11259 ExprResult
11260 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11261   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11262   if (!Type)
11263     return ExprError();
11264 
11265   ExprResult SubExpr
11266     = getDerived().TransformExpr(E->getSubExprAsWritten());
11267   if (SubExpr.isInvalid())
11268     return ExprError();
11269 
11270   if (!getDerived().AlwaysRebuild() &&
11271       Type == E->getTypeInfoAsWritten() &&
11272       SubExpr.get() == E->getSubExpr())
11273     return E;
11274   return getDerived().RebuildCXXNamedCastExpr(
11275       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11276       Type, E->getAngleBrackets().getEnd(),
11277       // FIXME. this should be '(' location
11278       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11279 }
11280 
11281 template<typename Derived>
11282 ExprResult
11283 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11284   TypeSourceInfo *TSI =
11285       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11286   if (!TSI)
11287     return ExprError();
11288 
11289   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11290   if (Sub.isInvalid())
11291     return ExprError();
11292 
11293   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11294                                                 Sub.get(), BCE->getEndLoc());
11295 }
11296 
11297 template<typename Derived>
11298 ExprResult
11299 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11300   return getDerived().TransformCXXNamedCastExpr(E);
11301 }
11302 
11303 template<typename Derived>
11304 ExprResult
11305 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11306   return getDerived().TransformCXXNamedCastExpr(E);
11307 }
11308 
11309 template<typename Derived>
11310 ExprResult
11311 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11312                                                       CXXReinterpretCastExpr *E) {
11313   return getDerived().TransformCXXNamedCastExpr(E);
11314 }
11315 
11316 template<typename Derived>
11317 ExprResult
11318 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11319   return getDerived().TransformCXXNamedCastExpr(E);
11320 }
11321 
11322 template<typename Derived>
11323 ExprResult
11324 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11325   return getDerived().TransformCXXNamedCastExpr(E);
11326 }
11327 
11328 template<typename Derived>
11329 ExprResult
11330 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11331                                                      CXXFunctionalCastExpr *E) {
11332   TypeSourceInfo *Type =
11333       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11334   if (!Type)
11335     return ExprError();
11336 
11337   ExprResult SubExpr
11338     = getDerived().TransformExpr(E->getSubExprAsWritten());
11339   if (SubExpr.isInvalid())
11340     return ExprError();
11341 
11342   if (!getDerived().AlwaysRebuild() &&
11343       Type == E->getTypeInfoAsWritten() &&
11344       SubExpr.get() == E->getSubExpr())
11345     return E;
11346 
11347   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11348                                                    E->getLParenLoc(),
11349                                                    SubExpr.get(),
11350                                                    E->getRParenLoc(),
11351                                                    E->isListInitialization());
11352 }
11353 
11354 template<typename Derived>
11355 ExprResult
11356 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11357   if (E->isTypeOperand()) {
11358     TypeSourceInfo *TInfo
11359       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11360     if (!TInfo)
11361       return ExprError();
11362 
11363     if (!getDerived().AlwaysRebuild() &&
11364         TInfo == E->getTypeOperandSourceInfo())
11365       return E;
11366 
11367     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11368                                              TInfo, E->getEndLoc());
11369   }
11370 
11371   // We don't know whether the subexpression is potentially evaluated until
11372   // after we perform semantic analysis.  We speculatively assume it is
11373   // unevaluated; it will get fixed later if the subexpression is in fact
11374   // potentially evaluated.
11375   EnterExpressionEvaluationContext Unevaluated(
11376       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11377       Sema::ReuseLambdaContextDecl);
11378 
11379   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11380   if (SubExpr.isInvalid())
11381     return ExprError();
11382 
11383   if (!getDerived().AlwaysRebuild() &&
11384       SubExpr.get() == E->getExprOperand())
11385     return E;
11386 
11387   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11388                                            SubExpr.get(), E->getEndLoc());
11389 }
11390 
11391 template<typename Derived>
11392 ExprResult
11393 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11394   if (E->isTypeOperand()) {
11395     TypeSourceInfo *TInfo
11396       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11397     if (!TInfo)
11398       return ExprError();
11399 
11400     if (!getDerived().AlwaysRebuild() &&
11401         TInfo == E->getTypeOperandSourceInfo())
11402       return E;
11403 
11404     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11405                                              TInfo, E->getEndLoc());
11406   }
11407 
11408   EnterExpressionEvaluationContext Unevaluated(
11409       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11410 
11411   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11412   if (SubExpr.isInvalid())
11413     return ExprError();
11414 
11415   if (!getDerived().AlwaysRebuild() &&
11416       SubExpr.get() == E->getExprOperand())
11417     return E;
11418 
11419   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11420                                            SubExpr.get(), E->getEndLoc());
11421 }
11422 
11423 template<typename Derived>
11424 ExprResult
11425 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11426   return E;
11427 }
11428 
11429 template<typename Derived>
11430 ExprResult
11431 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11432                                                      CXXNullPtrLiteralExpr *E) {
11433   return E;
11434 }
11435 
11436 template<typename Derived>
11437 ExprResult
11438 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11439   QualType T = getSema().getCurrentThisType();
11440 
11441   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11442     // Mark it referenced in the new context regardless.
11443     // FIXME: this is a bit instantiation-specific.
11444     getSema().MarkThisReferenced(E);
11445     return E;
11446   }
11447 
11448   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11449 }
11450 
11451 template<typename Derived>
11452 ExprResult
11453 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11454   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11455   if (SubExpr.isInvalid())
11456     return ExprError();
11457 
11458   if (!getDerived().AlwaysRebuild() &&
11459       SubExpr.get() == E->getSubExpr())
11460     return E;
11461 
11462   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11463                                           E->isThrownVariableInScope());
11464 }
11465 
11466 template<typename Derived>
11467 ExprResult
11468 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11469   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11470       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11471   if (!Param)
11472     return ExprError();
11473 
11474   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11475       E->getUsedContext() == SemaRef.CurContext)
11476     return E;
11477 
11478   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11479 }
11480 
11481 template<typename Derived>
11482 ExprResult
11483 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11484   FieldDecl *Field = cast_or_null<FieldDecl>(
11485       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11486   if (!Field)
11487     return ExprError();
11488 
11489   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11490       E->getUsedContext() == SemaRef.CurContext)
11491     return E;
11492 
11493   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11494 }
11495 
11496 template<typename Derived>
11497 ExprResult
11498 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11499                                                     CXXScalarValueInitExpr *E) {
11500   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11501   if (!T)
11502     return ExprError();
11503 
11504   if (!getDerived().AlwaysRebuild() &&
11505       T == E->getTypeSourceInfo())
11506     return E;
11507 
11508   return getDerived().RebuildCXXScalarValueInitExpr(T,
11509                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11510                                                     E->getRParenLoc());
11511 }
11512 
11513 template<typename Derived>
11514 ExprResult
11515 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11516   // Transform the type that we're allocating
11517   TypeSourceInfo *AllocTypeInfo =
11518       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11519   if (!AllocTypeInfo)
11520     return ExprError();
11521 
11522   // Transform the size of the array we're allocating (if any).
11523   Optional<Expr *> ArraySize;
11524   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11525     ExprResult NewArraySize;
11526     if (*OldArraySize) {
11527       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11528       if (NewArraySize.isInvalid())
11529         return ExprError();
11530     }
11531     ArraySize = NewArraySize.get();
11532   }
11533 
11534   // Transform the placement arguments (if any).
11535   bool ArgumentChanged = false;
11536   SmallVector<Expr*, 8> PlacementArgs;
11537   if (getDerived().TransformExprs(E->getPlacementArgs(),
11538                                   E->getNumPlacementArgs(), true,
11539                                   PlacementArgs, &ArgumentChanged))
11540     return ExprError();
11541 
11542   // Transform the initializer (if any).
11543   Expr *OldInit = E->getInitializer();
11544   ExprResult NewInit;
11545   if (OldInit)
11546     NewInit = getDerived().TransformInitializer(OldInit, true);
11547   if (NewInit.isInvalid())
11548     return ExprError();
11549 
11550   // Transform new operator and delete operator.
11551   FunctionDecl *OperatorNew = nullptr;
11552   if (E->getOperatorNew()) {
11553     OperatorNew = cast_or_null<FunctionDecl>(
11554         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11555     if (!OperatorNew)
11556       return ExprError();
11557   }
11558 
11559   FunctionDecl *OperatorDelete = nullptr;
11560   if (E->getOperatorDelete()) {
11561     OperatorDelete = cast_or_null<FunctionDecl>(
11562         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11563     if (!OperatorDelete)
11564       return ExprError();
11565   }
11566 
11567   if (!getDerived().AlwaysRebuild() &&
11568       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11569       ArraySize == E->getArraySize() &&
11570       NewInit.get() == OldInit &&
11571       OperatorNew == E->getOperatorNew() &&
11572       OperatorDelete == E->getOperatorDelete() &&
11573       !ArgumentChanged) {
11574     // Mark any declarations we need as referenced.
11575     // FIXME: instantiation-specific.
11576     if (OperatorNew)
11577       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11578     if (OperatorDelete)
11579       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11580 
11581     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11582       QualType ElementType
11583         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11584       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11585         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11586         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11587           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11588         }
11589       }
11590     }
11591 
11592     return E;
11593   }
11594 
11595   QualType AllocType = AllocTypeInfo->getType();
11596   if (!ArraySize) {
11597     // If no array size was specified, but the new expression was
11598     // instantiated with an array type (e.g., "new T" where T is
11599     // instantiated with "int[4]"), extract the outer bound from the
11600     // array type as our array size. We do this with constant and
11601     // dependently-sized array types.
11602     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11603     if (!ArrayT) {
11604       // Do nothing
11605     } else if (const ConstantArrayType *ConsArrayT
11606                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11607       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11608                                          SemaRef.Context.getSizeType(),
11609                                          /*FIXME:*/ E->getBeginLoc());
11610       AllocType = ConsArrayT->getElementType();
11611     } else if (const DependentSizedArrayType *DepArrayT
11612                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11613       if (DepArrayT->getSizeExpr()) {
11614         ArraySize = DepArrayT->getSizeExpr();
11615         AllocType = DepArrayT->getElementType();
11616       }
11617     }
11618   }
11619 
11620   return getDerived().RebuildCXXNewExpr(
11621       E->getBeginLoc(), E->isGlobalNew(),
11622       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11623       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11624       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11625 }
11626 
11627 template<typename Derived>
11628 ExprResult
11629 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11630   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11631   if (Operand.isInvalid())
11632     return ExprError();
11633 
11634   // Transform the delete operator, if known.
11635   FunctionDecl *OperatorDelete = nullptr;
11636   if (E->getOperatorDelete()) {
11637     OperatorDelete = cast_or_null<FunctionDecl>(
11638         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11639     if (!OperatorDelete)
11640       return ExprError();
11641   }
11642 
11643   if (!getDerived().AlwaysRebuild() &&
11644       Operand.get() == E->getArgument() &&
11645       OperatorDelete == E->getOperatorDelete()) {
11646     // Mark any declarations we need as referenced.
11647     // FIXME: instantiation-specific.
11648     if (OperatorDelete)
11649       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11650 
11651     if (!E->getArgument()->isTypeDependent()) {
11652       QualType Destroyed = SemaRef.Context.getBaseElementType(
11653                                                          E->getDestroyedType());
11654       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11655         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11656         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11657                                        SemaRef.LookupDestructor(Record));
11658       }
11659     }
11660 
11661     return E;
11662   }
11663 
11664   return getDerived().RebuildCXXDeleteExpr(
11665       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11666 }
11667 
11668 template<typename Derived>
11669 ExprResult
11670 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11671                                                      CXXPseudoDestructorExpr *E) {
11672   ExprResult Base = getDerived().TransformExpr(E->getBase());
11673   if (Base.isInvalid())
11674     return ExprError();
11675 
11676   ParsedType ObjectTypePtr;
11677   bool MayBePseudoDestructor = false;
11678   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11679                                               E->getOperatorLoc(),
11680                                         E->isArrow()? tok::arrow : tok::period,
11681                                               ObjectTypePtr,
11682                                               MayBePseudoDestructor);
11683   if (Base.isInvalid())
11684     return ExprError();
11685 
11686   QualType ObjectType = ObjectTypePtr.get();
11687   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11688   if (QualifierLoc) {
11689     QualifierLoc
11690       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11691     if (!QualifierLoc)
11692       return ExprError();
11693   }
11694   CXXScopeSpec SS;
11695   SS.Adopt(QualifierLoc);
11696 
11697   PseudoDestructorTypeStorage Destroyed;
11698   if (E->getDestroyedTypeInfo()) {
11699     TypeSourceInfo *DestroyedTypeInfo
11700       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11701                                                 ObjectType, nullptr, SS);
11702     if (!DestroyedTypeInfo)
11703       return ExprError();
11704     Destroyed = DestroyedTypeInfo;
11705   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11706     // We aren't likely to be able to resolve the identifier down to a type
11707     // now anyway, so just retain the identifier.
11708     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11709                                             E->getDestroyedTypeLoc());
11710   } else {
11711     // Look for a destructor known with the given name.
11712     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11713                                               *E->getDestroyedTypeIdentifier(),
11714                                                 E->getDestroyedTypeLoc(),
11715                                                 /*Scope=*/nullptr,
11716                                                 SS, ObjectTypePtr,
11717                                                 false);
11718     if (!T)
11719       return ExprError();
11720 
11721     Destroyed
11722       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11723                                                  E->getDestroyedTypeLoc());
11724   }
11725 
11726   TypeSourceInfo *ScopeTypeInfo = nullptr;
11727   if (E->getScopeTypeInfo()) {
11728     CXXScopeSpec EmptySS;
11729     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11730                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11731     if (!ScopeTypeInfo)
11732       return ExprError();
11733   }
11734 
11735   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11736                                                      E->getOperatorLoc(),
11737                                                      E->isArrow(),
11738                                                      SS,
11739                                                      ScopeTypeInfo,
11740                                                      E->getColonColonLoc(),
11741                                                      E->getTildeLoc(),
11742                                                      Destroyed);
11743 }
11744 
11745 template <typename Derived>
11746 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11747                                                         bool RequiresADL,
11748                                                         LookupResult &R) {
11749   // Transform all the decls.
11750   bool AllEmptyPacks = true;
11751   for (auto *OldD : Old->decls()) {
11752     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11753     if (!InstD) {
11754       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11755       // This can happen because of dependent hiding.
11756       if (isa<UsingShadowDecl>(OldD))
11757         continue;
11758       else {
11759         R.clear();
11760         return true;
11761       }
11762     }
11763 
11764     // Expand using pack declarations.
11765     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11766     ArrayRef<NamedDecl*> Decls = SingleDecl;
11767     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11768       Decls = UPD->expansions();
11769 
11770     // Expand using declarations.
11771     for (auto *D : Decls) {
11772       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11773         for (auto *SD : UD->shadows())
11774           R.addDecl(SD);
11775       } else {
11776         R.addDecl(D);
11777       }
11778     }
11779 
11780     AllEmptyPacks &= Decls.empty();
11781   };
11782 
11783   // C++ [temp.res]/8.4.2:
11784   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11785   //   a name in the template definition found a using-declaration, but the
11786   //   lookup in the corresponding scope in the instantiation odoes not find
11787   //   any declarations because the using-declaration was a pack expansion and
11788   //   the corresponding pack is empty
11789   if (AllEmptyPacks && !RequiresADL) {
11790     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11791         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11792     return true;
11793   }
11794 
11795   // Resolve a kind, but don't do any further analysis.  If it's
11796   // ambiguous, the callee needs to deal with it.
11797   R.resolveKind();
11798   return false;
11799 }
11800 
11801 template<typename Derived>
11802 ExprResult
11803 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11804                                                   UnresolvedLookupExpr *Old) {
11805   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11806                  Sema::LookupOrdinaryName);
11807 
11808   // Transform the declaration set.
11809   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11810     return ExprError();
11811 
11812   // Rebuild the nested-name qualifier, if present.
11813   CXXScopeSpec SS;
11814   if (Old->getQualifierLoc()) {
11815     NestedNameSpecifierLoc QualifierLoc
11816       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11817     if (!QualifierLoc)
11818       return ExprError();
11819 
11820     SS.Adopt(QualifierLoc);
11821   }
11822 
11823   if (Old->getNamingClass()) {
11824     CXXRecordDecl *NamingClass
11825       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11826                                                             Old->getNameLoc(),
11827                                                         Old->getNamingClass()));
11828     if (!NamingClass) {
11829       R.clear();
11830       return ExprError();
11831     }
11832 
11833     R.setNamingClass(NamingClass);
11834   }
11835 
11836   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11837 
11838   // If we have neither explicit template arguments, nor the template keyword,
11839   // it's a normal declaration name or member reference.
11840   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11841     NamedDecl *D = R.getAsSingle<NamedDecl>();
11842     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11843     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11844     // give a good diagnostic.
11845     if (D && D->isCXXInstanceMember()) {
11846       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11847                                                      /*TemplateArgs=*/nullptr,
11848                                                      /*Scope=*/nullptr);
11849     }
11850 
11851     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11852   }
11853 
11854   // If we have template arguments, rebuild them, then rebuild the
11855   // templateid expression.
11856   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11857   if (Old->hasExplicitTemplateArgs() &&
11858       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11859                                               Old->getNumTemplateArgs(),
11860                                               TransArgs)) {
11861     R.clear();
11862     return ExprError();
11863   }
11864 
11865   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11866                                             Old->requiresADL(), &TransArgs);
11867 }
11868 
11869 template<typename Derived>
11870 ExprResult
11871 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11872   bool ArgChanged = false;
11873   SmallVector<TypeSourceInfo *, 4> Args;
11874   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11875     TypeSourceInfo *From = E->getArg(I);
11876     TypeLoc FromTL = From->getTypeLoc();
11877     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11878       TypeLocBuilder TLB;
11879       TLB.reserve(FromTL.getFullDataSize());
11880       QualType To = getDerived().TransformType(TLB, FromTL);
11881       if (To.isNull())
11882         return ExprError();
11883 
11884       if (To == From->getType())
11885         Args.push_back(From);
11886       else {
11887         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11888         ArgChanged = true;
11889       }
11890       continue;
11891     }
11892 
11893     ArgChanged = true;
11894 
11895     // We have a pack expansion. Instantiate it.
11896     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11897     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11898     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11899     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11900 
11901     // Determine whether the set of unexpanded parameter packs can and should
11902     // be expanded.
11903     bool Expand = true;
11904     bool RetainExpansion = false;
11905     Optional<unsigned> OrigNumExpansions =
11906         ExpansionTL.getTypePtr()->getNumExpansions();
11907     Optional<unsigned> NumExpansions = OrigNumExpansions;
11908     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11909                                              PatternTL.getSourceRange(),
11910                                              Unexpanded,
11911                                              Expand, RetainExpansion,
11912                                              NumExpansions))
11913       return ExprError();
11914 
11915     if (!Expand) {
11916       // The transform has determined that we should perform a simple
11917       // transformation on the pack expansion, producing another pack
11918       // expansion.
11919       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11920 
11921       TypeLocBuilder TLB;
11922       TLB.reserve(From->getTypeLoc().getFullDataSize());
11923 
11924       QualType To = getDerived().TransformType(TLB, PatternTL);
11925       if (To.isNull())
11926         return ExprError();
11927 
11928       To = getDerived().RebuildPackExpansionType(To,
11929                                                  PatternTL.getSourceRange(),
11930                                                  ExpansionTL.getEllipsisLoc(),
11931                                                  NumExpansions);
11932       if (To.isNull())
11933         return ExprError();
11934 
11935       PackExpansionTypeLoc ToExpansionTL
11936         = TLB.push<PackExpansionTypeLoc>(To);
11937       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11938       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11939       continue;
11940     }
11941 
11942     // Expand the pack expansion by substituting for each argument in the
11943     // pack(s).
11944     for (unsigned I = 0; I != *NumExpansions; ++I) {
11945       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11946       TypeLocBuilder TLB;
11947       TLB.reserve(PatternTL.getFullDataSize());
11948       QualType To = getDerived().TransformType(TLB, PatternTL);
11949       if (To.isNull())
11950         return ExprError();
11951 
11952       if (To->containsUnexpandedParameterPack()) {
11953         To = getDerived().RebuildPackExpansionType(To,
11954                                                    PatternTL.getSourceRange(),
11955                                                    ExpansionTL.getEllipsisLoc(),
11956                                                    NumExpansions);
11957         if (To.isNull())
11958           return ExprError();
11959 
11960         PackExpansionTypeLoc ToExpansionTL
11961           = TLB.push<PackExpansionTypeLoc>(To);
11962         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11963       }
11964 
11965       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11966     }
11967 
11968     if (!RetainExpansion)
11969       continue;
11970 
11971     // If we're supposed to retain a pack expansion, do so by temporarily
11972     // forgetting the partially-substituted parameter pack.
11973     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11974 
11975     TypeLocBuilder TLB;
11976     TLB.reserve(From->getTypeLoc().getFullDataSize());
11977 
11978     QualType To = getDerived().TransformType(TLB, PatternTL);
11979     if (To.isNull())
11980       return ExprError();
11981 
11982     To = getDerived().RebuildPackExpansionType(To,
11983                                                PatternTL.getSourceRange(),
11984                                                ExpansionTL.getEllipsisLoc(),
11985                                                NumExpansions);
11986     if (To.isNull())
11987       return ExprError();
11988 
11989     PackExpansionTypeLoc ToExpansionTL
11990       = TLB.push<PackExpansionTypeLoc>(To);
11991     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11992     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11993   }
11994 
11995   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11996     return E;
11997 
11998   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11999                                        E->getEndLoc());
12000 }
12001 
12002 template<typename Derived>
12003 ExprResult
12004 TreeTransform<Derived>::TransformConceptSpecializationExpr(
12005                                                  ConceptSpecializationExpr *E) {
12006   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
12007   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
12008   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12009                                               Old->NumTemplateArgs, TransArgs))
12010     return ExprError();
12011 
12012   return getDerived().RebuildConceptSpecializationExpr(
12013       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
12014       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
12015       &TransArgs);
12016 }
12017 
12018 template<typename Derived>
12019 ExprResult
12020 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
12021   SmallVector<ParmVarDecl*, 4> TransParams;
12022   SmallVector<QualType, 4> TransParamTypes;
12023   Sema::ExtParameterInfoBuilder ExtParamInfos;
12024 
12025   // C++2a [expr.prim.req]p2
12026   // Expressions appearing within a requirement-body are unevaluated operands.
12027   EnterExpressionEvaluationContext Ctx(
12028       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12029 
12030   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
12031       getSema().Context, getSema().CurContext,
12032       E->getBody()->getBeginLoc());
12033 
12034   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
12035 
12036   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
12037                                                E->getLocalParameters(),
12038                                                /*ParamTypes=*/nullptr,
12039                                                /*ParamInfos=*/nullptr,
12040                                                TransParamTypes, &TransParams,
12041                                                ExtParamInfos))
12042     return ExprError();
12043 
12044   for (ParmVarDecl *Param : TransParams)
12045     Param->setDeclContext(Body);
12046 
12047   SmallVector<concepts::Requirement *, 4> TransReqs;
12048   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12049                                                      TransReqs))
12050     return ExprError();
12051 
12052   for (concepts::Requirement *Req : TransReqs) {
12053     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12054       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12055         ER->getReturnTypeRequirement()
12056                 .getTypeConstraintTemplateParameterList()->getParam(0)
12057                 ->setDeclContext(Body);
12058       }
12059     }
12060   }
12061 
12062   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12063                                           TransParams, TransReqs,
12064                                           E->getRBraceLoc());
12065 }
12066 
12067 template<typename Derived>
12068 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12069     ArrayRef<concepts::Requirement *> Reqs,
12070     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12071   for (concepts::Requirement *Req : Reqs) {
12072     concepts::Requirement *TransReq = nullptr;
12073     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12074       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12075     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12076       TransReq = getDerived().TransformExprRequirement(ExprReq);
12077     else
12078       TransReq = getDerived().TransformNestedRequirement(
12079                      cast<concepts::NestedRequirement>(Req));
12080     if (!TransReq)
12081       return true;
12082     Transformed.push_back(TransReq);
12083   }
12084   return false;
12085 }
12086 
12087 template<typename Derived>
12088 concepts::TypeRequirement *
12089 TreeTransform<Derived>::TransformTypeRequirement(
12090     concepts::TypeRequirement *Req) {
12091   if (Req->isSubstitutionFailure()) {
12092     if (getDerived().AlwaysRebuild())
12093       return getDerived().RebuildTypeRequirement(
12094               Req->getSubstitutionDiagnostic());
12095     return Req;
12096   }
12097   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12098   if (!TransType)
12099     return nullptr;
12100   return getDerived().RebuildTypeRequirement(TransType);
12101 }
12102 
12103 template<typename Derived>
12104 concepts::ExprRequirement *
12105 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12106   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12107   if (Req->isExprSubstitutionFailure())
12108     TransExpr = Req->getExprSubstitutionDiagnostic();
12109   else {
12110     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12111     if (TransExprRes.isInvalid())
12112       return nullptr;
12113     TransExpr = TransExprRes.get();
12114   }
12115 
12116   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12117   const auto &RetReq = Req->getReturnTypeRequirement();
12118   if (RetReq.isEmpty())
12119     TransRetReq.emplace();
12120   else if (RetReq.isSubstitutionFailure())
12121     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12122   else if (RetReq.isTypeConstraint()) {
12123     TemplateParameterList *OrigTPL =
12124         RetReq.getTypeConstraintTemplateParameterList();
12125     TemplateParameterList *TPL =
12126         getDerived().TransformTemplateParameterList(OrigTPL);
12127     if (!TPL)
12128       return nullptr;
12129     TransRetReq.emplace(TPL);
12130   }
12131   assert(TransRetReq.hasValue() &&
12132          "All code paths leading here must set TransRetReq");
12133   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12134     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12135                                                Req->getNoexceptLoc(),
12136                                                std::move(*TransRetReq));
12137   return getDerived().RebuildExprRequirement(
12138       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12139       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12140 }
12141 
12142 template<typename Derived>
12143 concepts::NestedRequirement *
12144 TreeTransform<Derived>::TransformNestedRequirement(
12145     concepts::NestedRequirement *Req) {
12146   if (Req->isSubstitutionFailure()) {
12147     if (getDerived().AlwaysRebuild())
12148       return getDerived().RebuildNestedRequirement(
12149           Req->getSubstitutionDiagnostic());
12150     return Req;
12151   }
12152   ExprResult TransConstraint =
12153       getDerived().TransformExpr(Req->getConstraintExpr());
12154   if (TransConstraint.isInvalid())
12155     return nullptr;
12156   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12157 }
12158 
12159 template<typename Derived>
12160 ExprResult
12161 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12162   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12163   if (!T)
12164     return ExprError();
12165 
12166   if (!getDerived().AlwaysRebuild() &&
12167       T == E->getQueriedTypeSourceInfo())
12168     return E;
12169 
12170   ExprResult SubExpr;
12171   {
12172     EnterExpressionEvaluationContext Unevaluated(
12173         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12174     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12175     if (SubExpr.isInvalid())
12176       return ExprError();
12177 
12178     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12179       return E;
12180   }
12181 
12182   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12183                                             SubExpr.get(), E->getEndLoc());
12184 }
12185 
12186 template<typename Derived>
12187 ExprResult
12188 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12189   ExprResult SubExpr;
12190   {
12191     EnterExpressionEvaluationContext Unevaluated(
12192         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12193     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12194     if (SubExpr.isInvalid())
12195       return ExprError();
12196 
12197     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12198       return E;
12199   }
12200 
12201   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12202                                              SubExpr.get(), E->getEndLoc());
12203 }
12204 
12205 template <typename Derived>
12206 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12207     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12208     TypeSourceInfo **RecoveryTSI) {
12209   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12210       DRE, AddrTaken, RecoveryTSI);
12211 
12212   // Propagate both errors and recovered types, which return ExprEmpty.
12213   if (!NewDRE.isUsable())
12214     return NewDRE;
12215 
12216   // We got an expr, wrap it up in parens.
12217   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12218     return PE;
12219   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12220                                        PE->getRParen());
12221 }
12222 
12223 template <typename Derived>
12224 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12225     DependentScopeDeclRefExpr *E) {
12226   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12227                                             nullptr);
12228 }
12229 
12230 template<typename Derived>
12231 ExprResult
12232 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12233                                                DependentScopeDeclRefExpr *E,
12234                                                bool IsAddressOfOperand,
12235                                                TypeSourceInfo **RecoveryTSI) {
12236   assert(E->getQualifierLoc());
12237   NestedNameSpecifierLoc QualifierLoc
12238   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12239   if (!QualifierLoc)
12240     return ExprError();
12241   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12242 
12243   // TODO: If this is a conversion-function-id, verify that the
12244   // destination type name (if present) resolves the same way after
12245   // instantiation as it did in the local scope.
12246 
12247   DeclarationNameInfo NameInfo
12248     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12249   if (!NameInfo.getName())
12250     return ExprError();
12251 
12252   if (!E->hasExplicitTemplateArgs()) {
12253     if (!getDerived().AlwaysRebuild() &&
12254         QualifierLoc == E->getQualifierLoc() &&
12255         // Note: it is sufficient to compare the Name component of NameInfo:
12256         // if name has not changed, DNLoc has not changed either.
12257         NameInfo.getName() == E->getDeclName())
12258       return E;
12259 
12260     return getDerived().RebuildDependentScopeDeclRefExpr(
12261         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12262         IsAddressOfOperand, RecoveryTSI);
12263   }
12264 
12265   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12266   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12267                                               E->getNumTemplateArgs(),
12268                                               TransArgs))
12269     return ExprError();
12270 
12271   return getDerived().RebuildDependentScopeDeclRefExpr(
12272       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12273       RecoveryTSI);
12274 }
12275 
12276 template<typename Derived>
12277 ExprResult
12278 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12279   // CXXConstructExprs other than for list-initialization and
12280   // CXXTemporaryObjectExpr are always implicit, so when we have
12281   // a 1-argument construction we just transform that argument.
12282   if (getDerived().AllowSkippingCXXConstructExpr() &&
12283       ((E->getNumArgs() == 1 ||
12284         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12285        (!getDerived().DropCallArgument(E->getArg(0))) &&
12286        !E->isListInitialization()))
12287     return getDerived().TransformInitializer(E->getArg(0),
12288                                              /*DirectInit*/ false);
12289 
12290   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12291 
12292   QualType T = getDerived().TransformType(E->getType());
12293   if (T.isNull())
12294     return ExprError();
12295 
12296   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12297       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12298   if (!Constructor)
12299     return ExprError();
12300 
12301   bool ArgumentChanged = false;
12302   SmallVector<Expr*, 8> Args;
12303   {
12304     EnterExpressionEvaluationContext Context(
12305         getSema(), EnterExpressionEvaluationContext::InitList,
12306         E->isListInitialization());
12307     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12308                                     &ArgumentChanged))
12309       return ExprError();
12310   }
12311 
12312   if (!getDerived().AlwaysRebuild() &&
12313       T == E->getType() &&
12314       Constructor == E->getConstructor() &&
12315       !ArgumentChanged) {
12316     // Mark the constructor as referenced.
12317     // FIXME: Instantiation-specific
12318     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12319     return E;
12320   }
12321 
12322   return getDerived().RebuildCXXConstructExpr(
12323       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12324       E->hadMultipleCandidates(), E->isListInitialization(),
12325       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12326       E->getConstructionKind(), E->getParenOrBraceRange());
12327 }
12328 
12329 template<typename Derived>
12330 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12331     CXXInheritedCtorInitExpr *E) {
12332   QualType T = getDerived().TransformType(E->getType());
12333   if (T.isNull())
12334     return ExprError();
12335 
12336   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12337       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12338   if (!Constructor)
12339     return ExprError();
12340 
12341   if (!getDerived().AlwaysRebuild() &&
12342       T == E->getType() &&
12343       Constructor == E->getConstructor()) {
12344     // Mark the constructor as referenced.
12345     // FIXME: Instantiation-specific
12346     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12347     return E;
12348   }
12349 
12350   return getDerived().RebuildCXXInheritedCtorInitExpr(
12351       T, E->getLocation(), Constructor,
12352       E->constructsVBase(), E->inheritedFromVBase());
12353 }
12354 
12355 /// Transform a C++ temporary-binding expression.
12356 ///
12357 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12358 /// transform the subexpression and return that.
12359 template<typename Derived>
12360 ExprResult
12361 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12362   return getDerived().TransformExpr(E->getSubExpr());
12363 }
12364 
12365 /// Transform a C++ expression that contains cleanups that should
12366 /// be run after the expression is evaluated.
12367 ///
12368 /// Since ExprWithCleanups nodes are implicitly generated, we
12369 /// just transform the subexpression and return that.
12370 template<typename Derived>
12371 ExprResult
12372 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12373   return getDerived().TransformExpr(E->getSubExpr());
12374 }
12375 
12376 template<typename Derived>
12377 ExprResult
12378 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12379                                                     CXXTemporaryObjectExpr *E) {
12380   TypeSourceInfo *T =
12381       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12382   if (!T)
12383     return ExprError();
12384 
12385   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12386       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12387   if (!Constructor)
12388     return ExprError();
12389 
12390   bool ArgumentChanged = false;
12391   SmallVector<Expr*, 8> Args;
12392   Args.reserve(E->getNumArgs());
12393   {
12394     EnterExpressionEvaluationContext Context(
12395         getSema(), EnterExpressionEvaluationContext::InitList,
12396         E->isListInitialization());
12397     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12398                        &ArgumentChanged))
12399       return ExprError();
12400   }
12401 
12402   if (!getDerived().AlwaysRebuild() &&
12403       T == E->getTypeSourceInfo() &&
12404       Constructor == E->getConstructor() &&
12405       !ArgumentChanged) {
12406     // FIXME: Instantiation-specific
12407     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12408     return SemaRef.MaybeBindToTemporary(E);
12409   }
12410 
12411   // FIXME: We should just pass E->isListInitialization(), but we're not
12412   // prepared to handle list-initialization without a child InitListExpr.
12413   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12414   return getDerived().RebuildCXXTemporaryObjectExpr(
12415       T, LParenLoc, Args, E->getEndLoc(),
12416       /*ListInitialization=*/LParenLoc.isInvalid());
12417 }
12418 
12419 template<typename Derived>
12420 ExprResult
12421 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12422   // Transform any init-capture expressions before entering the scope of the
12423   // lambda body, because they are not semantically within that scope.
12424   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12425   struct TransformedInitCapture {
12426     // The location of the ... if the result is retaining a pack expansion.
12427     SourceLocation EllipsisLoc;
12428     // Zero or more expansions of the init-capture.
12429     SmallVector<InitCaptureInfoTy, 4> Expansions;
12430   };
12431   SmallVector<TransformedInitCapture, 4> InitCaptures;
12432   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12433   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12434                                     CEnd = E->capture_end();
12435        C != CEnd; ++C) {
12436     if (!E->isInitCapture(C))
12437       continue;
12438 
12439     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12440     VarDecl *OldVD = C->getCapturedVar();
12441 
12442     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12443                                 Optional<unsigned> NumExpansions) {
12444       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12445           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12446 
12447       if (NewExprInitResult.isInvalid()) {
12448         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12449         return;
12450       }
12451       Expr *NewExprInit = NewExprInitResult.get();
12452 
12453       QualType NewInitCaptureType =
12454           getSema().buildLambdaInitCaptureInitialization(
12455               C->getLocation(), OldVD->getType()->isReferenceType(),
12456               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12457               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12458               NewExprInit);
12459       Result.Expansions.push_back(
12460           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12461     };
12462 
12463     // If this is an init-capture pack, consider expanding the pack now.
12464     if (OldVD->isParameterPack()) {
12465       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12466                                              ->getTypeLoc()
12467                                              .castAs<PackExpansionTypeLoc>();
12468       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12469       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12470 
12471       // Determine whether the set of unexpanded parameter packs can and should
12472       // be expanded.
12473       bool Expand = true;
12474       bool RetainExpansion = false;
12475       Optional<unsigned> OrigNumExpansions =
12476           ExpansionTL.getTypePtr()->getNumExpansions();
12477       Optional<unsigned> NumExpansions = OrigNumExpansions;
12478       if (getDerived().TryExpandParameterPacks(
12479               ExpansionTL.getEllipsisLoc(),
12480               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12481               RetainExpansion, NumExpansions))
12482         return ExprError();
12483       if (Expand) {
12484         for (unsigned I = 0; I != *NumExpansions; ++I) {
12485           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12486           SubstInitCapture(SourceLocation(), None);
12487         }
12488       }
12489       if (!Expand || RetainExpansion) {
12490         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12491         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12492         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12493       }
12494     } else {
12495       SubstInitCapture(SourceLocation(), None);
12496     }
12497   }
12498 
12499   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12500   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12501 
12502   // Transform the template parameters, and add them to the current
12503   // instantiation scope. The null case is handled correctly.
12504   auto TPL = getDerived().TransformTemplateParameterList(
12505       E->getTemplateParameterList());
12506   LSI->GLTemplateParameterList = TPL;
12507 
12508   // Transform the type of the original lambda's call operator.
12509   // The transformation MUST be done in the CurrentInstantiationScope since
12510   // it introduces a mapping of the original to the newly created
12511   // transformed parameters.
12512   TypeSourceInfo *NewCallOpTSI = nullptr;
12513   {
12514     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12515     FunctionProtoTypeLoc OldCallOpFPTL =
12516         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12517 
12518     TypeLocBuilder NewCallOpTLBuilder;
12519     SmallVector<QualType, 4> ExceptionStorage;
12520     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12521     QualType NewCallOpType = TransformFunctionProtoType(
12522         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12523         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12524           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12525                                               ExceptionStorage, Changed);
12526         });
12527     if (NewCallOpType.isNull())
12528       return ExprError();
12529     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12530                                                         NewCallOpType);
12531   }
12532 
12533   // Transform the trailing requires clause
12534   ExprResult NewTrailingRequiresClause;
12535   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12536     // FIXME: Concepts: Substitution into requires clause should only happen
12537     //                  when checking satisfaction.
12538     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12539 
12540   // Create the local class that will describe the lambda.
12541   // FIXME: KnownDependent below is wrong when substituting inside a templated
12542   // context that isn't a DeclContext (such as a variable template).
12543   CXXRecordDecl *OldClass = E->getLambdaClass();
12544   CXXRecordDecl *Class
12545     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12546                                         NewCallOpTSI,
12547                                         /*KnownDependent=*/false,
12548                                         E->getCaptureDefault());
12549   getDerived().transformedLocalDecl(OldClass, {Class});
12550 
12551   Optional<std::tuple<bool, unsigned, unsigned, Decl *>> Mangling;
12552   if (getDerived().ReplacingOriginal())
12553     Mangling = std::make_tuple(OldClass->hasKnownLambdaInternalLinkage(),
12554                                OldClass->getLambdaManglingNumber(),
12555                                OldClass->getDeviceLambdaManglingNumber(),
12556                                OldClass->getLambdaContextDecl());
12557 
12558   // Build the call operator.
12559   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12560       Class, E->getIntroducerRange(), NewCallOpTSI,
12561       E->getCallOperator()->getEndLoc(),
12562       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12563       E->getCallOperator()->getConstexprKind(),
12564       NewTrailingRequiresClause.get());
12565 
12566   LSI->CallOperator = NewCallOperator;
12567 
12568   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12569   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12570 
12571   // Number the lambda for linkage purposes if necessary.
12572   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12573 
12574   // Introduce the context of the call operator.
12575   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12576                                  /*NewThisContext*/false);
12577 
12578   // Enter the scope of the lambda.
12579   getSema().buildLambdaScope(LSI, NewCallOperator,
12580                              E->getIntroducerRange(),
12581                              E->getCaptureDefault(),
12582                              E->getCaptureDefaultLoc(),
12583                              E->hasExplicitParameters(),
12584                              E->hasExplicitResultType(),
12585                              E->isMutable());
12586 
12587   bool Invalid = false;
12588 
12589   // Transform captures.
12590   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12591                                  CEnd = E->capture_end();
12592        C != CEnd; ++C) {
12593     // When we hit the first implicit capture, tell Sema that we've finished
12594     // the list of explicit captures.
12595     if (C->isImplicit())
12596       break;
12597 
12598     // Capturing 'this' is trivial.
12599     if (C->capturesThis()) {
12600       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12601                                     /*BuildAndDiagnose*/ true, nullptr,
12602                                     C->getCaptureKind() == LCK_StarThis);
12603       continue;
12604     }
12605     // Captured expression will be recaptured during captured variables
12606     // rebuilding.
12607     if (C->capturesVLAType())
12608       continue;
12609 
12610     // Rebuild init-captures, including the implied field declaration.
12611     if (E->isInitCapture(C)) {
12612       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12613 
12614       VarDecl *OldVD = C->getCapturedVar();
12615       llvm::SmallVector<Decl*, 4> NewVDs;
12616 
12617       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12618         ExprResult Init = Info.first;
12619         QualType InitQualType = Info.second;
12620         if (Init.isInvalid() || InitQualType.isNull()) {
12621           Invalid = true;
12622           break;
12623         }
12624         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12625             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12626             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12627         if (!NewVD) {
12628           Invalid = true;
12629           break;
12630         }
12631         NewVDs.push_back(NewVD);
12632         getSema().addInitCapture(LSI, NewVD);
12633       }
12634 
12635       if (Invalid)
12636         break;
12637 
12638       getDerived().transformedLocalDecl(OldVD, NewVDs);
12639       continue;
12640     }
12641 
12642     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12643 
12644     // Determine the capture kind for Sema.
12645     Sema::TryCaptureKind Kind
12646       = C->isImplicit()? Sema::TryCapture_Implicit
12647                        : C->getCaptureKind() == LCK_ByCopy
12648                            ? Sema::TryCapture_ExplicitByVal
12649                            : Sema::TryCapture_ExplicitByRef;
12650     SourceLocation EllipsisLoc;
12651     if (C->isPackExpansion()) {
12652       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12653       bool ShouldExpand = false;
12654       bool RetainExpansion = false;
12655       Optional<unsigned> NumExpansions;
12656       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12657                                                C->getLocation(),
12658                                                Unexpanded,
12659                                                ShouldExpand, RetainExpansion,
12660                                                NumExpansions)) {
12661         Invalid = true;
12662         continue;
12663       }
12664 
12665       if (ShouldExpand) {
12666         // The transform has determined that we should perform an expansion;
12667         // transform and capture each of the arguments.
12668         // expansion of the pattern. Do so.
12669         VarDecl *Pack = C->getCapturedVar();
12670         for (unsigned I = 0; I != *NumExpansions; ++I) {
12671           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12672           VarDecl *CapturedVar
12673             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12674                                                                Pack));
12675           if (!CapturedVar) {
12676             Invalid = true;
12677             continue;
12678           }
12679 
12680           // Capture the transformed variable.
12681           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12682         }
12683 
12684         // FIXME: Retain a pack expansion if RetainExpansion is true.
12685 
12686         continue;
12687       }
12688 
12689       EllipsisLoc = C->getEllipsisLoc();
12690     }
12691 
12692     // Transform the captured variable.
12693     VarDecl *CapturedVar
12694       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12695                                                          C->getCapturedVar()));
12696     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12697       Invalid = true;
12698       continue;
12699     }
12700 
12701     // Capture the transformed variable.
12702     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12703                                  EllipsisLoc);
12704   }
12705   getSema().finishLambdaExplicitCaptures(LSI);
12706 
12707   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12708   // evaluation context even if we're not transforming the function body.
12709   getSema().PushExpressionEvaluationContext(
12710       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12711 
12712   // Instantiate the body of the lambda expression.
12713   StmtResult Body =
12714       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12715 
12716   // ActOnLambda* will pop the function scope for us.
12717   FuncScopeCleanup.disable();
12718 
12719   if (Body.isInvalid()) {
12720     SavedContext.pop();
12721     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12722                                /*IsInstantiation=*/true);
12723     return ExprError();
12724   }
12725 
12726   // Copy the LSI before ActOnFinishFunctionBody removes it.
12727   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12728   // the call operator.
12729   auto LSICopy = *LSI;
12730   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12731                                     /*IsInstantiation*/ true);
12732   SavedContext.pop();
12733 
12734   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12735                                    &LSICopy);
12736 }
12737 
12738 template<typename Derived>
12739 StmtResult
12740 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12741   return TransformStmt(S);
12742 }
12743 
12744 template<typename Derived>
12745 StmtResult
12746 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12747   // Transform captures.
12748   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12749                                  CEnd = E->capture_end();
12750        C != CEnd; ++C) {
12751     // When we hit the first implicit capture, tell Sema that we've finished
12752     // the list of explicit captures.
12753     if (!C->isImplicit())
12754       continue;
12755 
12756     // Capturing 'this' is trivial.
12757     if (C->capturesThis()) {
12758       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12759                                     /*BuildAndDiagnose*/ true, nullptr,
12760                                     C->getCaptureKind() == LCK_StarThis);
12761       continue;
12762     }
12763     // Captured expression will be recaptured during captured variables
12764     // rebuilding.
12765     if (C->capturesVLAType())
12766       continue;
12767 
12768     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12769     assert(!E->isInitCapture(C) && "implicit init-capture?");
12770 
12771     // Transform the captured variable.
12772     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12773         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12774     if (!CapturedVar || CapturedVar->isInvalidDecl())
12775       return StmtError();
12776 
12777     // Capture the transformed variable.
12778     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12779   }
12780 
12781   return S;
12782 }
12783 
12784 template<typename Derived>
12785 ExprResult
12786 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12787                                                   CXXUnresolvedConstructExpr *E) {
12788   TypeSourceInfo *T =
12789       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12790   if (!T)
12791     return ExprError();
12792 
12793   bool ArgumentChanged = false;
12794   SmallVector<Expr*, 8> Args;
12795   Args.reserve(E->getNumArgs());
12796   {
12797     EnterExpressionEvaluationContext Context(
12798         getSema(), EnterExpressionEvaluationContext::InitList,
12799         E->isListInitialization());
12800     if (getDerived().TransformExprs(E->arg_begin(), E->getNumArgs(), true, Args,
12801                                     &ArgumentChanged))
12802       return ExprError();
12803   }
12804 
12805   if (!getDerived().AlwaysRebuild() &&
12806       T == E->getTypeSourceInfo() &&
12807       !ArgumentChanged)
12808     return E;
12809 
12810   // FIXME: we're faking the locations of the commas
12811   return getDerived().RebuildCXXUnresolvedConstructExpr(
12812       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12813 }
12814 
12815 template<typename Derived>
12816 ExprResult
12817 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12818                                              CXXDependentScopeMemberExpr *E) {
12819   // Transform the base of the expression.
12820   ExprResult Base((Expr*) nullptr);
12821   Expr *OldBase;
12822   QualType BaseType;
12823   QualType ObjectType;
12824   if (!E->isImplicitAccess()) {
12825     OldBase = E->getBase();
12826     Base = getDerived().TransformExpr(OldBase);
12827     if (Base.isInvalid())
12828       return ExprError();
12829 
12830     // Start the member reference and compute the object's type.
12831     ParsedType ObjectTy;
12832     bool MayBePseudoDestructor = false;
12833     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12834                                                 E->getOperatorLoc(),
12835                                       E->isArrow()? tok::arrow : tok::period,
12836                                                 ObjectTy,
12837                                                 MayBePseudoDestructor);
12838     if (Base.isInvalid())
12839       return ExprError();
12840 
12841     ObjectType = ObjectTy.get();
12842     BaseType = ((Expr*) Base.get())->getType();
12843   } else {
12844     OldBase = nullptr;
12845     BaseType = getDerived().TransformType(E->getBaseType());
12846     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12847   }
12848 
12849   // Transform the first part of the nested-name-specifier that qualifies
12850   // the member name.
12851   NamedDecl *FirstQualifierInScope
12852     = getDerived().TransformFirstQualifierInScope(
12853                                             E->getFirstQualifierFoundInScope(),
12854                                             E->getQualifierLoc().getBeginLoc());
12855 
12856   NestedNameSpecifierLoc QualifierLoc;
12857   if (E->getQualifier()) {
12858     QualifierLoc
12859       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12860                                                      ObjectType,
12861                                                      FirstQualifierInScope);
12862     if (!QualifierLoc)
12863       return ExprError();
12864   }
12865 
12866   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12867 
12868   // TODO: If this is a conversion-function-id, verify that the
12869   // destination type name (if present) resolves the same way after
12870   // instantiation as it did in the local scope.
12871 
12872   DeclarationNameInfo NameInfo
12873     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12874   if (!NameInfo.getName())
12875     return ExprError();
12876 
12877   if (!E->hasExplicitTemplateArgs()) {
12878     // This is a reference to a member without an explicitly-specified
12879     // template argument list. Optimize for this common case.
12880     if (!getDerived().AlwaysRebuild() &&
12881         Base.get() == OldBase &&
12882         BaseType == E->getBaseType() &&
12883         QualifierLoc == E->getQualifierLoc() &&
12884         NameInfo.getName() == E->getMember() &&
12885         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12886       return E;
12887 
12888     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12889                                                        BaseType,
12890                                                        E->isArrow(),
12891                                                        E->getOperatorLoc(),
12892                                                        QualifierLoc,
12893                                                        TemplateKWLoc,
12894                                                        FirstQualifierInScope,
12895                                                        NameInfo,
12896                                                        /*TemplateArgs*/nullptr);
12897   }
12898 
12899   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12900   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12901                                               E->getNumTemplateArgs(),
12902                                               TransArgs))
12903     return ExprError();
12904 
12905   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12906                                                      BaseType,
12907                                                      E->isArrow(),
12908                                                      E->getOperatorLoc(),
12909                                                      QualifierLoc,
12910                                                      TemplateKWLoc,
12911                                                      FirstQualifierInScope,
12912                                                      NameInfo,
12913                                                      &TransArgs);
12914 }
12915 
12916 template<typename Derived>
12917 ExprResult
12918 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12919   // Transform the base of the expression.
12920   ExprResult Base((Expr*) nullptr);
12921   QualType BaseType;
12922   if (!Old->isImplicitAccess()) {
12923     Base = getDerived().TransformExpr(Old->getBase());
12924     if (Base.isInvalid())
12925       return ExprError();
12926     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12927                                                      Old->isArrow());
12928     if (Base.isInvalid())
12929       return ExprError();
12930     BaseType = Base.get()->getType();
12931   } else {
12932     BaseType = getDerived().TransformType(Old->getBaseType());
12933   }
12934 
12935   NestedNameSpecifierLoc QualifierLoc;
12936   if (Old->getQualifierLoc()) {
12937     QualifierLoc
12938     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12939     if (!QualifierLoc)
12940       return ExprError();
12941   }
12942 
12943   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12944 
12945   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12946                  Sema::LookupOrdinaryName);
12947 
12948   // Transform the declaration set.
12949   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12950     return ExprError();
12951 
12952   // Determine the naming class.
12953   if (Old->getNamingClass()) {
12954     CXXRecordDecl *NamingClass
12955       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12956                                                           Old->getMemberLoc(),
12957                                                         Old->getNamingClass()));
12958     if (!NamingClass)
12959       return ExprError();
12960 
12961     R.setNamingClass(NamingClass);
12962   }
12963 
12964   TemplateArgumentListInfo TransArgs;
12965   if (Old->hasExplicitTemplateArgs()) {
12966     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12967     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12968     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12969                                                 Old->getNumTemplateArgs(),
12970                                                 TransArgs))
12971       return ExprError();
12972   }
12973 
12974   // FIXME: to do this check properly, we will need to preserve the
12975   // first-qualifier-in-scope here, just in case we had a dependent
12976   // base (and therefore couldn't do the check) and a
12977   // nested-name-qualifier (and therefore could do the lookup).
12978   NamedDecl *FirstQualifierInScope = nullptr;
12979 
12980   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12981                                                   BaseType,
12982                                                   Old->getOperatorLoc(),
12983                                                   Old->isArrow(),
12984                                                   QualifierLoc,
12985                                                   TemplateKWLoc,
12986                                                   FirstQualifierInScope,
12987                                                   R,
12988                                               (Old->hasExplicitTemplateArgs()
12989                                                   ? &TransArgs : nullptr));
12990 }
12991 
12992 template<typename Derived>
12993 ExprResult
12994 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12995   EnterExpressionEvaluationContext Unevaluated(
12996       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12997   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12998   if (SubExpr.isInvalid())
12999     return ExprError();
13000 
13001   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
13002     return E;
13003 
13004   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
13005 }
13006 
13007 template<typename Derived>
13008 ExprResult
13009 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
13010   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
13011   if (Pattern.isInvalid())
13012     return ExprError();
13013 
13014   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
13015     return E;
13016 
13017   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
13018                                            E->getNumExpansions());
13019 }
13020 
13021 template<typename Derived>
13022 ExprResult
13023 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
13024   // If E is not value-dependent, then nothing will change when we transform it.
13025   // Note: This is an instantiation-centric view.
13026   if (!E->isValueDependent())
13027     return E;
13028 
13029   EnterExpressionEvaluationContext Unevaluated(
13030       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
13031 
13032   ArrayRef<TemplateArgument> PackArgs;
13033   TemplateArgument ArgStorage;
13034 
13035   // Find the argument list to transform.
13036   if (E->isPartiallySubstituted()) {
13037     PackArgs = E->getPartialArguments();
13038   } else if (E->isValueDependent()) {
13039     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
13040     bool ShouldExpand = false;
13041     bool RetainExpansion = false;
13042     Optional<unsigned> NumExpansions;
13043     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
13044                                              Unexpanded,
13045                                              ShouldExpand, RetainExpansion,
13046                                              NumExpansions))
13047       return ExprError();
13048 
13049     // If we need to expand the pack, build a template argument from it and
13050     // expand that.
13051     if (ShouldExpand) {
13052       auto *Pack = E->getPack();
13053       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13054         ArgStorage = getSema().Context.getPackExpansionType(
13055             getSema().Context.getTypeDeclType(TTPD), None);
13056       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13057         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13058       } else {
13059         auto *VD = cast<ValueDecl>(Pack);
13060         ExprResult DRE = getSema().BuildDeclRefExpr(
13061             VD, VD->getType().getNonLValueExprType(getSema().Context),
13062             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13063             E->getPackLoc());
13064         if (DRE.isInvalid())
13065           return ExprError();
13066         ArgStorage = new (getSema().Context) PackExpansionExpr(
13067             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13068       }
13069       PackArgs = ArgStorage;
13070     }
13071   }
13072 
13073   // If we're not expanding the pack, just transform the decl.
13074   if (!PackArgs.size()) {
13075     auto *Pack = cast_or_null<NamedDecl>(
13076         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13077     if (!Pack)
13078       return ExprError();
13079     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13080                                               E->getPackLoc(),
13081                                               E->getRParenLoc(), None, None);
13082   }
13083 
13084   // Try to compute the result without performing a partial substitution.
13085   Optional<unsigned> Result = 0;
13086   for (const TemplateArgument &Arg : PackArgs) {
13087     if (!Arg.isPackExpansion()) {
13088       Result = *Result + 1;
13089       continue;
13090     }
13091 
13092     TemplateArgumentLoc ArgLoc;
13093     InventTemplateArgumentLoc(Arg, ArgLoc);
13094 
13095     // Find the pattern of the pack expansion.
13096     SourceLocation Ellipsis;
13097     Optional<unsigned> OrigNumExpansions;
13098     TemplateArgumentLoc Pattern =
13099         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13100                                                           OrigNumExpansions);
13101 
13102     // Substitute under the pack expansion. Do not expand the pack (yet).
13103     TemplateArgumentLoc OutPattern;
13104     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13105     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13106                                                /*Uneval*/ true))
13107       return true;
13108 
13109     // See if we can determine the number of arguments from the result.
13110     Optional<unsigned> NumExpansions =
13111         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13112     if (!NumExpansions) {
13113       // No: we must be in an alias template expansion, and we're going to need
13114       // to actually expand the packs.
13115       Result = None;
13116       break;
13117     }
13118 
13119     Result = *Result + *NumExpansions;
13120   }
13121 
13122   // Common case: we could determine the number of expansions without
13123   // substituting.
13124   if (Result)
13125     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13126                                               E->getPackLoc(),
13127                                               E->getRParenLoc(), *Result, None);
13128 
13129   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13130                                                E->getPackLoc());
13131   {
13132     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13133     typedef TemplateArgumentLocInventIterator<
13134         Derived, const TemplateArgument*> PackLocIterator;
13135     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13136                                    PackLocIterator(*this, PackArgs.end()),
13137                                    TransformedPackArgs, /*Uneval*/true))
13138       return ExprError();
13139   }
13140 
13141   // Check whether we managed to fully-expand the pack.
13142   // FIXME: Is it possible for us to do so and not hit the early exit path?
13143   SmallVector<TemplateArgument, 8> Args;
13144   bool PartialSubstitution = false;
13145   for (auto &Loc : TransformedPackArgs.arguments()) {
13146     Args.push_back(Loc.getArgument());
13147     if (Loc.getArgument().isPackExpansion())
13148       PartialSubstitution = true;
13149   }
13150 
13151   if (PartialSubstitution)
13152     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13153                                               E->getPackLoc(),
13154                                               E->getRParenLoc(), None, Args);
13155 
13156   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13157                                             E->getPackLoc(), E->getRParenLoc(),
13158                                             Args.size(), None);
13159 }
13160 
13161 template<typename Derived>
13162 ExprResult
13163 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13164                                           SubstNonTypeTemplateParmPackExpr *E) {
13165   // Default behavior is to do nothing with this transformation.
13166   return E;
13167 }
13168 
13169 template<typename Derived>
13170 ExprResult
13171 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13172                                           SubstNonTypeTemplateParmExpr *E) {
13173   // Default behavior is to do nothing with this transformation.
13174   return E;
13175 }
13176 
13177 template<typename Derived>
13178 ExprResult
13179 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13180   // Default behavior is to do nothing with this transformation.
13181   return E;
13182 }
13183 
13184 template<typename Derived>
13185 ExprResult
13186 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13187                                                   MaterializeTemporaryExpr *E) {
13188   return getDerived().TransformExpr(E->getSubExpr());
13189 }
13190 
13191 template<typename Derived>
13192 ExprResult
13193 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13194   UnresolvedLookupExpr *Callee = nullptr;
13195   if (Expr *OldCallee = E->getCallee()) {
13196     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13197     if (CalleeResult.isInvalid())
13198       return ExprError();
13199     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13200   }
13201 
13202   Expr *Pattern = E->getPattern();
13203 
13204   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13205   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13206   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13207 
13208   // Determine whether the set of unexpanded parameter packs can and should
13209   // be expanded.
13210   bool Expand = true;
13211   bool RetainExpansion = false;
13212   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13213                      NumExpansions = OrigNumExpansions;
13214   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13215                                            Pattern->getSourceRange(),
13216                                            Unexpanded,
13217                                            Expand, RetainExpansion,
13218                                            NumExpansions))
13219     return true;
13220 
13221   if (!Expand) {
13222     // Do not expand any packs here, just transform and rebuild a fold
13223     // expression.
13224     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13225 
13226     ExprResult LHS =
13227         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13228     if (LHS.isInvalid())
13229       return true;
13230 
13231     ExprResult RHS =
13232         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13233     if (RHS.isInvalid())
13234       return true;
13235 
13236     if (!getDerived().AlwaysRebuild() &&
13237         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13238       return E;
13239 
13240     return getDerived().RebuildCXXFoldExpr(
13241         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13242         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13243   }
13244 
13245   // Formally a fold expression expands to nested parenthesized expressions.
13246   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13247   // them.
13248   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13249     SemaRef.Diag(E->getEllipsisLoc(),
13250                  clang::diag::err_fold_expression_limit_exceeded)
13251         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13252         << E->getSourceRange();
13253     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13254     return ExprError();
13255   }
13256 
13257   // The transform has determined that we should perform an elementwise
13258   // expansion of the pattern. Do so.
13259   ExprResult Result = getDerived().TransformExpr(E->getInit());
13260   if (Result.isInvalid())
13261     return true;
13262   bool LeftFold = E->isLeftFold();
13263 
13264   // If we're retaining an expansion for a right fold, it is the innermost
13265   // component and takes the init (if any).
13266   if (!LeftFold && RetainExpansion) {
13267     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13268 
13269     ExprResult Out = getDerived().TransformExpr(Pattern);
13270     if (Out.isInvalid())
13271       return true;
13272 
13273     Result = getDerived().RebuildCXXFoldExpr(
13274         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13275         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13276     if (Result.isInvalid())
13277       return true;
13278   }
13279 
13280   for (unsigned I = 0; I != *NumExpansions; ++I) {
13281     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13282         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13283     ExprResult Out = getDerived().TransformExpr(Pattern);
13284     if (Out.isInvalid())
13285       return true;
13286 
13287     if (Out.get()->containsUnexpandedParameterPack()) {
13288       // We still have a pack; retain a pack expansion for this slice.
13289       Result = getDerived().RebuildCXXFoldExpr(
13290           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13291           E->getOperator(), E->getEllipsisLoc(),
13292           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13293           OrigNumExpansions);
13294     } else if (Result.isUsable()) {
13295       // We've got down to a single element; build a binary operator.
13296       Expr *LHS = LeftFold ? Result.get() : Out.get();
13297       Expr *RHS = LeftFold ? Out.get() : Result.get();
13298       if (Callee)
13299         Result = getDerived().RebuildCXXOperatorCallExpr(
13300             BinaryOperator::getOverloadedOperator(E->getOperator()),
13301             E->getEllipsisLoc(), Callee, LHS, RHS);
13302       else
13303         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13304                                                     E->getOperator(), LHS, RHS);
13305     } else
13306       Result = Out;
13307 
13308     if (Result.isInvalid())
13309       return true;
13310   }
13311 
13312   // If we're retaining an expansion for a left fold, it is the outermost
13313   // component and takes the complete expansion so far as its init (if any).
13314   if (LeftFold && RetainExpansion) {
13315     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13316 
13317     ExprResult Out = getDerived().TransformExpr(Pattern);
13318     if (Out.isInvalid())
13319       return true;
13320 
13321     Result = getDerived().RebuildCXXFoldExpr(
13322         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13323         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13324     if (Result.isInvalid())
13325       return true;
13326   }
13327 
13328   // If we had no init and an empty pack, and we're not retaining an expansion,
13329   // then produce a fallback value or error.
13330   if (Result.isUnset())
13331     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13332                                                 E->getOperator());
13333 
13334   return Result;
13335 }
13336 
13337 template<typename Derived>
13338 ExprResult
13339 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13340     CXXStdInitializerListExpr *E) {
13341   return getDerived().TransformExpr(E->getSubExpr());
13342 }
13343 
13344 template<typename Derived>
13345 ExprResult
13346 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13347   return SemaRef.MaybeBindToTemporary(E);
13348 }
13349 
13350 template<typename Derived>
13351 ExprResult
13352 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13353   return E;
13354 }
13355 
13356 template<typename Derived>
13357 ExprResult
13358 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13359   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13360   if (SubExpr.isInvalid())
13361     return ExprError();
13362 
13363   if (!getDerived().AlwaysRebuild() &&
13364       SubExpr.get() == E->getSubExpr())
13365     return E;
13366 
13367   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13368 }
13369 
13370 template<typename Derived>
13371 ExprResult
13372 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13373   // Transform each of the elements.
13374   SmallVector<Expr *, 8> Elements;
13375   bool ArgChanged = false;
13376   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13377                                   /*IsCall=*/false, Elements, &ArgChanged))
13378     return ExprError();
13379 
13380   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13381     return SemaRef.MaybeBindToTemporary(E);
13382 
13383   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13384                                               Elements.data(),
13385                                               Elements.size());
13386 }
13387 
13388 template<typename Derived>
13389 ExprResult
13390 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13391                                                     ObjCDictionaryLiteral *E) {
13392   // Transform each of the elements.
13393   SmallVector<ObjCDictionaryElement, 8> Elements;
13394   bool ArgChanged = false;
13395   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13396     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13397 
13398     if (OrigElement.isPackExpansion()) {
13399       // This key/value element is a pack expansion.
13400       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13401       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13402       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13403       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13404 
13405       // Determine whether the set of unexpanded parameter packs can
13406       // and should be expanded.
13407       bool Expand = true;
13408       bool RetainExpansion = false;
13409       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13410       Optional<unsigned> NumExpansions = OrigNumExpansions;
13411       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13412                                OrigElement.Value->getEndLoc());
13413       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13414                                                PatternRange, Unexpanded, Expand,
13415                                                RetainExpansion, NumExpansions))
13416         return ExprError();
13417 
13418       if (!Expand) {
13419         // The transform has determined that we should perform a simple
13420         // transformation on the pack expansion, producing another pack
13421         // expansion.
13422         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13423         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13424         if (Key.isInvalid())
13425           return ExprError();
13426 
13427         if (Key.get() != OrigElement.Key)
13428           ArgChanged = true;
13429 
13430         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13431         if (Value.isInvalid())
13432           return ExprError();
13433 
13434         if (Value.get() != OrigElement.Value)
13435           ArgChanged = true;
13436 
13437         ObjCDictionaryElement Expansion = {
13438           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13439         };
13440         Elements.push_back(Expansion);
13441         continue;
13442       }
13443 
13444       // Record right away that the argument was changed.  This needs
13445       // to happen even if the array expands to nothing.
13446       ArgChanged = true;
13447 
13448       // The transform has determined that we should perform an elementwise
13449       // expansion of the pattern. Do so.
13450       for (unsigned I = 0; I != *NumExpansions; ++I) {
13451         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13452         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13453         if (Key.isInvalid())
13454           return ExprError();
13455 
13456         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13457         if (Value.isInvalid())
13458           return ExprError();
13459 
13460         ObjCDictionaryElement Element = {
13461           Key.get(), Value.get(), SourceLocation(), NumExpansions
13462         };
13463 
13464         // If any unexpanded parameter packs remain, we still have a
13465         // pack expansion.
13466         // FIXME: Can this really happen?
13467         if (Key.get()->containsUnexpandedParameterPack() ||
13468             Value.get()->containsUnexpandedParameterPack())
13469           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13470 
13471         Elements.push_back(Element);
13472       }
13473 
13474       // FIXME: Retain a pack expansion if RetainExpansion is true.
13475 
13476       // We've finished with this pack expansion.
13477       continue;
13478     }
13479 
13480     // Transform and check key.
13481     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13482     if (Key.isInvalid())
13483       return ExprError();
13484 
13485     if (Key.get() != OrigElement.Key)
13486       ArgChanged = true;
13487 
13488     // Transform and check value.
13489     ExprResult Value
13490       = getDerived().TransformExpr(OrigElement.Value);
13491     if (Value.isInvalid())
13492       return ExprError();
13493 
13494     if (Value.get() != OrigElement.Value)
13495       ArgChanged = true;
13496 
13497     ObjCDictionaryElement Element = {
13498       Key.get(), Value.get(), SourceLocation(), None
13499     };
13500     Elements.push_back(Element);
13501   }
13502 
13503   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13504     return SemaRef.MaybeBindToTemporary(E);
13505 
13506   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13507                                                    Elements);
13508 }
13509 
13510 template<typename Derived>
13511 ExprResult
13512 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13513   TypeSourceInfo *EncodedTypeInfo
13514     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13515   if (!EncodedTypeInfo)
13516     return ExprError();
13517 
13518   if (!getDerived().AlwaysRebuild() &&
13519       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13520     return E;
13521 
13522   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13523                                             EncodedTypeInfo,
13524                                             E->getRParenLoc());
13525 }
13526 
13527 template<typename Derived>
13528 ExprResult TreeTransform<Derived>::
13529 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13530   // This is a kind of implicit conversion, and it needs to get dropped
13531   // and recomputed for the same general reasons that ImplicitCastExprs
13532   // do, as well a more specific one: this expression is only valid when
13533   // it appears *immediately* as an argument expression.
13534   return getDerived().TransformExpr(E->getSubExpr());
13535 }
13536 
13537 template<typename Derived>
13538 ExprResult TreeTransform<Derived>::
13539 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13540   TypeSourceInfo *TSInfo
13541     = getDerived().TransformType(E->getTypeInfoAsWritten());
13542   if (!TSInfo)
13543     return ExprError();
13544 
13545   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13546   if (Result.isInvalid())
13547     return ExprError();
13548 
13549   if (!getDerived().AlwaysRebuild() &&
13550       TSInfo == E->getTypeInfoAsWritten() &&
13551       Result.get() == E->getSubExpr())
13552     return E;
13553 
13554   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13555                                       E->getBridgeKeywordLoc(), TSInfo,
13556                                       Result.get());
13557 }
13558 
13559 template <typename Derived>
13560 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13561     ObjCAvailabilityCheckExpr *E) {
13562   return E;
13563 }
13564 
13565 template<typename Derived>
13566 ExprResult
13567 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13568   // Transform arguments.
13569   bool ArgChanged = false;
13570   SmallVector<Expr*, 8> Args;
13571   Args.reserve(E->getNumArgs());
13572   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13573                                   &ArgChanged))
13574     return ExprError();
13575 
13576   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13577     // Class message: transform the receiver type.
13578     TypeSourceInfo *ReceiverTypeInfo
13579       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13580     if (!ReceiverTypeInfo)
13581       return ExprError();
13582 
13583     // If nothing changed, just retain the existing message send.
13584     if (!getDerived().AlwaysRebuild() &&
13585         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13586       return SemaRef.MaybeBindToTemporary(E);
13587 
13588     // Build a new class message send.
13589     SmallVector<SourceLocation, 16> SelLocs;
13590     E->getSelectorLocs(SelLocs);
13591     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13592                                                E->getSelector(),
13593                                                SelLocs,
13594                                                E->getMethodDecl(),
13595                                                E->getLeftLoc(),
13596                                                Args,
13597                                                E->getRightLoc());
13598   }
13599   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13600            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13601     if (!E->getMethodDecl())
13602       return ExprError();
13603 
13604     // Build a new class message send to 'super'.
13605     SmallVector<SourceLocation, 16> SelLocs;
13606     E->getSelectorLocs(SelLocs);
13607     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13608                                                E->getSelector(),
13609                                                SelLocs,
13610                                                E->getReceiverType(),
13611                                                E->getMethodDecl(),
13612                                                E->getLeftLoc(),
13613                                                Args,
13614                                                E->getRightLoc());
13615   }
13616 
13617   // Instance message: transform the receiver
13618   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13619          "Only class and instance messages may be instantiated");
13620   ExprResult Receiver
13621     = getDerived().TransformExpr(E->getInstanceReceiver());
13622   if (Receiver.isInvalid())
13623     return ExprError();
13624 
13625   // If nothing changed, just retain the existing message send.
13626   if (!getDerived().AlwaysRebuild() &&
13627       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13628     return SemaRef.MaybeBindToTemporary(E);
13629 
13630   // Build a new instance message send.
13631   SmallVector<SourceLocation, 16> SelLocs;
13632   E->getSelectorLocs(SelLocs);
13633   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13634                                              E->getSelector(),
13635                                              SelLocs,
13636                                              E->getMethodDecl(),
13637                                              E->getLeftLoc(),
13638                                              Args,
13639                                              E->getRightLoc());
13640 }
13641 
13642 template<typename Derived>
13643 ExprResult
13644 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13645   return E;
13646 }
13647 
13648 template<typename Derived>
13649 ExprResult
13650 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13651   return E;
13652 }
13653 
13654 template<typename Derived>
13655 ExprResult
13656 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13657   // Transform the base expression.
13658   ExprResult Base = getDerived().TransformExpr(E->getBase());
13659   if (Base.isInvalid())
13660     return ExprError();
13661 
13662   // We don't need to transform the ivar; it will never change.
13663 
13664   // If nothing changed, just retain the existing expression.
13665   if (!getDerived().AlwaysRebuild() &&
13666       Base.get() == E->getBase())
13667     return E;
13668 
13669   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13670                                              E->getLocation(),
13671                                              E->isArrow(), E->isFreeIvar());
13672 }
13673 
13674 template<typename Derived>
13675 ExprResult
13676 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13677   // 'super' and types never change. Property never changes. Just
13678   // retain the existing expression.
13679   if (!E->isObjectReceiver())
13680     return E;
13681 
13682   // Transform the base expression.
13683   ExprResult Base = getDerived().TransformExpr(E->getBase());
13684   if (Base.isInvalid())
13685     return ExprError();
13686 
13687   // We don't need to transform the property; it will never change.
13688 
13689   // If nothing changed, just retain the existing expression.
13690   if (!getDerived().AlwaysRebuild() &&
13691       Base.get() == E->getBase())
13692     return E;
13693 
13694   if (E->isExplicitProperty())
13695     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13696                                                    E->getExplicitProperty(),
13697                                                    E->getLocation());
13698 
13699   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13700                                                  SemaRef.Context.PseudoObjectTy,
13701                                                  E->getImplicitPropertyGetter(),
13702                                                  E->getImplicitPropertySetter(),
13703                                                  E->getLocation());
13704 }
13705 
13706 template<typename Derived>
13707 ExprResult
13708 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13709   // Transform the base expression.
13710   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13711   if (Base.isInvalid())
13712     return ExprError();
13713 
13714   // Transform the key expression.
13715   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13716   if (Key.isInvalid())
13717     return ExprError();
13718 
13719   // If nothing changed, just retain the existing expression.
13720   if (!getDerived().AlwaysRebuild() &&
13721       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13722     return E;
13723 
13724   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13725                                                   Base.get(), Key.get(),
13726                                                   E->getAtIndexMethodDecl(),
13727                                                   E->setAtIndexMethodDecl());
13728 }
13729 
13730 template<typename Derived>
13731 ExprResult
13732 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13733   // Transform the base expression.
13734   ExprResult Base = getDerived().TransformExpr(E->getBase());
13735   if (Base.isInvalid())
13736     return ExprError();
13737 
13738   // If nothing changed, just retain the existing expression.
13739   if (!getDerived().AlwaysRebuild() &&
13740       Base.get() == E->getBase())
13741     return E;
13742 
13743   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13744                                          E->getOpLoc(),
13745                                          E->isArrow());
13746 }
13747 
13748 template<typename Derived>
13749 ExprResult
13750 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13751   bool ArgumentChanged = false;
13752   SmallVector<Expr*, 8> SubExprs;
13753   SubExprs.reserve(E->getNumSubExprs());
13754   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13755                                   SubExprs, &ArgumentChanged))
13756     return ExprError();
13757 
13758   if (!getDerived().AlwaysRebuild() &&
13759       !ArgumentChanged)
13760     return E;
13761 
13762   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13763                                                SubExprs,
13764                                                E->getRParenLoc());
13765 }
13766 
13767 template<typename Derived>
13768 ExprResult
13769 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13770   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13771   if (SrcExpr.isInvalid())
13772     return ExprError();
13773 
13774   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13775   if (!Type)
13776     return ExprError();
13777 
13778   if (!getDerived().AlwaysRebuild() &&
13779       Type == E->getTypeSourceInfo() &&
13780       SrcExpr.get() == E->getSrcExpr())
13781     return E;
13782 
13783   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13784                                                SrcExpr.get(), Type,
13785                                                E->getRParenLoc());
13786 }
13787 
13788 template<typename Derived>
13789 ExprResult
13790 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13791   BlockDecl *oldBlock = E->getBlockDecl();
13792 
13793   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13794   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13795 
13796   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13797   blockScope->TheDecl->setBlockMissingReturnType(
13798                          oldBlock->blockMissingReturnType());
13799 
13800   SmallVector<ParmVarDecl*, 4> params;
13801   SmallVector<QualType, 4> paramTypes;
13802 
13803   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13804 
13805   // Parameter substitution.
13806   Sema::ExtParameterInfoBuilder extParamInfos;
13807   if (getDerived().TransformFunctionTypeParams(
13808           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13809           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13810           extParamInfos)) {
13811     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13812     return ExprError();
13813   }
13814 
13815   QualType exprResultType =
13816       getDerived().TransformType(exprFunctionType->getReturnType());
13817 
13818   auto epi = exprFunctionType->getExtProtoInfo();
13819   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13820 
13821   QualType functionType =
13822     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13823   blockScope->FunctionType = functionType;
13824 
13825   // Set the parameters on the block decl.
13826   if (!params.empty())
13827     blockScope->TheDecl->setParams(params);
13828 
13829   if (!oldBlock->blockMissingReturnType()) {
13830     blockScope->HasImplicitReturnType = false;
13831     blockScope->ReturnType = exprResultType;
13832   }
13833 
13834   // Transform the body
13835   StmtResult body = getDerived().TransformStmt(E->getBody());
13836   if (body.isInvalid()) {
13837     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13838     return ExprError();
13839   }
13840 
13841 #ifndef NDEBUG
13842   // In builds with assertions, make sure that we captured everything we
13843   // captured before.
13844   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13845     for (const auto &I : oldBlock->captures()) {
13846       VarDecl *oldCapture = I.getVariable();
13847 
13848       // Ignore parameter packs.
13849       if (oldCapture->isParameterPack())
13850         continue;
13851 
13852       VarDecl *newCapture =
13853         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13854                                                  oldCapture));
13855       assert(blockScope->CaptureMap.count(newCapture));
13856     }
13857     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13858   }
13859 #endif
13860 
13861   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13862                                     /*Scope=*/nullptr);
13863 }
13864 
13865 template<typename Derived>
13866 ExprResult
13867 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13868   llvm_unreachable("Cannot transform asType expressions yet");
13869 }
13870 
13871 template<typename Derived>
13872 ExprResult
13873 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13874   bool ArgumentChanged = false;
13875   SmallVector<Expr*, 8> SubExprs;
13876   SubExprs.reserve(E->getNumSubExprs());
13877   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13878                                   SubExprs, &ArgumentChanged))
13879     return ExprError();
13880 
13881   if (!getDerived().AlwaysRebuild() &&
13882       !ArgumentChanged)
13883     return E;
13884 
13885   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13886                                         E->getOp(), E->getRParenLoc());
13887 }
13888 
13889 //===----------------------------------------------------------------------===//
13890 // Type reconstruction
13891 //===----------------------------------------------------------------------===//
13892 
13893 template<typename Derived>
13894 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13895                                                     SourceLocation Star) {
13896   return SemaRef.BuildPointerType(PointeeType, Star,
13897                                   getDerived().getBaseEntity());
13898 }
13899 
13900 template<typename Derived>
13901 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13902                                                          SourceLocation Star) {
13903   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13904                                        getDerived().getBaseEntity());
13905 }
13906 
13907 template<typename Derived>
13908 QualType
13909 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13910                                              bool WrittenAsLValue,
13911                                              SourceLocation Sigil) {
13912   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13913                                     Sigil, getDerived().getBaseEntity());
13914 }
13915 
13916 template<typename Derived>
13917 QualType
13918 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13919                                                  QualType ClassType,
13920                                                  SourceLocation Sigil) {
13921   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13922                                         getDerived().getBaseEntity());
13923 }
13924 
13925 template<typename Derived>
13926 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13927            const ObjCTypeParamDecl *Decl,
13928            SourceLocation ProtocolLAngleLoc,
13929            ArrayRef<ObjCProtocolDecl *> Protocols,
13930            ArrayRef<SourceLocation> ProtocolLocs,
13931            SourceLocation ProtocolRAngleLoc) {
13932   return SemaRef.BuildObjCTypeParamType(Decl,
13933                                         ProtocolLAngleLoc, Protocols,
13934                                         ProtocolLocs, ProtocolRAngleLoc,
13935                                         /*FailOnError=*/true);
13936 }
13937 
13938 template<typename Derived>
13939 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13940            QualType BaseType,
13941            SourceLocation Loc,
13942            SourceLocation TypeArgsLAngleLoc,
13943            ArrayRef<TypeSourceInfo *> TypeArgs,
13944            SourceLocation TypeArgsRAngleLoc,
13945            SourceLocation ProtocolLAngleLoc,
13946            ArrayRef<ObjCProtocolDecl *> Protocols,
13947            ArrayRef<SourceLocation> ProtocolLocs,
13948            SourceLocation ProtocolRAngleLoc) {
13949   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13950                                      TypeArgs, TypeArgsRAngleLoc,
13951                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13952                                      ProtocolRAngleLoc,
13953                                      /*FailOnError=*/true);
13954 }
13955 
13956 template<typename Derived>
13957 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13958            QualType PointeeType,
13959            SourceLocation Star) {
13960   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13961 }
13962 
13963 template<typename Derived>
13964 QualType
13965 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13966                                          ArrayType::ArraySizeModifier SizeMod,
13967                                          const llvm::APInt *Size,
13968                                          Expr *SizeExpr,
13969                                          unsigned IndexTypeQuals,
13970                                          SourceRange BracketsRange) {
13971   if (SizeExpr || !Size)
13972     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13973                                   IndexTypeQuals, BracketsRange,
13974                                   getDerived().getBaseEntity());
13975 
13976   QualType Types[] = {
13977     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13978     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13979     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13980   };
13981   const unsigned NumTypes = llvm::array_lengthof(Types);
13982   QualType SizeType;
13983   for (unsigned I = 0; I != NumTypes; ++I)
13984     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13985       SizeType = Types[I];
13986       break;
13987     }
13988 
13989   // Note that we can return a VariableArrayType here in the case where
13990   // the element type was a dependent VariableArrayType.
13991   IntegerLiteral *ArraySize
13992       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13993                                /*FIXME*/BracketsRange.getBegin());
13994   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13995                                 IndexTypeQuals, BracketsRange,
13996                                 getDerived().getBaseEntity());
13997 }
13998 
13999 template<typename Derived>
14000 QualType
14001 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
14002                                                  ArrayType::ArraySizeModifier SizeMod,
14003                                                  const llvm::APInt &Size,
14004                                                  Expr *SizeExpr,
14005                                                  unsigned IndexTypeQuals,
14006                                                  SourceRange BracketsRange) {
14007   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
14008                                         IndexTypeQuals, BracketsRange);
14009 }
14010 
14011 template<typename Derived>
14012 QualType
14013 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
14014                                           ArrayType::ArraySizeModifier SizeMod,
14015                                                  unsigned IndexTypeQuals,
14016                                                    SourceRange BracketsRange) {
14017   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
14018                                        IndexTypeQuals, BracketsRange);
14019 }
14020 
14021 template<typename Derived>
14022 QualType
14023 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
14024                                           ArrayType::ArraySizeModifier SizeMod,
14025                                                  Expr *SizeExpr,
14026                                                  unsigned IndexTypeQuals,
14027                                                  SourceRange BracketsRange) {
14028   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14029                                        SizeExpr,
14030                                        IndexTypeQuals, BracketsRange);
14031 }
14032 
14033 template<typename Derived>
14034 QualType
14035 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
14036                                           ArrayType::ArraySizeModifier SizeMod,
14037                                                        Expr *SizeExpr,
14038                                                        unsigned IndexTypeQuals,
14039                                                    SourceRange BracketsRange) {
14040   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
14041                                        SizeExpr,
14042                                        IndexTypeQuals, BracketsRange);
14043 }
14044 
14045 template <typename Derived>
14046 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14047     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14048   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14049                                           AttributeLoc);
14050 }
14051 
14052 template <typename Derived>
14053 QualType
14054 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14055                                           unsigned NumElements,
14056                                           VectorType::VectorKind VecKind) {
14057   // FIXME: semantic checking!
14058   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14059 }
14060 
14061 template <typename Derived>
14062 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14063     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14064     VectorType::VectorKind VecKind) {
14065   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14066 }
14067 
14068 template<typename Derived>
14069 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14070                                                       unsigned NumElements,
14071                                                  SourceLocation AttributeLoc) {
14072   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14073                           NumElements, true);
14074   IntegerLiteral *VectorSize
14075     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14076                              AttributeLoc);
14077   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14078 }
14079 
14080 template<typename Derived>
14081 QualType
14082 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14083                                                            Expr *SizeExpr,
14084                                                   SourceLocation AttributeLoc) {
14085   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14086 }
14087 
14088 template <typename Derived>
14089 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14090     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14091   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14092                                                NumColumns);
14093 }
14094 
14095 template <typename Derived>
14096 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14097     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14098     SourceLocation AttributeLoc) {
14099   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14100                                  AttributeLoc);
14101 }
14102 
14103 template<typename Derived>
14104 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14105     QualType T,
14106     MutableArrayRef<QualType> ParamTypes,
14107     const FunctionProtoType::ExtProtoInfo &EPI) {
14108   return SemaRef.BuildFunctionType(T, ParamTypes,
14109                                    getDerived().getBaseLocation(),
14110                                    getDerived().getBaseEntity(),
14111                                    EPI);
14112 }
14113 
14114 template<typename Derived>
14115 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14116   return SemaRef.Context.getFunctionNoProtoType(T);
14117 }
14118 
14119 template<typename Derived>
14120 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14121                                                             Decl *D) {
14122   assert(D && "no decl found");
14123   if (D->isInvalidDecl()) return QualType();
14124 
14125   // FIXME: Doesn't account for ObjCInterfaceDecl!
14126   TypeDecl *Ty;
14127   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14128     // A valid resolved using typename pack expansion decl can have multiple
14129     // UsingDecls, but they must each have exactly one type, and it must be
14130     // the same type in every case. But we must have at least one expansion!
14131     if (UPD->expansions().empty()) {
14132       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14133           << UPD->isCXXClassMember() << UPD;
14134       return QualType();
14135     }
14136 
14137     // We might still have some unresolved types. Try to pick a resolved type
14138     // if we can. The final instantiation will check that the remaining
14139     // unresolved types instantiate to the type we pick.
14140     QualType FallbackT;
14141     QualType T;
14142     for (auto *E : UPD->expansions()) {
14143       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14144       if (ThisT.isNull())
14145         continue;
14146       else if (ThisT->getAs<UnresolvedUsingType>())
14147         FallbackT = ThisT;
14148       else if (T.isNull())
14149         T = ThisT;
14150       else
14151         assert(getSema().Context.hasSameType(ThisT, T) &&
14152                "mismatched resolved types in using pack expansion");
14153     }
14154     return T.isNull() ? FallbackT : T;
14155   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14156     assert(Using->hasTypename() &&
14157            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14158 
14159     // A valid resolved using typename decl points to exactly one type decl.
14160     assert(++Using->shadow_begin() == Using->shadow_end());
14161     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14162   } else {
14163     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14164            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14165     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14166   }
14167 
14168   return SemaRef.Context.getTypeDeclType(Ty);
14169 }
14170 
14171 template<typename Derived>
14172 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14173                                                        SourceLocation Loc) {
14174   return SemaRef.BuildTypeofExprType(E, Loc);
14175 }
14176 
14177 template<typename Derived>
14178 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14179   return SemaRef.Context.getTypeOfType(Underlying);
14180 }
14181 
14182 template<typename Derived>
14183 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14184                                                      SourceLocation Loc) {
14185   return SemaRef.BuildDecltypeType(E, Loc);
14186 }
14187 
14188 template<typename Derived>
14189 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14190                                             UnaryTransformType::UTTKind UKind,
14191                                             SourceLocation Loc) {
14192   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14193 }
14194 
14195 template<typename Derived>
14196 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14197                                                       TemplateName Template,
14198                                              SourceLocation TemplateNameLoc,
14199                                      TemplateArgumentListInfo &TemplateArgs) {
14200   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14201 }
14202 
14203 template<typename Derived>
14204 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14205                                                    SourceLocation KWLoc) {
14206   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14207 }
14208 
14209 template<typename Derived>
14210 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14211                                                  SourceLocation KWLoc,
14212                                                  bool isReadPipe) {
14213   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14214                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14215 }
14216 
14217 template <typename Derived>
14218 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14219                                                    unsigned NumBits,
14220                                                    SourceLocation Loc) {
14221   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14222                         NumBits, true);
14223   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14224                                                 SemaRef.Context.IntTy, Loc);
14225   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14226 }
14227 
14228 template <typename Derived>
14229 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14230     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14231   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14232 }
14233 
14234 template<typename Derived>
14235 TemplateName
14236 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14237                                             bool TemplateKW,
14238                                             TemplateDecl *Template) {
14239   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14240                                                   Template);
14241 }
14242 
14243 template<typename Derived>
14244 TemplateName
14245 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14246                                             SourceLocation TemplateKWLoc,
14247                                             const IdentifierInfo &Name,
14248                                             SourceLocation NameLoc,
14249                                             QualType ObjectType,
14250                                             NamedDecl *FirstQualifierInScope,
14251                                             bool AllowInjectedClassName) {
14252   UnqualifiedId TemplateName;
14253   TemplateName.setIdentifier(&Name, NameLoc);
14254   Sema::TemplateTy Template;
14255   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14256                               TemplateName, ParsedType::make(ObjectType),
14257                               /*EnteringContext=*/false, Template,
14258                               AllowInjectedClassName);
14259   return Template.get();
14260 }
14261 
14262 template<typename Derived>
14263 TemplateName
14264 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14265                                             SourceLocation TemplateKWLoc,
14266                                             OverloadedOperatorKind Operator,
14267                                             SourceLocation NameLoc,
14268                                             QualType ObjectType,
14269                                             bool AllowInjectedClassName) {
14270   UnqualifiedId Name;
14271   // FIXME: Bogus location information.
14272   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14273   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14274   Sema::TemplateTy Template;
14275   getSema().ActOnTemplateName(
14276       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14277       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14278   return Template.get();
14279 }
14280 
14281 template<typename Derived>
14282 ExprResult
14283 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14284                                                    SourceLocation OpLoc,
14285                                                    Expr *OrigCallee,
14286                                                    Expr *First,
14287                                                    Expr *Second) {
14288   Expr *Callee = OrigCallee->IgnoreParenCasts();
14289   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14290 
14291   if (First->getObjectKind() == OK_ObjCProperty) {
14292     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14293     if (BinaryOperator::isAssignmentOp(Opc))
14294       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14295                                                  First, Second);
14296     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14297     if (Result.isInvalid())
14298       return ExprError();
14299     First = Result.get();
14300   }
14301 
14302   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14303     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14304     if (Result.isInvalid())
14305       return ExprError();
14306     Second = Result.get();
14307   }
14308 
14309   // Determine whether this should be a builtin operation.
14310   if (Op == OO_Subscript) {
14311     if (!First->getType()->isOverloadableType() &&
14312         !Second->getType()->isOverloadableType())
14313       return getSema().CreateBuiltinArraySubscriptExpr(
14314           First, Callee->getBeginLoc(), Second, OpLoc);
14315   } else if (Op == OO_Arrow) {
14316     // -> is never a builtin operation.
14317     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14318   } else if (Second == nullptr || isPostIncDec) {
14319     if (!First->getType()->isOverloadableType() ||
14320         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14321       // The argument is not of overloadable type, or this is an expression
14322       // of the form &Class::member, so try to create a built-in unary
14323       // operation.
14324       UnaryOperatorKind Opc
14325         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14326 
14327       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14328     }
14329   } else {
14330     if (!First->getType()->isOverloadableType() &&
14331         !Second->getType()->isOverloadableType()) {
14332       // Neither of the arguments is an overloadable type, so try to
14333       // create a built-in binary operation.
14334       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14335       ExprResult Result
14336         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14337       if (Result.isInvalid())
14338         return ExprError();
14339 
14340       return Result;
14341     }
14342   }
14343 
14344   // Compute the transformed set of functions (and function templates) to be
14345   // used during overload resolution.
14346   UnresolvedSet<16> Functions;
14347   bool RequiresADL;
14348 
14349   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14350     Functions.append(ULE->decls_begin(), ULE->decls_end());
14351     // If the overload could not be resolved in the template definition
14352     // (because we had a dependent argument), ADL is performed as part of
14353     // template instantiation.
14354     RequiresADL = ULE->requiresADL();
14355   } else {
14356     // If we've resolved this to a particular non-member function, just call
14357     // that function. If we resolved it to a member function,
14358     // CreateOverloaded* will find that function for us.
14359     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14360     if (!isa<CXXMethodDecl>(ND))
14361       Functions.addDecl(ND);
14362     RequiresADL = false;
14363   }
14364 
14365   // Add any functions found via argument-dependent lookup.
14366   Expr *Args[2] = { First, Second };
14367   unsigned NumArgs = 1 + (Second != nullptr);
14368 
14369   // Create the overloaded operator invocation for unary operators.
14370   if (NumArgs == 1 || isPostIncDec) {
14371     UnaryOperatorKind Opc
14372       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14373     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14374                                            RequiresADL);
14375   }
14376 
14377   if (Op == OO_Subscript) {
14378     SourceLocation LBrace;
14379     SourceLocation RBrace;
14380 
14381     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14382       DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14383       LBrace = NameLoc.getCXXOperatorNameBeginLoc();
14384       RBrace = NameLoc.getCXXOperatorNameEndLoc();
14385     } else {
14386       LBrace = Callee->getBeginLoc();
14387       RBrace = OpLoc;
14388     }
14389 
14390     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14391                                                       First, Second);
14392   }
14393 
14394   // Create the overloaded operator invocation for binary operators.
14395   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14396   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14397       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14398   if (Result.isInvalid())
14399     return ExprError();
14400 
14401   return Result;
14402 }
14403 
14404 template<typename Derived>
14405 ExprResult
14406 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14407                                                      SourceLocation OperatorLoc,
14408                                                        bool isArrow,
14409                                                        CXXScopeSpec &SS,
14410                                                      TypeSourceInfo *ScopeType,
14411                                                        SourceLocation CCLoc,
14412                                                        SourceLocation TildeLoc,
14413                                         PseudoDestructorTypeStorage Destroyed) {
14414   QualType BaseType = Base->getType();
14415   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14416       (!isArrow && !BaseType->getAs<RecordType>()) ||
14417       (isArrow && BaseType->getAs<PointerType>() &&
14418        !BaseType->castAs<PointerType>()->getPointeeType()
14419                                               ->template getAs<RecordType>())){
14420     // This pseudo-destructor expression is still a pseudo-destructor.
14421     return SemaRef.BuildPseudoDestructorExpr(
14422         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14423         CCLoc, TildeLoc, Destroyed);
14424   }
14425 
14426   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14427   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14428                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14429   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14430   NameInfo.setNamedTypeInfo(DestroyedType);
14431 
14432   // The scope type is now known to be a valid nested name specifier
14433   // component. Tack it on to the end of the nested name specifier.
14434   if (ScopeType) {
14435     if (!ScopeType->getType()->getAs<TagType>()) {
14436       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14437                      diag::err_expected_class_or_namespace)
14438           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14439       return ExprError();
14440     }
14441     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14442               CCLoc);
14443   }
14444 
14445   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14446   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14447                                             OperatorLoc, isArrow,
14448                                             SS, TemplateKWLoc,
14449                                             /*FIXME: FirstQualifier*/ nullptr,
14450                                             NameInfo,
14451                                             /*TemplateArgs*/ nullptr,
14452                                             /*S*/nullptr);
14453 }
14454 
14455 template<typename Derived>
14456 StmtResult
14457 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14458   SourceLocation Loc = S->getBeginLoc();
14459   CapturedDecl *CD = S->getCapturedDecl();
14460   unsigned NumParams = CD->getNumParams();
14461   unsigned ContextParamPos = CD->getContextParamPosition();
14462   SmallVector<Sema::CapturedParamNameType, 4> Params;
14463   for (unsigned I = 0; I < NumParams; ++I) {
14464     if (I != ContextParamPos) {
14465       Params.push_back(
14466              std::make_pair(
14467                   CD->getParam(I)->getName(),
14468                   getDerived().TransformType(CD->getParam(I)->getType())));
14469     } else {
14470       Params.push_back(std::make_pair(StringRef(), QualType()));
14471     }
14472   }
14473   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14474                                      S->getCapturedRegionKind(), Params);
14475   StmtResult Body;
14476   {
14477     Sema::CompoundScopeRAII CompoundScope(getSema());
14478     Body = getDerived().TransformStmt(S->getCapturedStmt());
14479   }
14480 
14481   if (Body.isInvalid()) {
14482     getSema().ActOnCapturedRegionError();
14483     return StmtError();
14484   }
14485 
14486   return getSema().ActOnCapturedRegionEnd(Body.get());
14487 }
14488 
14489 } // end namespace clang
14490 
14491 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14492