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 OMP_CLAUSE_CLASS(Enum, Str, Class)                                           \
735   LLVM_ATTRIBUTE_NOINLINE \
736   OMPClause *Transform ## Class(Class *S);
737 #include "llvm/Frontend/OpenMP/OMPKinds.def"
738 
739   /// Build a new qualified type given its unqualified type and type location.
740   ///
741   /// By default, this routine adds type qualifiers only to types that can
742   /// have qualifiers, and silently suppresses those qualifiers that are not
743   /// permitted. Subclasses may override this routine to provide different
744   /// behavior.
745   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
746 
747   /// Build a new pointer type given its pointee type.
748   ///
749   /// By default, performs semantic analysis when building the pointer type.
750   /// Subclasses may override this routine to provide different behavior.
751   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
752 
753   /// Build a new block pointer type given its pointee type.
754   ///
755   /// By default, performs semantic analysis when building the block pointer
756   /// type. Subclasses may override this routine to provide different behavior.
757   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
758 
759   /// Build a new reference type given the type it references.
760   ///
761   /// By default, performs semantic analysis when building the
762   /// reference type. Subclasses may override this routine to provide
763   /// different behavior.
764   ///
765   /// \param LValue whether the type was written with an lvalue sigil
766   /// or an rvalue sigil.
767   QualType RebuildReferenceType(QualType ReferentType,
768                                 bool LValue,
769                                 SourceLocation Sigil);
770 
771   /// Build a new member pointer type given the pointee type and the
772   /// class type it refers into.
773   ///
774   /// By default, performs semantic analysis when building the member pointer
775   /// type. Subclasses may override this routine to provide different behavior.
776   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
777                                     SourceLocation Sigil);
778 
779   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
780                                     SourceLocation ProtocolLAngleLoc,
781                                     ArrayRef<ObjCProtocolDecl *> Protocols,
782                                     ArrayRef<SourceLocation> ProtocolLocs,
783                                     SourceLocation ProtocolRAngleLoc);
784 
785   /// Build an Objective-C object type.
786   ///
787   /// By default, performs semantic analysis when building the object type.
788   /// Subclasses may override this routine to provide different behavior.
789   QualType RebuildObjCObjectType(QualType BaseType,
790                                  SourceLocation Loc,
791                                  SourceLocation TypeArgsLAngleLoc,
792                                  ArrayRef<TypeSourceInfo *> TypeArgs,
793                                  SourceLocation TypeArgsRAngleLoc,
794                                  SourceLocation ProtocolLAngleLoc,
795                                  ArrayRef<ObjCProtocolDecl *> Protocols,
796                                  ArrayRef<SourceLocation> ProtocolLocs,
797                                  SourceLocation ProtocolRAngleLoc);
798 
799   /// Build a new Objective-C object pointer type given the pointee type.
800   ///
801   /// By default, directly builds the pointer type, with no additional semantic
802   /// analysis.
803   QualType RebuildObjCObjectPointerType(QualType PointeeType,
804                                         SourceLocation Star);
805 
806   /// Build a new array type given the element type, size
807   /// modifier, size of the array (if known), size expression, and index type
808   /// qualifiers.
809   ///
810   /// By default, performs semantic analysis when building the array type.
811   /// Subclasses may override this routine to provide different behavior.
812   /// Also by default, all of the other Rebuild*Array
813   QualType RebuildArrayType(QualType ElementType,
814                             ArrayType::ArraySizeModifier SizeMod,
815                             const llvm::APInt *Size,
816                             Expr *SizeExpr,
817                             unsigned IndexTypeQuals,
818                             SourceRange BracketsRange);
819 
820   /// Build a new constant array type given the element type, size
821   /// modifier, (known) size of the array, and index type qualifiers.
822   ///
823   /// By default, performs semantic analysis when building the array type.
824   /// Subclasses may override this routine to provide different behavior.
825   QualType RebuildConstantArrayType(QualType ElementType,
826                                     ArrayType::ArraySizeModifier SizeMod,
827                                     const llvm::APInt &Size,
828                                     Expr *SizeExpr,
829                                     unsigned IndexTypeQuals,
830                                     SourceRange BracketsRange);
831 
832   /// Build a new incomplete array type given the element type, size
833   /// modifier, and index type qualifiers.
834   ///
835   /// By default, performs semantic analysis when building the array type.
836   /// Subclasses may override this routine to provide different behavior.
837   QualType RebuildIncompleteArrayType(QualType ElementType,
838                                       ArrayType::ArraySizeModifier SizeMod,
839                                       unsigned IndexTypeQuals,
840                                       SourceRange BracketsRange);
841 
842   /// Build a new variable-length array type given the element type,
843   /// size modifier, size expression, and index type qualifiers.
844   ///
845   /// By default, performs semantic analysis when building the array type.
846   /// Subclasses may override this routine to provide different behavior.
847   QualType RebuildVariableArrayType(QualType ElementType,
848                                     ArrayType::ArraySizeModifier SizeMod,
849                                     Expr *SizeExpr,
850                                     unsigned IndexTypeQuals,
851                                     SourceRange BracketsRange);
852 
853   /// Build a new dependent-sized array type given the element type,
854   /// size modifier, size expression, and index type qualifiers.
855   ///
856   /// By default, performs semantic analysis when building the array type.
857   /// Subclasses may override this routine to provide different behavior.
858   QualType RebuildDependentSizedArrayType(QualType ElementType,
859                                           ArrayType::ArraySizeModifier SizeMod,
860                                           Expr *SizeExpr,
861                                           unsigned IndexTypeQuals,
862                                           SourceRange BracketsRange);
863 
864   /// Build a new vector type given the element type and
865   /// number of elements.
866   ///
867   /// By default, performs semantic analysis when building the vector type.
868   /// Subclasses may override this routine to provide different behavior.
869   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
870                              VectorType::VectorKind VecKind);
871 
872   /// Build a new potentially dependently-sized extended vector type
873   /// given the element type and number of elements.
874   ///
875   /// By default, performs semantic analysis when building the vector type.
876   /// Subclasses may override this routine to provide different behavior.
877   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
878                                            SourceLocation AttributeLoc,
879                                            VectorType::VectorKind);
880 
881   /// Build a new extended vector type given the element type and
882   /// number of elements.
883   ///
884   /// By default, performs semantic analysis when building the vector type.
885   /// Subclasses may override this routine to provide different behavior.
886   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
887                                 SourceLocation AttributeLoc);
888 
889   /// Build a new potentially dependently-sized extended vector type
890   /// given the element type and number of elements.
891   ///
892   /// By default, performs semantic analysis when building the vector type.
893   /// Subclasses may override this routine to provide different behavior.
894   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
895                                               Expr *SizeExpr,
896                                               SourceLocation AttributeLoc);
897 
898   /// Build a new matrix type given the element type and dimensions.
899   QualType RebuildConstantMatrixType(QualType ElementType, unsigned NumRows,
900                                      unsigned NumColumns);
901 
902   /// Build a new matrix type given the type and dependently-defined
903   /// dimensions.
904   QualType RebuildDependentSizedMatrixType(QualType ElementType, Expr *RowExpr,
905                                            Expr *ColumnExpr,
906                                            SourceLocation AttributeLoc);
907 
908   /// Build a new DependentAddressSpaceType or return the pointee
909   /// type variable with the correct address space (retrieved from
910   /// AddrSpaceExpr) applied to it. The former will be returned in cases
911   /// where the address space remains dependent.
912   ///
913   /// By default, performs semantic analysis when building the type with address
914   /// space applied. Subclasses may override this routine to provide different
915   /// behavior.
916   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
917                                             Expr *AddrSpaceExpr,
918                                             SourceLocation AttributeLoc);
919 
920   /// Build a new function type.
921   ///
922   /// By default, performs semantic analysis when building the function type.
923   /// Subclasses may override this routine to provide different behavior.
924   QualType RebuildFunctionProtoType(QualType T,
925                                     MutableArrayRef<QualType> ParamTypes,
926                                     const FunctionProtoType::ExtProtoInfo &EPI);
927 
928   /// Build a new unprototyped function type.
929   QualType RebuildFunctionNoProtoType(QualType ResultType);
930 
931   /// Rebuild an unresolved typename type, given the decl that
932   /// the UnresolvedUsingTypenameDecl was transformed to.
933   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
934 
935   /// Build a new typedef type.
936   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
937     return SemaRef.Context.getTypeDeclType(Typedef);
938   }
939 
940   /// Build a new MacroDefined type.
941   QualType RebuildMacroQualifiedType(QualType T,
942                                      const IdentifierInfo *MacroII) {
943     return SemaRef.Context.getMacroQualifiedType(T, MacroII);
944   }
945 
946   /// Build a new class/struct/union type.
947   QualType RebuildRecordType(RecordDecl *Record) {
948     return SemaRef.Context.getTypeDeclType(Record);
949   }
950 
951   /// Build a new Enum type.
952   QualType RebuildEnumType(EnumDecl *Enum) {
953     return SemaRef.Context.getTypeDeclType(Enum);
954   }
955 
956   /// Build a new typeof(expr) type.
957   ///
958   /// By default, performs semantic analysis when building the typeof type.
959   /// Subclasses may override this routine to provide different behavior.
960   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
961 
962   /// Build a new typeof(type) type.
963   ///
964   /// By default, builds a new TypeOfType with the given underlying type.
965   QualType RebuildTypeOfType(QualType Underlying);
966 
967   /// Build a new unary transform type.
968   QualType RebuildUnaryTransformType(QualType BaseType,
969                                      UnaryTransformType::UTTKind UKind,
970                                      SourceLocation Loc);
971 
972   /// Build a new C++11 decltype type.
973   ///
974   /// By default, performs semantic analysis when building the decltype type.
975   /// Subclasses may override this routine to provide different behavior.
976   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
977 
978   /// Build a new C++11 auto type.
979   ///
980   /// By default, builds a new AutoType with the given deduced type.
981   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword,
982                            ConceptDecl *TypeConstraintConcept,
983                            ArrayRef<TemplateArgument> TypeConstraintArgs) {
984     // Note, IsDependent is always false here: we implicitly convert an 'auto'
985     // which has been deduced to a dependent type into an undeduced 'auto', so
986     // that we'll retry deduction after the transformation.
987     return SemaRef.Context.getAutoType(Deduced, Keyword,
988                                        /*IsDependent*/ false, /*IsPack=*/false,
989                                        TypeConstraintConcept,
990                                        TypeConstraintArgs);
991   }
992 
993   /// By default, builds a new DeducedTemplateSpecializationType with the given
994   /// deduced type.
995   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
996       QualType Deduced) {
997     return SemaRef.Context.getDeducedTemplateSpecializationType(
998         Template, Deduced, /*IsDependent*/ false);
999   }
1000 
1001   /// Build a new template specialization type.
1002   ///
1003   /// By default, performs semantic analysis when building the template
1004   /// specialization type. Subclasses may override this routine to provide
1005   /// different behavior.
1006   QualType RebuildTemplateSpecializationType(TemplateName Template,
1007                                              SourceLocation TemplateLoc,
1008                                              TemplateArgumentListInfo &Args);
1009 
1010   /// Build a new parenthesized type.
1011   ///
1012   /// By default, builds a new ParenType type from the inner type.
1013   /// Subclasses may override this routine to provide different behavior.
1014   QualType RebuildParenType(QualType InnerType) {
1015     return SemaRef.BuildParenType(InnerType);
1016   }
1017 
1018   /// Build a new qualified name type.
1019   ///
1020   /// By default, builds a new ElaboratedType type from the keyword,
1021   /// the nested-name-specifier and the named type.
1022   /// Subclasses may override this routine to provide different behavior.
1023   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
1024                                  ElaboratedTypeKeyword Keyword,
1025                                  NestedNameSpecifierLoc QualifierLoc,
1026                                  QualType Named) {
1027     return SemaRef.Context.getElaboratedType(Keyword,
1028                                          QualifierLoc.getNestedNameSpecifier(),
1029                                              Named);
1030   }
1031 
1032   /// Build a new typename type that refers to a template-id.
1033   ///
1034   /// By default, builds a new DependentNameType type from the
1035   /// nested-name-specifier and the given type. Subclasses may override
1036   /// this routine to provide different behavior.
1037   QualType RebuildDependentTemplateSpecializationType(
1038                                           ElaboratedTypeKeyword Keyword,
1039                                           NestedNameSpecifierLoc QualifierLoc,
1040                                           SourceLocation TemplateKWLoc,
1041                                           const IdentifierInfo *Name,
1042                                           SourceLocation NameLoc,
1043                                           TemplateArgumentListInfo &Args,
1044                                           bool AllowInjectedClassName) {
1045     // Rebuild the template name.
1046     // TODO: avoid TemplateName abstraction
1047     CXXScopeSpec SS;
1048     SS.Adopt(QualifierLoc);
1049     TemplateName InstName = getDerived().RebuildTemplateName(
1050         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
1051         AllowInjectedClassName);
1052 
1053     if (InstName.isNull())
1054       return QualType();
1055 
1056     // If it's still dependent, make a dependent specialization.
1057     if (InstName.getAsDependentTemplateName())
1058       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
1059                                           QualifierLoc.getNestedNameSpecifier(),
1060                                                                     Name,
1061                                                                     Args);
1062 
1063     // Otherwise, make an elaborated type wrapping a non-dependent
1064     // specialization.
1065     QualType T =
1066     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1067     if (T.isNull()) return QualType();
1068 
1069     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1070       return T;
1071 
1072     return SemaRef.Context.getElaboratedType(Keyword,
1073                                        QualifierLoc.getNestedNameSpecifier(),
1074                                              T);
1075   }
1076 
1077   /// Build a new typename type that refers to an identifier.
1078   ///
1079   /// By default, performs semantic analysis when building the typename type
1080   /// (or elaborated type). Subclasses may override this routine to provide
1081   /// different behavior.
1082   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1083                                     SourceLocation KeywordLoc,
1084                                     NestedNameSpecifierLoc QualifierLoc,
1085                                     const IdentifierInfo *Id,
1086                                     SourceLocation IdLoc,
1087                                     bool DeducedTSTContext) {
1088     CXXScopeSpec SS;
1089     SS.Adopt(QualifierLoc);
1090 
1091     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1092       // If the name is still dependent, just build a new dependent name type.
1093       if (!SemaRef.computeDeclContext(SS))
1094         return SemaRef.Context.getDependentNameType(Keyword,
1095                                           QualifierLoc.getNestedNameSpecifier(),
1096                                                     Id);
1097     }
1098 
1099     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1100       return SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1101                                        *Id, IdLoc, DeducedTSTContext);
1102     }
1103 
1104     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1105 
1106     // We had a dependent elaborated-type-specifier that has been transformed
1107     // into a non-dependent elaborated-type-specifier. Find the tag we're
1108     // referring to.
1109     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1110     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1111     if (!DC)
1112       return QualType();
1113 
1114     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1115       return QualType();
1116 
1117     TagDecl *Tag = nullptr;
1118     SemaRef.LookupQualifiedName(Result, DC);
1119     switch (Result.getResultKind()) {
1120       case LookupResult::NotFound:
1121       case LookupResult::NotFoundInCurrentInstantiation:
1122         break;
1123 
1124       case LookupResult::Found:
1125         Tag = Result.getAsSingle<TagDecl>();
1126         break;
1127 
1128       case LookupResult::FoundOverloaded:
1129       case LookupResult::FoundUnresolvedValue:
1130         llvm_unreachable("Tag lookup cannot find non-tags");
1131 
1132       case LookupResult::Ambiguous:
1133         // Let the LookupResult structure handle ambiguities.
1134         return QualType();
1135     }
1136 
1137     if (!Tag) {
1138       // Check where the name exists but isn't a tag type and use that to emit
1139       // better diagnostics.
1140       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1141       SemaRef.LookupQualifiedName(Result, DC);
1142       switch (Result.getResultKind()) {
1143         case LookupResult::Found:
1144         case LookupResult::FoundOverloaded:
1145         case LookupResult::FoundUnresolvedValue: {
1146           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1147           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1148           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1149                                                                << NTK << Kind;
1150           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1151           break;
1152         }
1153         default:
1154           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1155               << Kind << Id << DC << QualifierLoc.getSourceRange();
1156           break;
1157       }
1158       return QualType();
1159     }
1160 
1161     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1162                                               IdLoc, Id)) {
1163       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1164       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1165       return QualType();
1166     }
1167 
1168     // Build the elaborated-type-specifier type.
1169     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1170     return SemaRef.Context.getElaboratedType(Keyword,
1171                                          QualifierLoc.getNestedNameSpecifier(),
1172                                              T);
1173   }
1174 
1175   /// Build a new pack expansion type.
1176   ///
1177   /// By default, builds a new PackExpansionType type from the given pattern.
1178   /// Subclasses may override this routine to provide different behavior.
1179   QualType RebuildPackExpansionType(QualType Pattern,
1180                                     SourceRange PatternRange,
1181                                     SourceLocation EllipsisLoc,
1182                                     Optional<unsigned> NumExpansions) {
1183     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1184                                         NumExpansions);
1185   }
1186 
1187   /// Build a new atomic type given its value type.
1188   ///
1189   /// By default, performs semantic analysis when building the atomic type.
1190   /// Subclasses may override this routine to provide different behavior.
1191   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1192 
1193   /// Build a new pipe type given its value type.
1194   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1195                            bool isReadPipe);
1196 
1197    /// Build an extended int given its value type.
1198   QualType RebuildExtIntType(bool IsUnsigned, unsigned NumBits,
1199                              SourceLocation Loc);
1200 
1201   /// Build a dependent extended int given its value type.
1202   QualType RebuildDependentExtIntType(bool IsUnsigned, Expr *NumBitsExpr,
1203                                       SourceLocation Loc);
1204 
1205   /// Build a new template name given a nested name specifier, a flag
1206   /// indicating whether the "template" keyword was provided, and the template
1207   /// that the template name refers to.
1208   ///
1209   /// By default, builds the new template name directly. Subclasses may override
1210   /// this routine to provide different behavior.
1211   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1212                                    bool TemplateKW,
1213                                    TemplateDecl *Template);
1214 
1215   /// Build a new template name given a nested name specifier and the
1216   /// name that is referred to as a template.
1217   ///
1218   /// By default, performs semantic analysis to determine whether the name can
1219   /// be resolved to a specific template, then builds the appropriate kind of
1220   /// template name. Subclasses may override this routine to provide different
1221   /// behavior.
1222   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1223                                    SourceLocation TemplateKWLoc,
1224                                    const IdentifierInfo &Name,
1225                                    SourceLocation NameLoc, QualType ObjectType,
1226                                    NamedDecl *FirstQualifierInScope,
1227                                    bool AllowInjectedClassName);
1228 
1229   /// Build a new template name given a nested name specifier and the
1230   /// overloaded operator name that is referred to as a template.
1231   ///
1232   /// By default, performs semantic analysis to determine whether the name can
1233   /// be resolved to a specific template, then builds the appropriate kind of
1234   /// template name. Subclasses may override this routine to provide different
1235   /// behavior.
1236   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1237                                    SourceLocation TemplateKWLoc,
1238                                    OverloadedOperatorKind Operator,
1239                                    SourceLocation NameLoc, QualType ObjectType,
1240                                    bool AllowInjectedClassName);
1241 
1242   /// Build a new template name given a template template parameter pack
1243   /// and the
1244   ///
1245   /// By default, performs semantic analysis to determine whether the name can
1246   /// be resolved to a specific template, then builds the appropriate kind of
1247   /// template name. Subclasses may override this routine to provide different
1248   /// behavior.
1249   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1250                                    const TemplateArgument &ArgPack) {
1251     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1252   }
1253 
1254   /// Build a new compound statement.
1255   ///
1256   /// By default, performs semantic analysis to build the new statement.
1257   /// Subclasses may override this routine to provide different behavior.
1258   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1259                                        MultiStmtArg Statements,
1260                                        SourceLocation RBraceLoc,
1261                                        bool IsStmtExpr) {
1262     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1263                                        IsStmtExpr);
1264   }
1265 
1266   /// Build a new case statement.
1267   ///
1268   /// By default, performs semantic analysis to build the new statement.
1269   /// Subclasses may override this routine to provide different behavior.
1270   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1271                                    Expr *LHS,
1272                                    SourceLocation EllipsisLoc,
1273                                    Expr *RHS,
1274                                    SourceLocation ColonLoc) {
1275     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1276                                    ColonLoc);
1277   }
1278 
1279   /// Attach the body to a new case statement.
1280   ///
1281   /// By default, performs semantic analysis to build the new statement.
1282   /// Subclasses may override this routine to provide different behavior.
1283   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1284     getSema().ActOnCaseStmtBody(S, Body);
1285     return S;
1286   }
1287 
1288   /// Build a new default statement.
1289   ///
1290   /// By default, performs semantic analysis to build the new statement.
1291   /// Subclasses may override this routine to provide different behavior.
1292   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1293                                       SourceLocation ColonLoc,
1294                                       Stmt *SubStmt) {
1295     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1296                                       /*CurScope=*/nullptr);
1297   }
1298 
1299   /// Build a new label statement.
1300   ///
1301   /// By default, performs semantic analysis to build the new statement.
1302   /// Subclasses may override this routine to provide different behavior.
1303   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1304                               SourceLocation ColonLoc, Stmt *SubStmt) {
1305     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1306   }
1307 
1308   /// Build a new label statement.
1309   ///
1310   /// By default, performs semantic analysis to build the new statement.
1311   /// Subclasses may override this routine to provide different behavior.
1312   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1313                                    ArrayRef<const Attr*> Attrs,
1314                                    Stmt *SubStmt) {
1315     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1316   }
1317 
1318   /// Build a new "if" statement.
1319   ///
1320   /// By default, performs semantic analysis to build the new statement.
1321   /// Subclasses may override this routine to provide different behavior.
1322   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1323                            SourceLocation LParenLoc, Sema::ConditionResult Cond,
1324                            SourceLocation RParenLoc, Stmt *Init, Stmt *Then,
1325                            SourceLocation ElseLoc, Stmt *Else) {
1326     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, LParenLoc, Init, Cond,
1327                                  RParenLoc, Then, ElseLoc, Else);
1328   }
1329 
1330   /// Start building a new switch statement.
1331   ///
1332   /// By default, performs semantic analysis to build the new statement.
1333   /// Subclasses may override this routine to provide different behavior.
1334   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc,
1335                                     SourceLocation LParenLoc, Stmt *Init,
1336                                     Sema::ConditionResult Cond,
1337                                     SourceLocation RParenLoc) {
1338     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, LParenLoc, Init, Cond,
1339                                             RParenLoc);
1340   }
1341 
1342   /// Attach the body to the switch statement.
1343   ///
1344   /// By default, performs semantic analysis to build the new statement.
1345   /// Subclasses may override this routine to provide different behavior.
1346   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1347                                    Stmt *Switch, Stmt *Body) {
1348     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1349   }
1350 
1351   /// Build a new while statement.
1352   ///
1353   /// By default, performs semantic analysis to build the new statement.
1354   /// Subclasses may override this routine to provide different behavior.
1355   StmtResult RebuildWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc,
1356                               Sema::ConditionResult Cond,
1357                               SourceLocation RParenLoc, Stmt *Body) {
1358     return getSema().ActOnWhileStmt(WhileLoc, LParenLoc, Cond, RParenLoc, Body);
1359   }
1360 
1361   /// Build a new do-while statement.
1362   ///
1363   /// By default, performs semantic analysis to build the new statement.
1364   /// Subclasses may override this routine to provide different behavior.
1365   StmtResult RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1366                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1367                            Expr *Cond, SourceLocation RParenLoc) {
1368     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1369                                  Cond, RParenLoc);
1370   }
1371 
1372   /// Build a new for statement.
1373   ///
1374   /// By default, performs semantic analysis to build the new statement.
1375   /// Subclasses may override this routine to provide different behavior.
1376   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1377                             Stmt *Init, Sema::ConditionResult Cond,
1378                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1379                             Stmt *Body) {
1380     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1381                                   Inc, RParenLoc, Body);
1382   }
1383 
1384   /// Build a new goto statement.
1385   ///
1386   /// By default, performs semantic analysis to build the new statement.
1387   /// Subclasses may override this routine to provide different behavior.
1388   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1389                              LabelDecl *Label) {
1390     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1391   }
1392 
1393   /// Build a new indirect goto statement.
1394   ///
1395   /// By default, performs semantic analysis to build the new statement.
1396   /// Subclasses may override this routine to provide different behavior.
1397   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1398                                      SourceLocation StarLoc,
1399                                      Expr *Target) {
1400     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1401   }
1402 
1403   /// Build a new return statement.
1404   ///
1405   /// By default, performs semantic analysis to build the new statement.
1406   /// Subclasses may override this routine to provide different behavior.
1407   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1408     return getSema().BuildReturnStmt(ReturnLoc, Result);
1409   }
1410 
1411   /// Build a new declaration statement.
1412   ///
1413   /// By default, performs semantic analysis to build the new statement.
1414   /// Subclasses may override this routine to provide different behavior.
1415   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1416                              SourceLocation StartLoc, SourceLocation EndLoc) {
1417     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1418     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1419   }
1420 
1421   /// Build a new inline asm statement.
1422   ///
1423   /// By default, performs semantic analysis to build the new statement.
1424   /// Subclasses may override this routine to provide different behavior.
1425   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1426                                bool IsVolatile, unsigned NumOutputs,
1427                                unsigned NumInputs, IdentifierInfo **Names,
1428                                MultiExprArg Constraints, MultiExprArg Exprs,
1429                                Expr *AsmString, MultiExprArg Clobbers,
1430                                unsigned NumLabels,
1431                                SourceLocation RParenLoc) {
1432     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1433                                      NumInputs, Names, Constraints, Exprs,
1434                                      AsmString, Clobbers, NumLabels, RParenLoc);
1435   }
1436 
1437   /// Build a new MS style inline asm statement.
1438   ///
1439   /// By default, performs semantic analysis to build the new statement.
1440   /// Subclasses may override this routine to provide different behavior.
1441   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1442                               ArrayRef<Token> AsmToks,
1443                               StringRef AsmString,
1444                               unsigned NumOutputs, unsigned NumInputs,
1445                               ArrayRef<StringRef> Constraints,
1446                               ArrayRef<StringRef> Clobbers,
1447                               ArrayRef<Expr*> Exprs,
1448                               SourceLocation EndLoc) {
1449     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1450                                     NumOutputs, NumInputs,
1451                                     Constraints, Clobbers, Exprs, EndLoc);
1452   }
1453 
1454   /// Build a new co_return statement.
1455   ///
1456   /// By default, performs semantic analysis to build the new statement.
1457   /// Subclasses may override this routine to provide different behavior.
1458   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1459                                  bool IsImplicit) {
1460     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1461   }
1462 
1463   /// Build a new co_await expression.
1464   ///
1465   /// By default, performs semantic analysis to build the new expression.
1466   /// Subclasses may override this routine to provide different behavior.
1467   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1468                                 bool IsImplicit) {
1469     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1470   }
1471 
1472   /// Build a new co_await expression.
1473   ///
1474   /// By default, performs semantic analysis to build the new expression.
1475   /// Subclasses may override this routine to provide different behavior.
1476   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1477                                          Expr *Result,
1478                                          UnresolvedLookupExpr *Lookup) {
1479     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1480   }
1481 
1482   /// Build a new co_yield expression.
1483   ///
1484   /// By default, performs semantic analysis to build the new expression.
1485   /// Subclasses may override this routine to provide different behavior.
1486   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1487     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1488   }
1489 
1490   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1491     return getSema().BuildCoroutineBodyStmt(Args);
1492   }
1493 
1494   /// Build a new Objective-C \@try statement.
1495   ///
1496   /// By default, performs semantic analysis to build the new statement.
1497   /// Subclasses may override this routine to provide different behavior.
1498   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1499                                         Stmt *TryBody,
1500                                         MultiStmtArg CatchStmts,
1501                                         Stmt *Finally) {
1502     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1503                                         Finally);
1504   }
1505 
1506   /// Rebuild an Objective-C exception declaration.
1507   ///
1508   /// By default, performs semantic analysis to build the new declaration.
1509   /// Subclasses may override this routine to provide different behavior.
1510   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1511                                     TypeSourceInfo *TInfo, QualType T) {
1512     return getSema().BuildObjCExceptionDecl(TInfo, T,
1513                                             ExceptionDecl->getInnerLocStart(),
1514                                             ExceptionDecl->getLocation(),
1515                                             ExceptionDecl->getIdentifier());
1516   }
1517 
1518   /// Build a new Objective-C \@catch statement.
1519   ///
1520   /// By default, performs semantic analysis to build the new statement.
1521   /// Subclasses may override this routine to provide different behavior.
1522   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1523                                           SourceLocation RParenLoc,
1524                                           VarDecl *Var,
1525                                           Stmt *Body) {
1526     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1527                                           Var, Body);
1528   }
1529 
1530   /// Build a new Objective-C \@finally statement.
1531   ///
1532   /// By default, performs semantic analysis to build the new statement.
1533   /// Subclasses may override this routine to provide different behavior.
1534   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1535                                             Stmt *Body) {
1536     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1537   }
1538 
1539   /// Build a new Objective-C \@throw statement.
1540   ///
1541   /// By default, performs semantic analysis to build the new statement.
1542   /// Subclasses may override this routine to provide different behavior.
1543   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1544                                           Expr *Operand) {
1545     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1546   }
1547 
1548   /// Build a new OpenMP executable directive.
1549   ///
1550   /// By default, performs semantic analysis to build the new statement.
1551   /// Subclasses may override this routine to provide different behavior.
1552   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1553                                            DeclarationNameInfo DirName,
1554                                            OpenMPDirectiveKind CancelRegion,
1555                                            ArrayRef<OMPClause *> Clauses,
1556                                            Stmt *AStmt, SourceLocation StartLoc,
1557                                            SourceLocation EndLoc) {
1558     return getSema().ActOnOpenMPExecutableDirective(
1559         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1560   }
1561 
1562   /// Build a new OpenMP 'if' clause.
1563   ///
1564   /// By default, performs semantic analysis to build the new OpenMP clause.
1565   /// Subclasses may override this routine to provide different behavior.
1566   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1567                                 Expr *Condition, SourceLocation StartLoc,
1568                                 SourceLocation LParenLoc,
1569                                 SourceLocation NameModifierLoc,
1570                                 SourceLocation ColonLoc,
1571                                 SourceLocation EndLoc) {
1572     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1573                                          LParenLoc, NameModifierLoc, ColonLoc,
1574                                          EndLoc);
1575   }
1576 
1577   /// Build a new OpenMP 'final' clause.
1578   ///
1579   /// By default, performs semantic analysis to build the new OpenMP clause.
1580   /// Subclasses may override this routine to provide different behavior.
1581   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1582                                    SourceLocation LParenLoc,
1583                                    SourceLocation EndLoc) {
1584     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1585                                             EndLoc);
1586   }
1587 
1588   /// Build a new OpenMP 'num_threads' clause.
1589   ///
1590   /// By default, performs semantic analysis to build the new OpenMP clause.
1591   /// Subclasses may override this routine to provide different behavior.
1592   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1593                                         SourceLocation StartLoc,
1594                                         SourceLocation LParenLoc,
1595                                         SourceLocation EndLoc) {
1596     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1597                                                  LParenLoc, EndLoc);
1598   }
1599 
1600   /// Build a new OpenMP 'safelen' clause.
1601   ///
1602   /// By default, performs semantic analysis to build the new OpenMP clause.
1603   /// Subclasses may override this routine to provide different behavior.
1604   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1605                                      SourceLocation LParenLoc,
1606                                      SourceLocation EndLoc) {
1607     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1608   }
1609 
1610   /// Build a new OpenMP 'simdlen' clause.
1611   ///
1612   /// By default, performs semantic analysis to build the new OpenMP clause.
1613   /// Subclasses may override this routine to provide different behavior.
1614   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1615                                      SourceLocation LParenLoc,
1616                                      SourceLocation EndLoc) {
1617     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1618   }
1619 
1620   /// Build a new OpenMP 'allocator' clause.
1621   ///
1622   /// By default, performs semantic analysis to build the new OpenMP clause.
1623   /// Subclasses may override this routine to provide different behavior.
1624   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1625                                        SourceLocation LParenLoc,
1626                                        SourceLocation EndLoc) {
1627     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1628   }
1629 
1630   /// Build a new OpenMP 'collapse' clause.
1631   ///
1632   /// By default, performs semantic analysis to build the new OpenMP clause.
1633   /// Subclasses may override this routine to provide different behavior.
1634   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1635                                       SourceLocation LParenLoc,
1636                                       SourceLocation EndLoc) {
1637     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1638                                                EndLoc);
1639   }
1640 
1641   /// Build a new OpenMP 'default' clause.
1642   ///
1643   /// By default, performs semantic analysis to build the new OpenMP clause.
1644   /// Subclasses may override this routine to provide different behavior.
1645   OMPClause *RebuildOMPDefaultClause(DefaultKind Kind, SourceLocation KindKwLoc,
1646                                      SourceLocation StartLoc,
1647                                      SourceLocation LParenLoc,
1648                                      SourceLocation EndLoc) {
1649     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1650                                               StartLoc, LParenLoc, EndLoc);
1651   }
1652 
1653   /// Build a new OpenMP 'proc_bind' clause.
1654   ///
1655   /// By default, performs semantic analysis to build the new OpenMP clause.
1656   /// Subclasses may override this routine to provide different behavior.
1657   OMPClause *RebuildOMPProcBindClause(ProcBindKind Kind,
1658                                       SourceLocation KindKwLoc,
1659                                       SourceLocation StartLoc,
1660                                       SourceLocation LParenLoc,
1661                                       SourceLocation EndLoc) {
1662     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1663                                                StartLoc, LParenLoc, EndLoc);
1664   }
1665 
1666   /// Build a new OpenMP 'schedule' clause.
1667   ///
1668   /// By default, performs semantic analysis to build the new OpenMP clause.
1669   /// Subclasses may override this routine to provide different behavior.
1670   OMPClause *RebuildOMPScheduleClause(
1671       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1672       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1673       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1674       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1675     return getSema().ActOnOpenMPScheduleClause(
1676         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1677         CommaLoc, EndLoc);
1678   }
1679 
1680   /// Build a new OpenMP 'ordered' clause.
1681   ///
1682   /// By default, performs semantic analysis to build the new OpenMP clause.
1683   /// Subclasses may override this routine to provide different behavior.
1684   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1685                                      SourceLocation EndLoc,
1686                                      SourceLocation LParenLoc, Expr *Num) {
1687     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1688   }
1689 
1690   /// Build a new OpenMP 'private' clause.
1691   ///
1692   /// By default, performs semantic analysis to build the new OpenMP clause.
1693   /// Subclasses may override this routine to provide different behavior.
1694   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1695                                      SourceLocation StartLoc,
1696                                      SourceLocation LParenLoc,
1697                                      SourceLocation EndLoc) {
1698     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1699                                               EndLoc);
1700   }
1701 
1702   /// Build a new OpenMP 'firstprivate' clause.
1703   ///
1704   /// By default, performs semantic analysis to build the new OpenMP clause.
1705   /// Subclasses may override this routine to provide different behavior.
1706   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1707                                           SourceLocation StartLoc,
1708                                           SourceLocation LParenLoc,
1709                                           SourceLocation EndLoc) {
1710     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1711                                                    EndLoc);
1712   }
1713 
1714   /// Build a new OpenMP 'lastprivate' clause.
1715   ///
1716   /// By default, performs semantic analysis to build the new OpenMP clause.
1717   /// Subclasses may override this routine to provide different behavior.
1718   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1719                                          OpenMPLastprivateModifier LPKind,
1720                                          SourceLocation LPKindLoc,
1721                                          SourceLocation ColonLoc,
1722                                          SourceLocation StartLoc,
1723                                          SourceLocation LParenLoc,
1724                                          SourceLocation EndLoc) {
1725     return getSema().ActOnOpenMPLastprivateClause(
1726         VarList, LPKind, LPKindLoc, ColonLoc, StartLoc, LParenLoc, EndLoc);
1727   }
1728 
1729   /// Build a new OpenMP 'shared' clause.
1730   ///
1731   /// By default, performs semantic analysis to build the new OpenMP clause.
1732   /// Subclasses may override this routine to provide different behavior.
1733   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1734                                     SourceLocation StartLoc,
1735                                     SourceLocation LParenLoc,
1736                                     SourceLocation EndLoc) {
1737     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1738                                              EndLoc);
1739   }
1740 
1741   /// Build a new OpenMP 'reduction' clause.
1742   ///
1743   /// By default, performs semantic analysis to build the new statement.
1744   /// Subclasses may override this routine to provide different behavior.
1745   OMPClause *RebuildOMPReductionClause(
1746       ArrayRef<Expr *> VarList, OpenMPReductionClauseModifier Modifier,
1747       SourceLocation StartLoc, SourceLocation LParenLoc,
1748       SourceLocation ModifierLoc, SourceLocation ColonLoc,
1749       SourceLocation EndLoc, CXXScopeSpec &ReductionIdScopeSpec,
1750       const DeclarationNameInfo &ReductionId,
1751       ArrayRef<Expr *> UnresolvedReductions) {
1752     return getSema().ActOnOpenMPReductionClause(
1753         VarList, Modifier, StartLoc, LParenLoc, ModifierLoc, ColonLoc, EndLoc,
1754         ReductionIdScopeSpec, ReductionId, UnresolvedReductions);
1755   }
1756 
1757   /// Build a new OpenMP 'task_reduction' clause.
1758   ///
1759   /// By default, performs semantic analysis to build the new statement.
1760   /// Subclasses may override this routine to provide different behavior.
1761   OMPClause *RebuildOMPTaskReductionClause(
1762       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1763       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1764       CXXScopeSpec &ReductionIdScopeSpec,
1765       const DeclarationNameInfo &ReductionId,
1766       ArrayRef<Expr *> UnresolvedReductions) {
1767     return getSema().ActOnOpenMPTaskReductionClause(
1768         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1769         ReductionId, UnresolvedReductions);
1770   }
1771 
1772   /// Build a new OpenMP 'in_reduction' clause.
1773   ///
1774   /// By default, performs semantic analysis to build the new statement.
1775   /// Subclasses may override this routine to provide different behavior.
1776   OMPClause *
1777   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1778                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1779                               SourceLocation EndLoc,
1780                               CXXScopeSpec &ReductionIdScopeSpec,
1781                               const DeclarationNameInfo &ReductionId,
1782                               ArrayRef<Expr *> UnresolvedReductions) {
1783     return getSema().ActOnOpenMPInReductionClause(
1784         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1785         ReductionId, UnresolvedReductions);
1786   }
1787 
1788   /// Build a new OpenMP 'linear' clause.
1789   ///
1790   /// By default, performs semantic analysis to build the new OpenMP clause.
1791   /// Subclasses may override this routine to provide different behavior.
1792   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1793                                     SourceLocation StartLoc,
1794                                     SourceLocation LParenLoc,
1795                                     OpenMPLinearClauseKind Modifier,
1796                                     SourceLocation ModifierLoc,
1797                                     SourceLocation ColonLoc,
1798                                     SourceLocation EndLoc) {
1799     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1800                                              Modifier, ModifierLoc, ColonLoc,
1801                                              EndLoc);
1802   }
1803 
1804   /// Build a new OpenMP 'aligned' clause.
1805   ///
1806   /// By default, performs semantic analysis to build the new OpenMP clause.
1807   /// Subclasses may override this routine to provide different behavior.
1808   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1809                                      SourceLocation StartLoc,
1810                                      SourceLocation LParenLoc,
1811                                      SourceLocation ColonLoc,
1812                                      SourceLocation EndLoc) {
1813     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1814                                               LParenLoc, ColonLoc, EndLoc);
1815   }
1816 
1817   /// Build a new OpenMP 'copyin' clause.
1818   ///
1819   /// By default, performs semantic analysis to build the new OpenMP clause.
1820   /// Subclasses may override this routine to provide different behavior.
1821   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1822                                     SourceLocation StartLoc,
1823                                     SourceLocation LParenLoc,
1824                                     SourceLocation EndLoc) {
1825     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1826                                              EndLoc);
1827   }
1828 
1829   /// Build a new OpenMP 'copyprivate' clause.
1830   ///
1831   /// By default, performs semantic analysis to build the new OpenMP clause.
1832   /// Subclasses may override this routine to provide different behavior.
1833   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1834                                          SourceLocation StartLoc,
1835                                          SourceLocation LParenLoc,
1836                                          SourceLocation EndLoc) {
1837     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1838                                                   EndLoc);
1839   }
1840 
1841   /// Build a new OpenMP 'flush' pseudo clause.
1842   ///
1843   /// By default, performs semantic analysis to build the new OpenMP clause.
1844   /// Subclasses may override this routine to provide different behavior.
1845   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1846                                    SourceLocation StartLoc,
1847                                    SourceLocation LParenLoc,
1848                                    SourceLocation EndLoc) {
1849     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1850                                             EndLoc);
1851   }
1852 
1853   /// Build a new OpenMP 'depobj' pseudo clause.
1854   ///
1855   /// By default, performs semantic analysis to build the new OpenMP clause.
1856   /// Subclasses may override this routine to provide different behavior.
1857   OMPClause *RebuildOMPDepobjClause(Expr *Depobj, SourceLocation StartLoc,
1858                                     SourceLocation LParenLoc,
1859                                     SourceLocation EndLoc) {
1860     return getSema().ActOnOpenMPDepobjClause(Depobj, StartLoc, LParenLoc,
1861                                              EndLoc);
1862   }
1863 
1864   /// Build a new OpenMP 'depend' pseudo clause.
1865   ///
1866   /// By default, performs semantic analysis to build the new OpenMP clause.
1867   /// Subclasses may override this routine to provide different behavior.
1868   OMPClause *
1869   RebuildOMPDependClause(Expr *DepModifier, OpenMPDependClauseKind DepKind,
1870                          SourceLocation DepLoc, SourceLocation ColonLoc,
1871                          ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1872                          SourceLocation LParenLoc, SourceLocation EndLoc) {
1873     return getSema().ActOnOpenMPDependClause(DepModifier, DepKind, DepLoc,
1874                                              ColonLoc, VarList, StartLoc,
1875                                              LParenLoc, EndLoc);
1876   }
1877 
1878   /// Build a new OpenMP 'device' clause.
1879   ///
1880   /// By default, performs semantic analysis to build the new statement.
1881   /// Subclasses may override this routine to provide different behavior.
1882   OMPClause *RebuildOMPDeviceClause(OpenMPDeviceClauseModifier Modifier,
1883                                     Expr *Device, SourceLocation StartLoc,
1884                                     SourceLocation LParenLoc,
1885                                     SourceLocation ModifierLoc,
1886                                     SourceLocation EndLoc) {
1887     return getSema().ActOnOpenMPDeviceClause(Modifier, Device, StartLoc,
1888                                              LParenLoc, ModifierLoc, EndLoc);
1889   }
1890 
1891   /// Build a new OpenMP 'map' clause.
1892   ///
1893   /// By default, performs semantic analysis to build the new OpenMP clause.
1894   /// Subclasses may override this routine to provide different behavior.
1895   OMPClause *RebuildOMPMapClause(
1896       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1897       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1898       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1899       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1900       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1901       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1902     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1903                                           MapperIdScopeSpec, MapperId, MapType,
1904                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1905                                           VarList, Locs, UnresolvedMappers);
1906   }
1907 
1908   /// Build a new OpenMP 'allocate' clause.
1909   ///
1910   /// By default, performs semantic analysis to build the new OpenMP clause.
1911   /// Subclasses may override this routine to provide different behavior.
1912   OMPClause *RebuildOMPAllocateClause(Expr *Allocate, ArrayRef<Expr *> VarList,
1913                                       SourceLocation StartLoc,
1914                                       SourceLocation LParenLoc,
1915                                       SourceLocation ColonLoc,
1916                                       SourceLocation EndLoc) {
1917     return getSema().ActOnOpenMPAllocateClause(Allocate, VarList, StartLoc,
1918                                                LParenLoc, ColonLoc, EndLoc);
1919   }
1920 
1921   /// Build a new OpenMP 'num_teams' clause.
1922   ///
1923   /// By default, performs semantic analysis to build the new statement.
1924   /// Subclasses may override this routine to provide different behavior.
1925   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1926                                       SourceLocation LParenLoc,
1927                                       SourceLocation EndLoc) {
1928     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1929                                                EndLoc);
1930   }
1931 
1932   /// Build a new OpenMP 'thread_limit' clause.
1933   ///
1934   /// By default, performs semantic analysis to build the new statement.
1935   /// Subclasses may override this routine to provide different behavior.
1936   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1937                                          SourceLocation StartLoc,
1938                                          SourceLocation LParenLoc,
1939                                          SourceLocation EndLoc) {
1940     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1941                                                   LParenLoc, EndLoc);
1942   }
1943 
1944   /// Build a new OpenMP 'priority' clause.
1945   ///
1946   /// By default, performs semantic analysis to build the new statement.
1947   /// Subclasses may override this routine to provide different behavior.
1948   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1949                                       SourceLocation LParenLoc,
1950                                       SourceLocation EndLoc) {
1951     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1952                                                EndLoc);
1953   }
1954 
1955   /// Build a new OpenMP 'grainsize' clause.
1956   ///
1957   /// By default, performs semantic analysis to build the new statement.
1958   /// Subclasses may override this routine to provide different behavior.
1959   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1960                                        SourceLocation LParenLoc,
1961                                        SourceLocation EndLoc) {
1962     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1963                                                 EndLoc);
1964   }
1965 
1966   /// Build a new OpenMP 'num_tasks' clause.
1967   ///
1968   /// By default, performs semantic analysis to build the new statement.
1969   /// Subclasses may override this routine to provide different behavior.
1970   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1971                                       SourceLocation LParenLoc,
1972                                       SourceLocation EndLoc) {
1973     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1974                                                EndLoc);
1975   }
1976 
1977   /// Build a new OpenMP 'hint' clause.
1978   ///
1979   /// By default, performs semantic analysis to build the new statement.
1980   /// Subclasses may override this routine to provide different behavior.
1981   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1982                                   SourceLocation LParenLoc,
1983                                   SourceLocation EndLoc) {
1984     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1985   }
1986 
1987   /// Build a new OpenMP 'detach' clause.
1988   ///
1989   /// By default, performs semantic analysis to build the new statement.
1990   /// Subclasses may override this routine to provide different behavior.
1991   OMPClause *RebuildOMPDetachClause(Expr *Evt, SourceLocation StartLoc,
1992                                     SourceLocation LParenLoc,
1993                                     SourceLocation EndLoc) {
1994     return getSema().ActOnOpenMPDetachClause(Evt, StartLoc, LParenLoc, EndLoc);
1995   }
1996 
1997   /// Build a new OpenMP 'dist_schedule' clause.
1998   ///
1999   /// By default, performs semantic analysis to build the new OpenMP clause.
2000   /// Subclasses may override this routine to provide different behavior.
2001   OMPClause *
2002   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
2003                                Expr *ChunkSize, SourceLocation StartLoc,
2004                                SourceLocation LParenLoc, SourceLocation KindLoc,
2005                                SourceLocation CommaLoc, SourceLocation EndLoc) {
2006     return getSema().ActOnOpenMPDistScheduleClause(
2007         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
2008   }
2009 
2010   /// Build a new OpenMP 'to' clause.
2011   ///
2012   /// By default, performs semantic analysis to build the new statement.
2013   /// Subclasses may override this routine to provide different behavior.
2014   OMPClause *
2015   RebuildOMPToClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2016                      ArrayRef<SourceLocation> MotionModifiersLoc,
2017                      CXXScopeSpec &MapperIdScopeSpec,
2018                      DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2019                      ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2020                      ArrayRef<Expr *> UnresolvedMappers) {
2021     return getSema().ActOnOpenMPToClause(MotionModifiers, MotionModifiersLoc,
2022                                          MapperIdScopeSpec, MapperId, ColonLoc,
2023                                          VarList, Locs, UnresolvedMappers);
2024   }
2025 
2026   /// Build a new OpenMP 'from' clause.
2027   ///
2028   /// By default, performs semantic analysis to build the new statement.
2029   /// Subclasses may override this routine to provide different behavior.
2030   OMPClause *
2031   RebuildOMPFromClause(ArrayRef<OpenMPMotionModifierKind> MotionModifiers,
2032                        ArrayRef<SourceLocation> MotionModifiersLoc,
2033                        CXXScopeSpec &MapperIdScopeSpec,
2034                        DeclarationNameInfo &MapperId, SourceLocation ColonLoc,
2035                        ArrayRef<Expr *> VarList, const OMPVarListLocTy &Locs,
2036                        ArrayRef<Expr *> UnresolvedMappers) {
2037     return getSema().ActOnOpenMPFromClause(
2038         MotionModifiers, MotionModifiersLoc, MapperIdScopeSpec, MapperId,
2039         ColonLoc, VarList, Locs, UnresolvedMappers);
2040   }
2041 
2042   /// Build a new OpenMP 'use_device_ptr' clause.
2043   ///
2044   /// By default, performs semantic analysis to build the new OpenMP clause.
2045   /// Subclasses may override this routine to provide different behavior.
2046   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
2047                                           const OMPVarListLocTy &Locs) {
2048     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
2049   }
2050 
2051   /// Build a new OpenMP 'use_device_addr' clause.
2052   ///
2053   /// By default, performs semantic analysis to build the new OpenMP clause.
2054   /// Subclasses may override this routine to provide different behavior.
2055   OMPClause *RebuildOMPUseDeviceAddrClause(ArrayRef<Expr *> VarList,
2056                                            const OMPVarListLocTy &Locs) {
2057     return getSema().ActOnOpenMPUseDeviceAddrClause(VarList, Locs);
2058   }
2059 
2060   /// Build a new OpenMP 'is_device_ptr' clause.
2061   ///
2062   /// By default, performs semantic analysis to build the new OpenMP clause.
2063   /// Subclasses may override this routine to provide different behavior.
2064   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
2065                                          const OMPVarListLocTy &Locs) {
2066     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
2067   }
2068 
2069   /// Build a new OpenMP 'defaultmap' clause.
2070   ///
2071   /// By default, performs semantic analysis to build the new OpenMP clause.
2072   /// Subclasses may override this routine to provide different behavior.
2073   OMPClause *RebuildOMPDefaultmapClause(OpenMPDefaultmapClauseModifier M,
2074                                         OpenMPDefaultmapClauseKind Kind,
2075                                         SourceLocation StartLoc,
2076                                         SourceLocation LParenLoc,
2077                                         SourceLocation MLoc,
2078                                         SourceLocation KindLoc,
2079                                         SourceLocation EndLoc) {
2080     return getSema().ActOnOpenMPDefaultmapClause(M, Kind, StartLoc, LParenLoc,
2081                                                  MLoc, KindLoc, EndLoc);
2082   }
2083 
2084   /// Build a new OpenMP 'nontemporal' clause.
2085   ///
2086   /// By default, performs semantic analysis to build the new OpenMP clause.
2087   /// Subclasses may override this routine to provide different behavior.
2088   OMPClause *RebuildOMPNontemporalClause(ArrayRef<Expr *> VarList,
2089                                          SourceLocation StartLoc,
2090                                          SourceLocation LParenLoc,
2091                                          SourceLocation EndLoc) {
2092     return getSema().ActOnOpenMPNontemporalClause(VarList, StartLoc, LParenLoc,
2093                                                   EndLoc);
2094   }
2095 
2096   /// Build a new OpenMP 'inclusive' clause.
2097   ///
2098   /// By default, performs semantic analysis to build the new OpenMP clause.
2099   /// Subclasses may override this routine to provide different behavior.
2100   OMPClause *RebuildOMPInclusiveClause(ArrayRef<Expr *> VarList,
2101                                        SourceLocation StartLoc,
2102                                        SourceLocation LParenLoc,
2103                                        SourceLocation EndLoc) {
2104     return getSema().ActOnOpenMPInclusiveClause(VarList, StartLoc, LParenLoc,
2105                                                 EndLoc);
2106   }
2107 
2108   /// Build a new OpenMP 'exclusive' clause.
2109   ///
2110   /// By default, performs semantic analysis to build the new OpenMP clause.
2111   /// Subclasses may override this routine to provide different behavior.
2112   OMPClause *RebuildOMPExclusiveClause(ArrayRef<Expr *> VarList,
2113                                        SourceLocation StartLoc,
2114                                        SourceLocation LParenLoc,
2115                                        SourceLocation EndLoc) {
2116     return getSema().ActOnOpenMPExclusiveClause(VarList, StartLoc, LParenLoc,
2117                                                 EndLoc);
2118   }
2119 
2120   /// Build a new OpenMP 'uses_allocators' clause.
2121   ///
2122   /// By default, performs semantic analysis to build the new OpenMP clause.
2123   /// Subclasses may override this routine to provide different behavior.
2124   OMPClause *RebuildOMPUsesAllocatorsClause(
2125       ArrayRef<Sema::UsesAllocatorsData> Data, SourceLocation StartLoc,
2126       SourceLocation LParenLoc, SourceLocation EndLoc) {
2127     return getSema().ActOnOpenMPUsesAllocatorClause(StartLoc, LParenLoc, EndLoc,
2128                                                     Data);
2129   }
2130 
2131   /// Build a new OpenMP 'affinity' clause.
2132   ///
2133   /// By default, performs semantic analysis to build the new OpenMP clause.
2134   /// Subclasses may override this routine to provide different behavior.
2135   OMPClause *RebuildOMPAffinityClause(SourceLocation StartLoc,
2136                                       SourceLocation LParenLoc,
2137                                       SourceLocation ColonLoc,
2138                                       SourceLocation EndLoc, Expr *Modifier,
2139                                       ArrayRef<Expr *> Locators) {
2140     return getSema().ActOnOpenMPAffinityClause(StartLoc, LParenLoc, ColonLoc,
2141                                                EndLoc, Modifier, Locators);
2142   }
2143 
2144   /// Build a new OpenMP 'order' clause.
2145   ///
2146   /// By default, performs semantic analysis to build the new OpenMP clause.
2147   /// Subclasses may override this routine to provide different behavior.
2148   OMPClause *RebuildOMPOrderClause(OpenMPOrderClauseKind Kind,
2149                                    SourceLocation KindKwLoc,
2150                                    SourceLocation StartLoc,
2151                                    SourceLocation LParenLoc,
2152                                    SourceLocation EndLoc) {
2153     return getSema().ActOnOpenMPOrderClause(Kind, KindKwLoc, StartLoc,
2154                                             LParenLoc, EndLoc);
2155   }
2156 
2157   /// Rebuild the operand to an Objective-C \@synchronized statement.
2158   ///
2159   /// By default, performs semantic analysis to build the new statement.
2160   /// Subclasses may override this routine to provide different behavior.
2161   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
2162                                               Expr *object) {
2163     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
2164   }
2165 
2166   /// Build a new Objective-C \@synchronized statement.
2167   ///
2168   /// By default, performs semantic analysis to build the new statement.
2169   /// Subclasses may override this routine to provide different behavior.
2170   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
2171                                            Expr *Object, Stmt *Body) {
2172     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
2173   }
2174 
2175   /// Build a new Objective-C \@autoreleasepool statement.
2176   ///
2177   /// By default, performs semantic analysis to build the new statement.
2178   /// Subclasses may override this routine to provide different behavior.
2179   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
2180                                             Stmt *Body) {
2181     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
2182   }
2183 
2184   /// Build a new Objective-C fast enumeration statement.
2185   ///
2186   /// By default, performs semantic analysis to build the new statement.
2187   /// Subclasses may override this routine to provide different behavior.
2188   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
2189                                           Stmt *Element,
2190                                           Expr *Collection,
2191                                           SourceLocation RParenLoc,
2192                                           Stmt *Body) {
2193     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
2194                                                 Element,
2195                                                 Collection,
2196                                                 RParenLoc);
2197     if (ForEachStmt.isInvalid())
2198       return StmtError();
2199 
2200     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
2201   }
2202 
2203   /// Build a new C++ exception declaration.
2204   ///
2205   /// By default, performs semantic analysis to build the new decaration.
2206   /// Subclasses may override this routine to provide different behavior.
2207   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2208                                 TypeSourceInfo *Declarator,
2209                                 SourceLocation StartLoc,
2210                                 SourceLocation IdLoc,
2211                                 IdentifierInfo *Id) {
2212     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2213                                                        StartLoc, IdLoc, Id);
2214     if (Var)
2215       getSema().CurContext->addDecl(Var);
2216     return Var;
2217   }
2218 
2219   /// Build a new C++ catch statement.
2220   ///
2221   /// By default, performs semantic analysis to build the new statement.
2222   /// Subclasses may override this routine to provide different behavior.
2223   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2224                                  VarDecl *ExceptionDecl,
2225                                  Stmt *Handler) {
2226     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2227                                                       Handler));
2228   }
2229 
2230   /// Build a new C++ try statement.
2231   ///
2232   /// By default, performs semantic analysis to build the new statement.
2233   /// Subclasses may override this routine to provide different behavior.
2234   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2235                                ArrayRef<Stmt *> Handlers) {
2236     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2237   }
2238 
2239   /// Build a new C++0x range-based for statement.
2240   ///
2241   /// By default, performs semantic analysis to build the new statement.
2242   /// Subclasses may override this routine to provide different behavior.
2243   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2244                                     SourceLocation CoawaitLoc, Stmt *Init,
2245                                     SourceLocation ColonLoc, Stmt *Range,
2246                                     Stmt *Begin, Stmt *End, Expr *Cond,
2247                                     Expr *Inc, Stmt *LoopVar,
2248                                     SourceLocation RParenLoc) {
2249     // If we've just learned that the range is actually an Objective-C
2250     // collection, treat this as an Objective-C fast enumeration loop.
2251     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2252       if (RangeStmt->isSingleDecl()) {
2253         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2254           if (RangeVar->isInvalidDecl())
2255             return StmtError();
2256 
2257           Expr *RangeExpr = RangeVar->getInit();
2258           if (!RangeExpr->isTypeDependent() &&
2259               RangeExpr->getType()->isObjCObjectPointerType()) {
2260             // FIXME: Support init-statements in Objective-C++20 ranged for
2261             // statement.
2262             if (Init) {
2263               return SemaRef.Diag(Init->getBeginLoc(),
2264                                   diag::err_objc_for_range_init_stmt)
2265                          << Init->getSourceRange();
2266             }
2267             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2268                                                         RangeExpr, RParenLoc);
2269           }
2270         }
2271       }
2272     }
2273 
2274     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2275                                           Range, Begin, End, Cond, Inc, LoopVar,
2276                                           RParenLoc, Sema::BFRK_Rebuild);
2277   }
2278 
2279   /// Build a new C++0x range-based for statement.
2280   ///
2281   /// By default, performs semantic analysis to build the new statement.
2282   /// Subclasses may override this routine to provide different behavior.
2283   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2284                                           bool IsIfExists,
2285                                           NestedNameSpecifierLoc QualifierLoc,
2286                                           DeclarationNameInfo NameInfo,
2287                                           Stmt *Nested) {
2288     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2289                                                 QualifierLoc, NameInfo, Nested);
2290   }
2291 
2292   /// Attach body to a C++0x range-based for statement.
2293   ///
2294   /// By default, performs semantic analysis to finish the new statement.
2295   /// Subclasses may override this routine to provide different behavior.
2296   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2297     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2298   }
2299 
2300   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2301                                Stmt *TryBlock, Stmt *Handler) {
2302     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2303   }
2304 
2305   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2306                                   Stmt *Block) {
2307     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2308   }
2309 
2310   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2311     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2312   }
2313 
2314   /// Build a new predefined expression.
2315   ///
2316   /// By default, performs semantic analysis to build the new expression.
2317   /// Subclasses may override this routine to provide different behavior.
2318   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2319                                    PredefinedExpr::IdentKind IK) {
2320     return getSema().BuildPredefinedExpr(Loc, IK);
2321   }
2322 
2323   /// Build a new expression that references a declaration.
2324   ///
2325   /// By default, performs semantic analysis to build the new expression.
2326   /// Subclasses may override this routine to provide different behavior.
2327   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2328                                         LookupResult &R,
2329                                         bool RequiresADL) {
2330     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2331   }
2332 
2333 
2334   /// Build a new expression that references a declaration.
2335   ///
2336   /// By default, performs semantic analysis to build the new expression.
2337   /// Subclasses may override this routine to provide different behavior.
2338   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2339                                 ValueDecl *VD,
2340                                 const DeclarationNameInfo &NameInfo,
2341                                 NamedDecl *Found,
2342                                 TemplateArgumentListInfo *TemplateArgs) {
2343     CXXScopeSpec SS;
2344     SS.Adopt(QualifierLoc);
2345     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD, Found,
2346                                               TemplateArgs);
2347   }
2348 
2349   /// Build a new expression in parentheses.
2350   ///
2351   /// By default, performs semantic analysis to build the new expression.
2352   /// Subclasses may override this routine to provide different behavior.
2353   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2354                                     SourceLocation RParen) {
2355     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2356   }
2357 
2358   /// Build a new pseudo-destructor expression.
2359   ///
2360   /// By default, performs semantic analysis to build the new expression.
2361   /// Subclasses may override this routine to provide different behavior.
2362   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2363                                             SourceLocation OperatorLoc,
2364                                             bool isArrow,
2365                                             CXXScopeSpec &SS,
2366                                             TypeSourceInfo *ScopeType,
2367                                             SourceLocation CCLoc,
2368                                             SourceLocation TildeLoc,
2369                                         PseudoDestructorTypeStorage Destroyed);
2370 
2371   /// Build a new unary operator expression.
2372   ///
2373   /// By default, performs semantic analysis to build the new expression.
2374   /// Subclasses may override this routine to provide different behavior.
2375   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2376                                         UnaryOperatorKind Opc,
2377                                         Expr *SubExpr) {
2378     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2379   }
2380 
2381   /// Build a new builtin offsetof expression.
2382   ///
2383   /// By default, performs semantic analysis to build the new expression.
2384   /// Subclasses may override this routine to provide different behavior.
2385   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2386                                  TypeSourceInfo *Type,
2387                                  ArrayRef<Sema::OffsetOfComponent> Components,
2388                                  SourceLocation RParenLoc) {
2389     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2390                                           RParenLoc);
2391   }
2392 
2393   /// Build a new sizeof, alignof or vec_step expression with a
2394   /// type argument.
2395   ///
2396   /// By default, performs semantic analysis to build the new expression.
2397   /// Subclasses may override this routine to provide different behavior.
2398   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2399                                          SourceLocation OpLoc,
2400                                          UnaryExprOrTypeTrait ExprKind,
2401                                          SourceRange R) {
2402     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2403   }
2404 
2405   /// Build a new sizeof, alignof or vec step expression with an
2406   /// expression argument.
2407   ///
2408   /// By default, performs semantic analysis to build the new expression.
2409   /// Subclasses may override this routine to provide different behavior.
2410   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2411                                          UnaryExprOrTypeTrait ExprKind,
2412                                          SourceRange R) {
2413     ExprResult Result
2414       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2415     if (Result.isInvalid())
2416       return ExprError();
2417 
2418     return Result;
2419   }
2420 
2421   /// Build a new array subscript expression.
2422   ///
2423   /// By default, performs semantic analysis to build the new expression.
2424   /// Subclasses may override this routine to provide different behavior.
2425   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2426                                              SourceLocation LBracketLoc,
2427                                              Expr *RHS,
2428                                              SourceLocation RBracketLoc) {
2429     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2430                                              LBracketLoc, RHS,
2431                                              RBracketLoc);
2432   }
2433 
2434   /// Build a new matrix subscript expression.
2435   ///
2436   /// By default, performs semantic analysis to build the new expression.
2437   /// Subclasses may override this routine to provide different behavior.
2438   ExprResult RebuildMatrixSubscriptExpr(Expr *Base, Expr *RowIdx,
2439                                         Expr *ColumnIdx,
2440                                         SourceLocation RBracketLoc) {
2441     return getSema().CreateBuiltinMatrixSubscriptExpr(Base, RowIdx, ColumnIdx,
2442                                                       RBracketLoc);
2443   }
2444 
2445   /// Build a new array section expression.
2446   ///
2447   /// By default, performs semantic analysis to build the new expression.
2448   /// Subclasses may override this routine to provide different behavior.
2449   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2450                                         Expr *LowerBound,
2451                                         SourceLocation ColonLocFirst,
2452                                         SourceLocation ColonLocSecond,
2453                                         Expr *Length, Expr *Stride,
2454                                         SourceLocation RBracketLoc) {
2455     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2456                                               ColonLocFirst, ColonLocSecond,
2457                                               Length, Stride, RBracketLoc);
2458   }
2459 
2460   /// Build a new array shaping expression.
2461   ///
2462   /// By default, performs semantic analysis to build the new expression.
2463   /// Subclasses may override this routine to provide different behavior.
2464   ExprResult RebuildOMPArrayShapingExpr(Expr *Base, SourceLocation LParenLoc,
2465                                         SourceLocation RParenLoc,
2466                                         ArrayRef<Expr *> Dims,
2467                                         ArrayRef<SourceRange> BracketsRanges) {
2468     return getSema().ActOnOMPArrayShapingExpr(Base, LParenLoc, RParenLoc, Dims,
2469                                               BracketsRanges);
2470   }
2471 
2472   /// Build a new iterator expression.
2473   ///
2474   /// By default, performs semantic analysis to build the new expression.
2475   /// Subclasses may override this routine to provide different behavior.
2476   ExprResult RebuildOMPIteratorExpr(
2477       SourceLocation IteratorKwLoc, SourceLocation LLoc, SourceLocation RLoc,
2478       ArrayRef<Sema::OMPIteratorData> Data) {
2479     return getSema().ActOnOMPIteratorExpr(/*Scope=*/nullptr, IteratorKwLoc,
2480                                           LLoc, RLoc, Data);
2481   }
2482 
2483   /// Build a new call expression.
2484   ///
2485   /// By default, performs semantic analysis to build the new expression.
2486   /// Subclasses may override this routine to provide different behavior.
2487   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2488                                    MultiExprArg Args,
2489                                    SourceLocation RParenLoc,
2490                                    Expr *ExecConfig = nullptr) {
2491     return getSema().ActOnCallExpr(
2492         /*Scope=*/nullptr, Callee, LParenLoc, Args, RParenLoc, ExecConfig);
2493   }
2494 
2495   /// Build a new member access expression.
2496   ///
2497   /// By default, performs semantic analysis to build the new expression.
2498   /// Subclasses may override this routine to provide different behavior.
2499   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2500                                bool isArrow,
2501                                NestedNameSpecifierLoc QualifierLoc,
2502                                SourceLocation TemplateKWLoc,
2503                                const DeclarationNameInfo &MemberNameInfo,
2504                                ValueDecl *Member,
2505                                NamedDecl *FoundDecl,
2506                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2507                                NamedDecl *FirstQualifierInScope) {
2508     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2509                                                                       isArrow);
2510     if (!Member->getDeclName()) {
2511       // We have a reference to an unnamed field.  This is always the
2512       // base of an anonymous struct/union member access, i.e. the
2513       // field is always of record type.
2514       assert(Member->getType()->isRecordType() &&
2515              "unnamed member not of record type?");
2516 
2517       BaseResult =
2518         getSema().PerformObjectMemberConversion(BaseResult.get(),
2519                                                 QualifierLoc.getNestedNameSpecifier(),
2520                                                 FoundDecl, Member);
2521       if (BaseResult.isInvalid())
2522         return ExprError();
2523       Base = BaseResult.get();
2524 
2525       CXXScopeSpec EmptySS;
2526       return getSema().BuildFieldReferenceExpr(
2527           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2528           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2529     }
2530 
2531     CXXScopeSpec SS;
2532     SS.Adopt(QualifierLoc);
2533 
2534     Base = BaseResult.get();
2535     QualType BaseType = Base->getType();
2536 
2537     if (isArrow && !BaseType->isPointerType())
2538       return ExprError();
2539 
2540     // FIXME: this involves duplicating earlier analysis in a lot of
2541     // cases; we should avoid this when possible.
2542     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2543     R.addDecl(FoundDecl);
2544     R.resolveKind();
2545 
2546     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2547                                               SS, TemplateKWLoc,
2548                                               FirstQualifierInScope,
2549                                               R, ExplicitTemplateArgs,
2550                                               /*S*/nullptr);
2551   }
2552 
2553   /// Build a new binary operator expression.
2554   ///
2555   /// By default, performs semantic analysis to build the new expression.
2556   /// Subclasses may override this routine to provide different behavior.
2557   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2558                                          BinaryOperatorKind Opc,
2559                                          Expr *LHS, Expr *RHS) {
2560     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2561   }
2562 
2563   /// Build a new rewritten operator expression.
2564   ///
2565   /// By default, performs semantic analysis to build the new expression.
2566   /// Subclasses may override this routine to provide different behavior.
2567   ExprResult RebuildCXXRewrittenBinaryOperator(
2568       SourceLocation OpLoc, BinaryOperatorKind Opcode,
2569       const UnresolvedSetImpl &UnqualLookups, Expr *LHS, Expr *RHS) {
2570     return getSema().CreateOverloadedBinOp(OpLoc, Opcode, UnqualLookups, LHS,
2571                                            RHS, /*RequiresADL*/false);
2572   }
2573 
2574   /// Build a new conditional operator expression.
2575   ///
2576   /// By default, performs semantic analysis to build the new expression.
2577   /// Subclasses may override this routine to provide different behavior.
2578   ExprResult RebuildConditionalOperator(Expr *Cond,
2579                                         SourceLocation QuestionLoc,
2580                                         Expr *LHS,
2581                                         SourceLocation ColonLoc,
2582                                         Expr *RHS) {
2583     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2584                                         LHS, RHS);
2585   }
2586 
2587   /// Build a new C-style cast expression.
2588   ///
2589   /// By default, performs semantic analysis to build the new expression.
2590   /// Subclasses may override this routine to provide different behavior.
2591   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2592                                          TypeSourceInfo *TInfo,
2593                                          SourceLocation RParenLoc,
2594                                          Expr *SubExpr) {
2595     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2596                                          SubExpr);
2597   }
2598 
2599   /// Build a new compound literal expression.
2600   ///
2601   /// By default, performs semantic analysis to build the new expression.
2602   /// Subclasses may override this routine to provide different behavior.
2603   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2604                                               TypeSourceInfo *TInfo,
2605                                               SourceLocation RParenLoc,
2606                                               Expr *Init) {
2607     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2608                                               Init);
2609   }
2610 
2611   /// Build a new extended vector element access expression.
2612   ///
2613   /// By default, performs semantic analysis to build the new expression.
2614   /// Subclasses may override this routine to provide different behavior.
2615   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2616                                                SourceLocation OpLoc,
2617                                                SourceLocation AccessorLoc,
2618                                                IdentifierInfo &Accessor) {
2619 
2620     CXXScopeSpec SS;
2621     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2622     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2623                                               OpLoc, /*IsArrow*/ false,
2624                                               SS, SourceLocation(),
2625                                               /*FirstQualifierInScope*/ nullptr,
2626                                               NameInfo,
2627                                               /* TemplateArgs */ nullptr,
2628                                               /*S*/ nullptr);
2629   }
2630 
2631   /// Build a new initializer list expression.
2632   ///
2633   /// By default, performs semantic analysis to build the new expression.
2634   /// Subclasses may override this routine to provide different behavior.
2635   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2636                              MultiExprArg Inits,
2637                              SourceLocation RBraceLoc) {
2638     return SemaRef.BuildInitList(LBraceLoc, Inits, RBraceLoc);
2639   }
2640 
2641   /// Build a new designated initializer expression.
2642   ///
2643   /// By default, performs semantic analysis to build the new expression.
2644   /// Subclasses may override this routine to provide different behavior.
2645   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2646                                              MultiExprArg ArrayExprs,
2647                                              SourceLocation EqualOrColonLoc,
2648                                              bool GNUSyntax,
2649                                              Expr *Init) {
2650     ExprResult Result
2651       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2652                                            Init);
2653     if (Result.isInvalid())
2654       return ExprError();
2655 
2656     return Result;
2657   }
2658 
2659   /// Build a new value-initialized expression.
2660   ///
2661   /// By default, builds the implicit value initialization without performing
2662   /// any semantic analysis. Subclasses may override this routine to provide
2663   /// different behavior.
2664   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2665     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2666   }
2667 
2668   /// Build a new \c va_arg expression.
2669   ///
2670   /// By default, performs semantic analysis to build the new expression.
2671   /// Subclasses may override this routine to provide different behavior.
2672   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2673                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2674                                     SourceLocation RParenLoc) {
2675     return getSema().BuildVAArgExpr(BuiltinLoc,
2676                                     SubExpr, TInfo,
2677                                     RParenLoc);
2678   }
2679 
2680   /// Build a new expression list in parentheses.
2681   ///
2682   /// By default, performs semantic analysis to build the new expression.
2683   /// Subclasses may override this routine to provide different behavior.
2684   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2685                                   MultiExprArg SubExprs,
2686                                   SourceLocation RParenLoc) {
2687     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2688   }
2689 
2690   /// Build a new address-of-label expression.
2691   ///
2692   /// By default, performs semantic analysis, using the name of the label
2693   /// rather than attempting to map the label statement itself.
2694   /// Subclasses may override this routine to provide different behavior.
2695   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2696                                   SourceLocation LabelLoc, LabelDecl *Label) {
2697     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2698   }
2699 
2700   /// Build a new GNU statement expression.
2701   ///
2702   /// By default, performs semantic analysis to build the new expression.
2703   /// Subclasses may override this routine to provide different behavior.
2704   ExprResult RebuildStmtExpr(SourceLocation LParenLoc, Stmt *SubStmt,
2705                              SourceLocation RParenLoc, unsigned TemplateDepth) {
2706     return getSema().BuildStmtExpr(LParenLoc, SubStmt, RParenLoc,
2707                                    TemplateDepth);
2708   }
2709 
2710   /// Build a new __builtin_choose_expr expression.
2711   ///
2712   /// By default, performs semantic analysis to build the new expression.
2713   /// Subclasses may override this routine to provide different behavior.
2714   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2715                                      Expr *Cond, Expr *LHS, Expr *RHS,
2716                                      SourceLocation RParenLoc) {
2717     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2718                                    Cond, LHS, RHS,
2719                                    RParenLoc);
2720   }
2721 
2722   /// Build a new generic selection expression.
2723   ///
2724   /// By default, performs semantic analysis to build the new expression.
2725   /// Subclasses may override this routine to provide different behavior.
2726   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2727                                          SourceLocation DefaultLoc,
2728                                          SourceLocation RParenLoc,
2729                                          Expr *ControllingExpr,
2730                                          ArrayRef<TypeSourceInfo *> Types,
2731                                          ArrayRef<Expr *> Exprs) {
2732     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2733                                                 ControllingExpr, Types, Exprs);
2734   }
2735 
2736   /// Build a new overloaded operator call expression.
2737   ///
2738   /// By default, performs semantic analysis to build the new expression.
2739   /// The semantic analysis provides the behavior of template instantiation,
2740   /// copying with transformations that turn what looks like an overloaded
2741   /// operator call into a use of a builtin operator, performing
2742   /// argument-dependent lookup, etc. Subclasses may override this routine to
2743   /// provide different behavior.
2744   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2745                                               SourceLocation OpLoc,
2746                                               Expr *Callee,
2747                                               Expr *First,
2748                                               Expr *Second);
2749 
2750   /// Build a new C++ "named" cast expression, such as static_cast or
2751   /// reinterpret_cast.
2752   ///
2753   /// By default, this routine dispatches to one of the more-specific routines
2754   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2755   /// Subclasses may override this routine to provide different behavior.
2756   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2757                                            Stmt::StmtClass Class,
2758                                            SourceLocation LAngleLoc,
2759                                            TypeSourceInfo *TInfo,
2760                                            SourceLocation RAngleLoc,
2761                                            SourceLocation LParenLoc,
2762                                            Expr *SubExpr,
2763                                            SourceLocation RParenLoc) {
2764     switch (Class) {
2765     case Stmt::CXXStaticCastExprClass:
2766       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2767                                                    RAngleLoc, LParenLoc,
2768                                                    SubExpr, RParenLoc);
2769 
2770     case Stmt::CXXDynamicCastExprClass:
2771       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2772                                                     RAngleLoc, LParenLoc,
2773                                                     SubExpr, RParenLoc);
2774 
2775     case Stmt::CXXReinterpretCastExprClass:
2776       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2777                                                         RAngleLoc, LParenLoc,
2778                                                         SubExpr,
2779                                                         RParenLoc);
2780 
2781     case Stmt::CXXConstCastExprClass:
2782       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2783                                                    RAngleLoc, LParenLoc,
2784                                                    SubExpr, RParenLoc);
2785 
2786     case Stmt::CXXAddrspaceCastExprClass:
2787       return getDerived().RebuildCXXAddrspaceCastExpr(
2788           OpLoc, LAngleLoc, TInfo, RAngleLoc, LParenLoc, SubExpr, RParenLoc);
2789 
2790     default:
2791       llvm_unreachable("Invalid C++ named cast");
2792     }
2793   }
2794 
2795   /// Build a new C++ static_cast expression.
2796   ///
2797   /// By default, performs semantic analysis to build the new expression.
2798   /// Subclasses may override this routine to provide different behavior.
2799   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2800                                             SourceLocation LAngleLoc,
2801                                             TypeSourceInfo *TInfo,
2802                                             SourceLocation RAngleLoc,
2803                                             SourceLocation LParenLoc,
2804                                             Expr *SubExpr,
2805                                             SourceLocation RParenLoc) {
2806     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2807                                        TInfo, SubExpr,
2808                                        SourceRange(LAngleLoc, RAngleLoc),
2809                                        SourceRange(LParenLoc, RParenLoc));
2810   }
2811 
2812   /// Build a new C++ dynamic_cast expression.
2813   ///
2814   /// By default, performs semantic analysis to build the new expression.
2815   /// Subclasses may override this routine to provide different behavior.
2816   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2817                                              SourceLocation LAngleLoc,
2818                                              TypeSourceInfo *TInfo,
2819                                              SourceLocation RAngleLoc,
2820                                              SourceLocation LParenLoc,
2821                                              Expr *SubExpr,
2822                                              SourceLocation RParenLoc) {
2823     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2824                                        TInfo, SubExpr,
2825                                        SourceRange(LAngleLoc, RAngleLoc),
2826                                        SourceRange(LParenLoc, RParenLoc));
2827   }
2828 
2829   /// Build a new C++ reinterpret_cast expression.
2830   ///
2831   /// By default, performs semantic analysis to build the new expression.
2832   /// Subclasses may override this routine to provide different behavior.
2833   ExprResult RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2834                                                  SourceLocation LAngleLoc,
2835                                                  TypeSourceInfo *TInfo,
2836                                                  SourceLocation RAngleLoc,
2837                                                  SourceLocation LParenLoc,
2838                                                  Expr *SubExpr,
2839                                                  SourceLocation RParenLoc) {
2840     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2841                                        TInfo, SubExpr,
2842                                        SourceRange(LAngleLoc, RAngleLoc),
2843                                        SourceRange(LParenLoc, RParenLoc));
2844   }
2845 
2846   /// Build a new C++ const_cast expression.
2847   ///
2848   /// By default, performs semantic analysis to build the new expression.
2849   /// Subclasses may override this routine to provide different behavior.
2850   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2851                                            SourceLocation LAngleLoc,
2852                                            TypeSourceInfo *TInfo,
2853                                            SourceLocation RAngleLoc,
2854                                            SourceLocation LParenLoc,
2855                                            Expr *SubExpr,
2856                                            SourceLocation RParenLoc) {
2857     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2858                                        TInfo, SubExpr,
2859                                        SourceRange(LAngleLoc, RAngleLoc),
2860                                        SourceRange(LParenLoc, RParenLoc));
2861   }
2862 
2863   ExprResult
2864   RebuildCXXAddrspaceCastExpr(SourceLocation OpLoc, SourceLocation LAngleLoc,
2865                               TypeSourceInfo *TInfo, SourceLocation RAngleLoc,
2866                               SourceLocation LParenLoc, Expr *SubExpr,
2867                               SourceLocation RParenLoc) {
2868     return getSema().BuildCXXNamedCast(
2869         OpLoc, tok::kw_addrspace_cast, TInfo, SubExpr,
2870         SourceRange(LAngleLoc, RAngleLoc), SourceRange(LParenLoc, RParenLoc));
2871   }
2872 
2873   /// Build a new C++ functional-style cast expression.
2874   ///
2875   /// By default, performs semantic analysis to build the new expression.
2876   /// Subclasses may override this routine to provide different behavior.
2877   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2878                                           SourceLocation LParenLoc,
2879                                           Expr *Sub,
2880                                           SourceLocation RParenLoc,
2881                                           bool ListInitialization) {
2882     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2883                                                MultiExprArg(&Sub, 1), RParenLoc,
2884                                                ListInitialization);
2885   }
2886 
2887   /// Build a new C++ __builtin_bit_cast expression.
2888   ///
2889   /// By default, performs semantic analysis to build the new expression.
2890   /// Subclasses may override this routine to provide different behavior.
2891   ExprResult RebuildBuiltinBitCastExpr(SourceLocation KWLoc,
2892                                        TypeSourceInfo *TSI, Expr *Sub,
2893                                        SourceLocation RParenLoc) {
2894     return getSema().BuildBuiltinBitCastExpr(KWLoc, TSI, Sub, RParenLoc);
2895   }
2896 
2897   /// Build a new C++ typeid(type) expression.
2898   ///
2899   /// By default, performs semantic analysis to build the new expression.
2900   /// Subclasses may override this routine to provide different behavior.
2901   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2902                                         SourceLocation TypeidLoc,
2903                                         TypeSourceInfo *Operand,
2904                                         SourceLocation RParenLoc) {
2905     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2906                                     RParenLoc);
2907   }
2908 
2909 
2910   /// Build a new C++ typeid(expr) expression.
2911   ///
2912   /// By default, performs semantic analysis to build the new expression.
2913   /// Subclasses may override this routine to provide different behavior.
2914   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2915                                         SourceLocation TypeidLoc,
2916                                         Expr *Operand,
2917                                         SourceLocation RParenLoc) {
2918     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2919                                     RParenLoc);
2920   }
2921 
2922   /// Build a new C++ __uuidof(type) expression.
2923   ///
2924   /// By default, performs semantic analysis to build the new expression.
2925   /// Subclasses may override this routine to provide different behavior.
2926   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2927                                   TypeSourceInfo *Operand,
2928                                   SourceLocation RParenLoc) {
2929     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2930   }
2931 
2932   /// Build a new C++ __uuidof(expr) expression.
2933   ///
2934   /// By default, performs semantic analysis to build the new expression.
2935   /// Subclasses may override this routine to provide different behavior.
2936   ExprResult RebuildCXXUuidofExpr(QualType Type, SourceLocation TypeidLoc,
2937                                   Expr *Operand, SourceLocation RParenLoc) {
2938     return getSema().BuildCXXUuidof(Type, TypeidLoc, Operand, RParenLoc);
2939   }
2940 
2941   /// Build a new C++ "this" expression.
2942   ///
2943   /// By default, builds a new "this" expression without performing any
2944   /// semantic analysis. Subclasses may override this routine to provide
2945   /// different behavior.
2946   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2947                                 QualType ThisType,
2948                                 bool isImplicit) {
2949     return getSema().BuildCXXThisExpr(ThisLoc, ThisType, isImplicit);
2950   }
2951 
2952   /// Build a new C++ throw expression.
2953   ///
2954   /// By default, performs semantic analysis to build the new expression.
2955   /// Subclasses may override this routine to provide different behavior.
2956   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2957                                  bool IsThrownVariableInScope) {
2958     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2959   }
2960 
2961   /// Build a new C++ default-argument expression.
2962   ///
2963   /// By default, builds a new default-argument expression, which does not
2964   /// require any semantic analysis. Subclasses may override this routine to
2965   /// provide different behavior.
2966   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc, ParmVarDecl *Param) {
2967     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param,
2968                                      getSema().CurContext);
2969   }
2970 
2971   /// Build a new C++11 default-initialization expression.
2972   ///
2973   /// By default, builds a new default field initialization expression, which
2974   /// does not require any semantic analysis. Subclasses may override this
2975   /// routine to provide different behavior.
2976   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2977                                        FieldDecl *Field) {
2978     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field,
2979                                       getSema().CurContext);
2980   }
2981 
2982   /// Build a new C++ zero-initialization expression.
2983   ///
2984   /// By default, performs semantic analysis to build the new expression.
2985   /// Subclasses may override this routine to provide different behavior.
2986   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2987                                            SourceLocation LParenLoc,
2988                                            SourceLocation RParenLoc) {
2989     return getSema().BuildCXXTypeConstructExpr(
2990         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2991   }
2992 
2993   /// Build a new C++ "new" expression.
2994   ///
2995   /// By default, performs semantic analysis to build the new expression.
2996   /// Subclasses may override this routine to provide different behavior.
2997   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2998                                bool UseGlobal,
2999                                SourceLocation PlacementLParen,
3000                                MultiExprArg PlacementArgs,
3001                                SourceLocation PlacementRParen,
3002                                SourceRange TypeIdParens,
3003                                QualType AllocatedType,
3004                                TypeSourceInfo *AllocatedTypeInfo,
3005                                Optional<Expr *> ArraySize,
3006                                SourceRange DirectInitRange,
3007                                Expr *Initializer) {
3008     return getSema().BuildCXXNew(StartLoc, UseGlobal,
3009                                  PlacementLParen,
3010                                  PlacementArgs,
3011                                  PlacementRParen,
3012                                  TypeIdParens,
3013                                  AllocatedType,
3014                                  AllocatedTypeInfo,
3015                                  ArraySize,
3016                                  DirectInitRange,
3017                                  Initializer);
3018   }
3019 
3020   /// Build a new C++ "delete" expression.
3021   ///
3022   /// By default, performs semantic analysis to build the new expression.
3023   /// Subclasses may override this routine to provide different behavior.
3024   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
3025                                         bool IsGlobalDelete,
3026                                         bool IsArrayForm,
3027                                         Expr *Operand) {
3028     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
3029                                     Operand);
3030   }
3031 
3032   /// Build a new type trait expression.
3033   ///
3034   /// By default, performs semantic analysis to build the new expression.
3035   /// Subclasses may override this routine to provide different behavior.
3036   ExprResult RebuildTypeTrait(TypeTrait Trait,
3037                               SourceLocation StartLoc,
3038                               ArrayRef<TypeSourceInfo *> Args,
3039                               SourceLocation RParenLoc) {
3040     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
3041   }
3042 
3043   /// Build a new array type trait expression.
3044   ///
3045   /// By default, performs semantic analysis to build the new expression.
3046   /// Subclasses may override this routine to provide different behavior.
3047   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
3048                                    SourceLocation StartLoc,
3049                                    TypeSourceInfo *TSInfo,
3050                                    Expr *DimExpr,
3051                                    SourceLocation RParenLoc) {
3052     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
3053   }
3054 
3055   /// Build a new expression trait expression.
3056   ///
3057   /// By default, performs semantic analysis to build the new expression.
3058   /// Subclasses may override this routine to provide different behavior.
3059   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
3060                                    SourceLocation StartLoc,
3061                                    Expr *Queried,
3062                                    SourceLocation RParenLoc) {
3063     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
3064   }
3065 
3066   /// Build a new (previously unresolved) declaration reference
3067   /// expression.
3068   ///
3069   /// By default, performs semantic analysis to build the new expression.
3070   /// Subclasses may override this routine to provide different behavior.
3071   ExprResult RebuildDependentScopeDeclRefExpr(
3072                                           NestedNameSpecifierLoc QualifierLoc,
3073                                           SourceLocation TemplateKWLoc,
3074                                        const DeclarationNameInfo &NameInfo,
3075                               const TemplateArgumentListInfo *TemplateArgs,
3076                                           bool IsAddressOfOperand,
3077                                           TypeSourceInfo **RecoveryTSI) {
3078     CXXScopeSpec SS;
3079     SS.Adopt(QualifierLoc);
3080 
3081     if (TemplateArgs || TemplateKWLoc.isValid())
3082       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
3083                                                     TemplateArgs);
3084 
3085     return getSema().BuildQualifiedDeclarationNameExpr(
3086         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
3087   }
3088 
3089   /// Build a new template-id expression.
3090   ///
3091   /// By default, performs semantic analysis to build the new expression.
3092   /// Subclasses may override this routine to provide different behavior.
3093   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
3094                                    SourceLocation TemplateKWLoc,
3095                                    LookupResult &R,
3096                                    bool RequiresADL,
3097                               const TemplateArgumentListInfo *TemplateArgs) {
3098     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
3099                                          TemplateArgs);
3100   }
3101 
3102   /// Build a new object-construction expression.
3103   ///
3104   /// By default, performs semantic analysis to build the new expression.
3105   /// Subclasses may override this routine to provide different behavior.
3106   ExprResult RebuildCXXConstructExpr(QualType T,
3107                                      SourceLocation Loc,
3108                                      CXXConstructorDecl *Constructor,
3109                                      bool IsElidable,
3110                                      MultiExprArg Args,
3111                                      bool HadMultipleCandidates,
3112                                      bool ListInitialization,
3113                                      bool StdInitListInitialization,
3114                                      bool RequiresZeroInit,
3115                              CXXConstructExpr::ConstructionKind ConstructKind,
3116                                      SourceRange ParenRange) {
3117     // Reconstruct the constructor we originally found, which might be
3118     // different if this is a call to an inherited constructor.
3119     CXXConstructorDecl *FoundCtor = Constructor;
3120     if (Constructor->isInheritingConstructor())
3121       FoundCtor = Constructor->getInheritedConstructor().getConstructor();
3122 
3123     SmallVector<Expr*, 8> ConvertedArgs;
3124     if (getSema().CompleteConstructorCall(FoundCtor, Args, Loc, ConvertedArgs))
3125       return ExprError();
3126 
3127     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
3128                                            IsElidable,
3129                                            ConvertedArgs,
3130                                            HadMultipleCandidates,
3131                                            ListInitialization,
3132                                            StdInitListInitialization,
3133                                            RequiresZeroInit, ConstructKind,
3134                                            ParenRange);
3135   }
3136 
3137   /// Build a new implicit construction via inherited constructor
3138   /// expression.
3139   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
3140                                              CXXConstructorDecl *Constructor,
3141                                              bool ConstructsVBase,
3142                                              bool InheritedFromVBase) {
3143     return new (getSema().Context) CXXInheritedCtorInitExpr(
3144         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
3145   }
3146 
3147   /// Build a new object-construction expression.
3148   ///
3149   /// By default, performs semantic analysis to build the new expression.
3150   /// Subclasses may override this routine to provide different behavior.
3151   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
3152                                            SourceLocation LParenOrBraceLoc,
3153                                            MultiExprArg Args,
3154                                            SourceLocation RParenOrBraceLoc,
3155                                            bool ListInitialization) {
3156     return getSema().BuildCXXTypeConstructExpr(
3157         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
3158   }
3159 
3160   /// Build a new object-construction expression.
3161   ///
3162   /// By default, performs semantic analysis to build the new expression.
3163   /// Subclasses may override this routine to provide different behavior.
3164   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
3165                                                SourceLocation LParenLoc,
3166                                                MultiExprArg Args,
3167                                                SourceLocation RParenLoc,
3168                                                bool ListInitialization) {
3169     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
3170                                                RParenLoc, ListInitialization);
3171   }
3172 
3173   /// Build a new member reference expression.
3174   ///
3175   /// By default, performs semantic analysis to build the new expression.
3176   /// Subclasses may override this routine to provide different behavior.
3177   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
3178                                                 QualType BaseType,
3179                                                 bool IsArrow,
3180                                                 SourceLocation OperatorLoc,
3181                                           NestedNameSpecifierLoc QualifierLoc,
3182                                                 SourceLocation TemplateKWLoc,
3183                                             NamedDecl *FirstQualifierInScope,
3184                                    const DeclarationNameInfo &MemberNameInfo,
3185                               const TemplateArgumentListInfo *TemplateArgs) {
3186     CXXScopeSpec SS;
3187     SS.Adopt(QualifierLoc);
3188 
3189     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3190                                             OperatorLoc, IsArrow,
3191                                             SS, TemplateKWLoc,
3192                                             FirstQualifierInScope,
3193                                             MemberNameInfo,
3194                                             TemplateArgs, /*S*/nullptr);
3195   }
3196 
3197   /// Build a new member reference expression.
3198   ///
3199   /// By default, performs semantic analysis to build the new expression.
3200   /// Subclasses may override this routine to provide different behavior.
3201   ExprResult RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
3202                                          SourceLocation OperatorLoc,
3203                                          bool IsArrow,
3204                                          NestedNameSpecifierLoc QualifierLoc,
3205                                          SourceLocation TemplateKWLoc,
3206                                          NamedDecl *FirstQualifierInScope,
3207                                          LookupResult &R,
3208                                 const TemplateArgumentListInfo *TemplateArgs) {
3209     CXXScopeSpec SS;
3210     SS.Adopt(QualifierLoc);
3211 
3212     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
3213                                             OperatorLoc, IsArrow,
3214                                             SS, TemplateKWLoc,
3215                                             FirstQualifierInScope,
3216                                             R, TemplateArgs, /*S*/nullptr);
3217   }
3218 
3219   /// Build a new noexcept expression.
3220   ///
3221   /// By default, performs semantic analysis to build the new expression.
3222   /// Subclasses may override this routine to provide different behavior.
3223   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
3224     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
3225   }
3226 
3227   /// Build a new expression to compute the length of a parameter pack.
3228   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
3229                                    NamedDecl *Pack,
3230                                    SourceLocation PackLoc,
3231                                    SourceLocation RParenLoc,
3232                                    Optional<unsigned> Length,
3233                                    ArrayRef<TemplateArgument> PartialArgs) {
3234     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
3235                                   RParenLoc, Length, PartialArgs);
3236   }
3237 
3238   /// Build a new expression representing a call to a source location
3239   ///  builtin.
3240   ///
3241   /// By default, performs semantic analysis to build the new expression.
3242   /// Subclasses may override this routine to provide different behavior.
3243   ExprResult RebuildSourceLocExpr(SourceLocExpr::IdentKind Kind,
3244                                   SourceLocation BuiltinLoc,
3245                                   SourceLocation RPLoc,
3246                                   DeclContext *ParentContext) {
3247     return getSema().BuildSourceLocExpr(Kind, BuiltinLoc, RPLoc, ParentContext);
3248   }
3249 
3250   /// Build a new Objective-C boxed expression.
3251   ///
3252   /// By default, performs semantic analysis to build the new expression.
3253   /// Subclasses may override this routine to provide different behavior.
3254   ExprResult RebuildConceptSpecializationExpr(NestedNameSpecifierLoc NNS,
3255       SourceLocation TemplateKWLoc, DeclarationNameInfo ConceptNameInfo,
3256       NamedDecl *FoundDecl, ConceptDecl *NamedConcept,
3257       TemplateArgumentListInfo *TALI) {
3258     CXXScopeSpec SS;
3259     SS.Adopt(NNS);
3260     ExprResult Result = getSema().CheckConceptTemplateId(SS, TemplateKWLoc,
3261                                                          ConceptNameInfo,
3262                                                          FoundDecl,
3263                                                          NamedConcept, TALI);
3264     if (Result.isInvalid())
3265       return ExprError();
3266     return Result;
3267   }
3268 
3269   /// \brief Build a new requires expression.
3270   ///
3271   /// By default, performs semantic analysis to build the new expression.
3272   /// Subclasses may override this routine to provide different behavior.
3273   ExprResult RebuildRequiresExpr(SourceLocation RequiresKWLoc,
3274                                  RequiresExprBodyDecl *Body,
3275                                  ArrayRef<ParmVarDecl *> LocalParameters,
3276                                  ArrayRef<concepts::Requirement *> Requirements,
3277                                  SourceLocation ClosingBraceLoc) {
3278     return RequiresExpr::Create(SemaRef.Context, RequiresKWLoc, Body,
3279                                 LocalParameters, Requirements, ClosingBraceLoc);
3280   }
3281 
3282   concepts::TypeRequirement *
3283   RebuildTypeRequirement(
3284       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3285     return SemaRef.BuildTypeRequirement(SubstDiag);
3286   }
3287 
3288   concepts::TypeRequirement *RebuildTypeRequirement(TypeSourceInfo *T) {
3289     return SemaRef.BuildTypeRequirement(T);
3290   }
3291 
3292   concepts::ExprRequirement *
3293   RebuildExprRequirement(
3294       concepts::Requirement::SubstitutionDiagnostic *SubstDiag, bool IsSimple,
3295       SourceLocation NoexceptLoc,
3296       concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3297     return SemaRef.BuildExprRequirement(SubstDiag, IsSimple, NoexceptLoc,
3298                                         std::move(Ret));
3299   }
3300 
3301   concepts::ExprRequirement *
3302   RebuildExprRequirement(Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
3303                          concepts::ExprRequirement::ReturnTypeRequirement Ret) {
3304     return SemaRef.BuildExprRequirement(E, IsSimple, NoexceptLoc,
3305                                         std::move(Ret));
3306   }
3307 
3308   concepts::NestedRequirement *
3309   RebuildNestedRequirement(
3310       concepts::Requirement::SubstitutionDiagnostic *SubstDiag) {
3311     return SemaRef.BuildNestedRequirement(SubstDiag);
3312   }
3313 
3314   concepts::NestedRequirement *RebuildNestedRequirement(Expr *Constraint) {
3315     return SemaRef.BuildNestedRequirement(Constraint);
3316   }
3317 
3318   /// \brief Build a new Objective-C boxed expression.
3319   ///
3320   /// By default, performs semantic analysis to build the new expression.
3321   /// Subclasses may override this routine to provide different behavior.
3322   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
3323     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
3324   }
3325 
3326   /// Build a new Objective-C array literal.
3327   ///
3328   /// By default, performs semantic analysis to build the new expression.
3329   /// Subclasses may override this routine to provide different behavior.
3330   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
3331                                      Expr **Elements, unsigned NumElements) {
3332     return getSema().BuildObjCArrayLiteral(Range,
3333                                            MultiExprArg(Elements, NumElements));
3334   }
3335 
3336   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
3337                                          Expr *Base, Expr *Key,
3338                                          ObjCMethodDecl *getterMethod,
3339                                          ObjCMethodDecl *setterMethod) {
3340     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
3341                                                    getterMethod, setterMethod);
3342   }
3343 
3344   /// Build a new Objective-C dictionary literal.
3345   ///
3346   /// By default, performs semantic analysis to build the new expression.
3347   /// Subclasses may override this routine to provide different behavior.
3348   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
3349                               MutableArrayRef<ObjCDictionaryElement> Elements) {
3350     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
3351   }
3352 
3353   /// Build a new Objective-C \@encode expression.
3354   ///
3355   /// By default, performs semantic analysis to build the new expression.
3356   /// Subclasses may override this routine to provide different behavior.
3357   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3358                                          TypeSourceInfo *EncodeTypeInfo,
3359                                          SourceLocation RParenLoc) {
3360     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3361   }
3362 
3363   /// Build a new Objective-C class message.
3364   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3365                                           Selector Sel,
3366                                           ArrayRef<SourceLocation> SelectorLocs,
3367                                           ObjCMethodDecl *Method,
3368                                           SourceLocation LBracLoc,
3369                                           MultiExprArg Args,
3370                                           SourceLocation RBracLoc) {
3371     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3372                                      ReceiverTypeInfo->getType(),
3373                                      /*SuperLoc=*/SourceLocation(),
3374                                      Sel, Method, LBracLoc, SelectorLocs,
3375                                      RBracLoc, Args);
3376   }
3377 
3378   /// Build a new Objective-C instance message.
3379   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3380                                           Selector Sel,
3381                                           ArrayRef<SourceLocation> SelectorLocs,
3382                                           ObjCMethodDecl *Method,
3383                                           SourceLocation LBracLoc,
3384                                           MultiExprArg Args,
3385                                           SourceLocation RBracLoc) {
3386     return SemaRef.BuildInstanceMessage(Receiver,
3387                                         Receiver->getType(),
3388                                         /*SuperLoc=*/SourceLocation(),
3389                                         Sel, Method, LBracLoc, SelectorLocs,
3390                                         RBracLoc, Args);
3391   }
3392 
3393   /// Build a new Objective-C instance/class message to 'super'.
3394   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3395                                     Selector Sel,
3396                                     ArrayRef<SourceLocation> SelectorLocs,
3397                                     QualType SuperType,
3398                                     ObjCMethodDecl *Method,
3399                                     SourceLocation LBracLoc,
3400                                     MultiExprArg Args,
3401                                     SourceLocation RBracLoc) {
3402     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3403                                           SuperType,
3404                                           SuperLoc,
3405                                           Sel, Method, LBracLoc, SelectorLocs,
3406                                           RBracLoc, Args)
3407                                       : SemaRef.BuildClassMessage(nullptr,
3408                                           SuperType,
3409                                           SuperLoc,
3410                                           Sel, Method, LBracLoc, SelectorLocs,
3411                                           RBracLoc, Args);
3412 
3413 
3414   }
3415 
3416   /// Build a new Objective-C ivar reference expression.
3417   ///
3418   /// By default, performs semantic analysis to build the new expression.
3419   /// Subclasses may override this routine to provide different behavior.
3420   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3421                                           SourceLocation IvarLoc,
3422                                           bool IsArrow, bool IsFreeIvar) {
3423     CXXScopeSpec SS;
3424     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3425     ExprResult Result = getSema().BuildMemberReferenceExpr(
3426         BaseArg, BaseArg->getType(),
3427         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3428         /*FirstQualifierInScope=*/nullptr, NameInfo,
3429         /*TemplateArgs=*/nullptr,
3430         /*S=*/nullptr);
3431     if (IsFreeIvar && Result.isUsable())
3432       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3433     return Result;
3434   }
3435 
3436   /// Build a new Objective-C property reference expression.
3437   ///
3438   /// By default, performs semantic analysis to build the new expression.
3439   /// Subclasses may override this routine to provide different behavior.
3440   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3441                                         ObjCPropertyDecl *Property,
3442                                         SourceLocation PropertyLoc) {
3443     CXXScopeSpec SS;
3444     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3445     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3446                                               /*FIXME:*/PropertyLoc,
3447                                               /*IsArrow=*/false,
3448                                               SS, SourceLocation(),
3449                                               /*FirstQualifierInScope=*/nullptr,
3450                                               NameInfo,
3451                                               /*TemplateArgs=*/nullptr,
3452                                               /*S=*/nullptr);
3453   }
3454 
3455   /// Build a new Objective-C property reference expression.
3456   ///
3457   /// By default, performs semantic analysis to build the new expression.
3458   /// Subclasses may override this routine to provide different behavior.
3459   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3460                                         ObjCMethodDecl *Getter,
3461                                         ObjCMethodDecl *Setter,
3462                                         SourceLocation PropertyLoc) {
3463     // Since these expressions can only be value-dependent, we do not
3464     // need to perform semantic analysis again.
3465     return Owned(
3466       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3467                                                   VK_LValue, OK_ObjCProperty,
3468                                                   PropertyLoc, Base));
3469   }
3470 
3471   /// Build a new Objective-C "isa" expression.
3472   ///
3473   /// By default, performs semantic analysis to build the new expression.
3474   /// Subclasses may override this routine to provide different behavior.
3475   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3476                                 SourceLocation OpLoc, bool IsArrow) {
3477     CXXScopeSpec SS;
3478     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3479     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3480                                               OpLoc, IsArrow,
3481                                               SS, SourceLocation(),
3482                                               /*FirstQualifierInScope=*/nullptr,
3483                                               NameInfo,
3484                                               /*TemplateArgs=*/nullptr,
3485                                               /*S=*/nullptr);
3486   }
3487 
3488   /// Build a new shuffle vector expression.
3489   ///
3490   /// By default, performs semantic analysis to build the new expression.
3491   /// Subclasses may override this routine to provide different behavior.
3492   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3493                                       MultiExprArg SubExprs,
3494                                       SourceLocation RParenLoc) {
3495     // Find the declaration for __builtin_shufflevector
3496     const IdentifierInfo &Name
3497       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3498     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3499     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3500     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3501 
3502     // Build a reference to the __builtin_shufflevector builtin
3503     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3504     Expr *Callee = new (SemaRef.Context)
3505         DeclRefExpr(SemaRef.Context, Builtin, false,
3506                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3507     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3508     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3509                                        CK_BuiltinFnToFnPtr).get();
3510 
3511     // Build the CallExpr
3512     ExprResult TheCall = CallExpr::Create(
3513         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3514         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc,
3515         FPOptionsOverride());
3516 
3517     // Type-check the __builtin_shufflevector expression.
3518     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3519   }
3520 
3521   /// Build a new convert vector expression.
3522   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3523                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3524                                       SourceLocation RParenLoc) {
3525     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3526                                          BuiltinLoc, RParenLoc);
3527   }
3528 
3529   /// Build a new template argument pack expansion.
3530   ///
3531   /// By default, performs semantic analysis to build a new pack expansion
3532   /// for a template argument. Subclasses may override this routine to provide
3533   /// different behavior.
3534   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3535                                            SourceLocation EllipsisLoc,
3536                                            Optional<unsigned> NumExpansions) {
3537     switch (Pattern.getArgument().getKind()) {
3538     case TemplateArgument::Expression: {
3539       ExprResult Result
3540         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3541                                        EllipsisLoc, NumExpansions);
3542       if (Result.isInvalid())
3543         return TemplateArgumentLoc();
3544 
3545       return TemplateArgumentLoc(Result.get(), Result.get());
3546     }
3547 
3548     case TemplateArgument::Template:
3549       return TemplateArgumentLoc(
3550           SemaRef.Context,
3551           TemplateArgument(Pattern.getArgument().getAsTemplate(),
3552                            NumExpansions),
3553           Pattern.getTemplateQualifierLoc(), Pattern.getTemplateNameLoc(),
3554           EllipsisLoc);
3555 
3556     case TemplateArgument::Null:
3557     case TemplateArgument::Integral:
3558     case TemplateArgument::Declaration:
3559     case TemplateArgument::Pack:
3560     case TemplateArgument::TemplateExpansion:
3561     case TemplateArgument::NullPtr:
3562       llvm_unreachable("Pack expansion pattern has no parameter packs");
3563 
3564     case TemplateArgument::Type:
3565       if (TypeSourceInfo *Expansion
3566             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3567                                            EllipsisLoc,
3568                                            NumExpansions))
3569         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3570                                    Expansion);
3571       break;
3572     }
3573 
3574     return TemplateArgumentLoc();
3575   }
3576 
3577   /// Build a new expression pack expansion.
3578   ///
3579   /// By default, performs semantic analysis to build a new pack expansion
3580   /// for an expression. Subclasses may override this routine to provide
3581   /// different behavior.
3582   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3583                                   Optional<unsigned> NumExpansions) {
3584     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3585   }
3586 
3587   /// Build a new C++1z fold-expression.
3588   ///
3589   /// By default, performs semantic analysis in order to build a new fold
3590   /// expression.
3591   ExprResult RebuildCXXFoldExpr(UnresolvedLookupExpr *ULE,
3592                                 SourceLocation LParenLoc, Expr *LHS,
3593                                 BinaryOperatorKind Operator,
3594                                 SourceLocation EllipsisLoc, Expr *RHS,
3595                                 SourceLocation RParenLoc,
3596                                 Optional<unsigned> NumExpansions) {
3597     return getSema().BuildCXXFoldExpr(ULE, LParenLoc, LHS, Operator,
3598                                       EllipsisLoc, RHS, RParenLoc,
3599                                       NumExpansions);
3600   }
3601 
3602   /// Build an empty C++1z fold-expression with the given operator.
3603   ///
3604   /// By default, produces the fallback value for the fold-expression, or
3605   /// produce an error if there is no fallback value.
3606   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3607                                      BinaryOperatorKind Operator) {
3608     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3609   }
3610 
3611   /// Build a new atomic operation expression.
3612   ///
3613   /// By default, performs semantic analysis to build the new expression.
3614   /// Subclasses may override this routine to provide different behavior.
3615   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc, MultiExprArg SubExprs,
3616                                AtomicExpr::AtomicOp Op,
3617                                SourceLocation RParenLoc) {
3618     // Use this for all of the locations, since we don't know the difference
3619     // between the call and the expr at this point.
3620     SourceRange Range{BuiltinLoc, RParenLoc};
3621     return getSema().BuildAtomicExpr(Range, Range, RParenLoc, SubExprs, Op,
3622                                      Sema::AtomicArgumentOrder::AST);
3623   }
3624 
3625   ExprResult RebuildRecoveryExpr(SourceLocation BeginLoc, SourceLocation EndLoc,
3626                                  ArrayRef<Expr *> SubExprs, QualType Type) {
3627     return getSema().CreateRecoveryExpr(BeginLoc, EndLoc, SubExprs, Type);
3628   }
3629 
3630 private:
3631   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3632                                      QualType ObjectType,
3633                                      NamedDecl *FirstQualifierInScope,
3634                                      CXXScopeSpec &SS);
3635 
3636   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3637                                              QualType ObjectType,
3638                                              NamedDecl *FirstQualifierInScope,
3639                                              CXXScopeSpec &SS);
3640 
3641   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3642                                             NamedDecl *FirstQualifierInScope,
3643                                             CXXScopeSpec &SS);
3644 
3645   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3646                                       DependentNameTypeLoc TL,
3647                                       bool DeducibleTSTContext);
3648 };
3649 
3650 template <typename Derived>
3651 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3652   if (!S)
3653     return S;
3654 
3655   switch (S->getStmtClass()) {
3656   case Stmt::NoStmtClass: break;
3657 
3658   // Transform individual statement nodes
3659   // Pass SDK into statements that can produce a value
3660 #define STMT(Node, Parent)                                              \
3661   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3662 #define VALUESTMT(Node, Parent)                                         \
3663   case Stmt::Node##Class:                                               \
3664     return getDerived().Transform##Node(cast<Node>(S), SDK);
3665 #define ABSTRACT_STMT(Node)
3666 #define EXPR(Node, Parent)
3667 #include "clang/AST/StmtNodes.inc"
3668 
3669   // Transform expressions by calling TransformExpr.
3670 #define STMT(Node, Parent)
3671 #define ABSTRACT_STMT(Stmt)
3672 #define EXPR(Node, Parent) case Stmt::Node##Class:
3673 #include "clang/AST/StmtNodes.inc"
3674     {
3675       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3676 
3677       if (SDK == SDK_StmtExprResult)
3678         E = getSema().ActOnStmtExprResult(E);
3679       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3680     }
3681   }
3682 
3683   return S;
3684 }
3685 
3686 template<typename Derived>
3687 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3688   if (!S)
3689     return S;
3690 
3691   switch (S->getClauseKind()) {
3692   default: break;
3693   // Transform individual clause nodes
3694 #define OMP_CLAUSE_CLASS(Enum, Str, Class) \
3695   case Enum:                                                                   \
3696     return getDerived().Transform ## Class(cast<Class>(S));
3697 #include "llvm/Frontend/OpenMP/OMPKinds.def"
3698   }
3699 
3700   return S;
3701 }
3702 
3703 
3704 template<typename Derived>
3705 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3706   if (!E)
3707     return E;
3708 
3709   switch (E->getStmtClass()) {
3710     case Stmt::NoStmtClass: break;
3711 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3712 #define ABSTRACT_STMT(Stmt)
3713 #define EXPR(Node, Parent)                                              \
3714     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3715 #include "clang/AST/StmtNodes.inc"
3716   }
3717 
3718   return E;
3719 }
3720 
3721 template<typename Derived>
3722 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3723                                                         bool NotCopyInit) {
3724   // Initializers are instantiated like expressions, except that various outer
3725   // layers are stripped.
3726   if (!Init)
3727     return Init;
3728 
3729   if (auto *FE = dyn_cast<FullExpr>(Init))
3730     Init = FE->getSubExpr();
3731 
3732   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3733     Init = AIL->getCommonExpr();
3734 
3735   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3736     Init = MTE->getSubExpr();
3737 
3738   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3739     Init = Binder->getSubExpr();
3740 
3741   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3742     Init = ICE->getSubExprAsWritten();
3743 
3744   if (CXXStdInitializerListExpr *ILE =
3745           dyn_cast<CXXStdInitializerListExpr>(Init))
3746     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3747 
3748   // If this is copy-initialization, we only need to reconstruct
3749   // InitListExprs. Other forms of copy-initialization will be a no-op if
3750   // the initializer is already the right type.
3751   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3752   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3753     return getDerived().TransformExpr(Init);
3754 
3755   // Revert value-initialization back to empty parens.
3756   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3757     SourceRange Parens = VIE->getSourceRange();
3758     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3759                                              Parens.getEnd());
3760   }
3761 
3762   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3763   if (isa<ImplicitValueInitExpr>(Init))
3764     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3765                                              SourceLocation());
3766 
3767   // Revert initialization by constructor back to a parenthesized or braced list
3768   // of expressions. Any other form of initializer can just be reused directly.
3769   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3770     return getDerived().TransformExpr(Init);
3771 
3772   // If the initialization implicitly converted an initializer list to a
3773   // std::initializer_list object, unwrap the std::initializer_list too.
3774   if (Construct && Construct->isStdInitListInitialization())
3775     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3776 
3777   // Enter a list-init context if this was list initialization.
3778   EnterExpressionEvaluationContext Context(
3779       getSema(), EnterExpressionEvaluationContext::InitList,
3780       Construct->isListInitialization());
3781 
3782   SmallVector<Expr*, 8> NewArgs;
3783   bool ArgChanged = false;
3784   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3785                                   /*IsCall*/true, NewArgs, &ArgChanged))
3786     return ExprError();
3787 
3788   // If this was list initialization, revert to syntactic list form.
3789   if (Construct->isListInitialization())
3790     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3791                                         Construct->getEndLoc());
3792 
3793   // Build a ParenListExpr to represent anything else.
3794   SourceRange Parens = Construct->getParenOrBraceRange();
3795   if (Parens.isInvalid()) {
3796     // This was a variable declaration's initialization for which no initializer
3797     // was specified.
3798     assert(NewArgs.empty() &&
3799            "no parens or braces but have direct init with arguments?");
3800     return ExprEmpty();
3801   }
3802   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3803                                            Parens.getEnd());
3804 }
3805 
3806 template<typename Derived>
3807 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3808                                             unsigned NumInputs,
3809                                             bool IsCall,
3810                                       SmallVectorImpl<Expr *> &Outputs,
3811                                             bool *ArgChanged) {
3812   for (unsigned I = 0; I != NumInputs; ++I) {
3813     // If requested, drop call arguments that need to be dropped.
3814     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3815       if (ArgChanged)
3816         *ArgChanged = true;
3817 
3818       break;
3819     }
3820 
3821     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3822       Expr *Pattern = Expansion->getPattern();
3823 
3824       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3825       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3826       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3827 
3828       // Determine whether the set of unexpanded parameter packs can and should
3829       // be expanded.
3830       bool Expand = true;
3831       bool RetainExpansion = false;
3832       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3833       Optional<unsigned> NumExpansions = OrigNumExpansions;
3834       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3835                                                Pattern->getSourceRange(),
3836                                                Unexpanded,
3837                                                Expand, RetainExpansion,
3838                                                NumExpansions))
3839         return true;
3840 
3841       if (!Expand) {
3842         // The transform has determined that we should perform a simple
3843         // transformation on the pack expansion, producing another pack
3844         // expansion.
3845         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3846         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3847         if (OutPattern.isInvalid())
3848           return true;
3849 
3850         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3851                                                 Expansion->getEllipsisLoc(),
3852                                                            NumExpansions);
3853         if (Out.isInvalid())
3854           return true;
3855 
3856         if (ArgChanged)
3857           *ArgChanged = true;
3858         Outputs.push_back(Out.get());
3859         continue;
3860       }
3861 
3862       // Record right away that the argument was changed.  This needs
3863       // to happen even if the array expands to nothing.
3864       if (ArgChanged) *ArgChanged = true;
3865 
3866       // The transform has determined that we should perform an elementwise
3867       // expansion of the pattern. Do so.
3868       for (unsigned I = 0; I != *NumExpansions; ++I) {
3869         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3870         ExprResult Out = getDerived().TransformExpr(Pattern);
3871         if (Out.isInvalid())
3872           return true;
3873 
3874         if (Out.get()->containsUnexpandedParameterPack()) {
3875           Out = getDerived().RebuildPackExpansion(
3876               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3877           if (Out.isInvalid())
3878             return true;
3879         }
3880 
3881         Outputs.push_back(Out.get());
3882       }
3883 
3884       // If we're supposed to retain a pack expansion, do so by temporarily
3885       // forgetting the partially-substituted parameter pack.
3886       if (RetainExpansion) {
3887         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3888 
3889         ExprResult Out = getDerived().TransformExpr(Pattern);
3890         if (Out.isInvalid())
3891           return true;
3892 
3893         Out = getDerived().RebuildPackExpansion(
3894             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3895         if (Out.isInvalid())
3896           return true;
3897 
3898         Outputs.push_back(Out.get());
3899       }
3900 
3901       continue;
3902     }
3903 
3904     ExprResult Result =
3905       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3906              : getDerived().TransformExpr(Inputs[I]);
3907     if (Result.isInvalid())
3908       return true;
3909 
3910     if (Result.get() != Inputs[I] && ArgChanged)
3911       *ArgChanged = true;
3912 
3913     Outputs.push_back(Result.get());
3914   }
3915 
3916   return false;
3917 }
3918 
3919 template <typename Derived>
3920 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3921     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3922   if (Var) {
3923     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3924         getDerived().TransformDefinition(Var->getLocation(), Var));
3925 
3926     if (!ConditionVar)
3927       return Sema::ConditionError();
3928 
3929     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3930   }
3931 
3932   if (Expr) {
3933     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3934 
3935     if (CondExpr.isInvalid())
3936       return Sema::ConditionError();
3937 
3938     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3939   }
3940 
3941   return Sema::ConditionResult();
3942 }
3943 
3944 template<typename Derived>
3945 NestedNameSpecifierLoc
3946 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3947                                                     NestedNameSpecifierLoc NNS,
3948                                                      QualType ObjectType,
3949                                              NamedDecl *FirstQualifierInScope) {
3950   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3951   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3952        Qualifier = Qualifier.getPrefix())
3953     Qualifiers.push_back(Qualifier);
3954 
3955   CXXScopeSpec SS;
3956   while (!Qualifiers.empty()) {
3957     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3958     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3959 
3960     switch (QNNS->getKind()) {
3961     case NestedNameSpecifier::Identifier: {
3962       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3963                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3964       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3965                                               SS, FirstQualifierInScope, false))
3966         return NestedNameSpecifierLoc();
3967     }
3968       break;
3969 
3970     case NestedNameSpecifier::Namespace: {
3971       NamespaceDecl *NS
3972         = cast_or_null<NamespaceDecl>(
3973                                     getDerived().TransformDecl(
3974                                                           Q.getLocalBeginLoc(),
3975                                                        QNNS->getAsNamespace()));
3976       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3977       break;
3978     }
3979 
3980     case NestedNameSpecifier::NamespaceAlias: {
3981       NamespaceAliasDecl *Alias
3982         = cast_or_null<NamespaceAliasDecl>(
3983                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3984                                                  QNNS->getAsNamespaceAlias()));
3985       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3986                 Q.getLocalEndLoc());
3987       break;
3988     }
3989 
3990     case NestedNameSpecifier::Global:
3991       // There is no meaningful transformation that one could perform on the
3992       // global scope.
3993       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3994       break;
3995 
3996     case NestedNameSpecifier::Super: {
3997       CXXRecordDecl *RD =
3998           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3999               SourceLocation(), QNNS->getAsRecordDecl()));
4000       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
4001       break;
4002     }
4003 
4004     case NestedNameSpecifier::TypeSpecWithTemplate:
4005     case NestedNameSpecifier::TypeSpec: {
4006       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
4007                                               FirstQualifierInScope, SS);
4008 
4009       if (!TL)
4010         return NestedNameSpecifierLoc();
4011 
4012       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
4013           (SemaRef.getLangOpts().CPlusPlus11 &&
4014            TL.getType()->isEnumeralType())) {
4015         assert(!TL.getType().hasLocalQualifiers() &&
4016                "Can't get cv-qualifiers here");
4017         if (TL.getType()->isEnumeralType())
4018           SemaRef.Diag(TL.getBeginLoc(),
4019                        diag::warn_cxx98_compat_enum_nested_name_spec);
4020         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
4021                   Q.getLocalEndLoc());
4022         break;
4023       }
4024       // If the nested-name-specifier is an invalid type def, don't emit an
4025       // error because a previous error should have already been emitted.
4026       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
4027       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
4028         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
4029           << TL.getType() << SS.getRange();
4030       }
4031       return NestedNameSpecifierLoc();
4032     }
4033     }
4034 
4035     // The qualifier-in-scope and object type only apply to the leftmost entity.
4036     FirstQualifierInScope = nullptr;
4037     ObjectType = QualType();
4038   }
4039 
4040   // Don't rebuild the nested-name-specifier if we don't have to.
4041   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
4042       !getDerived().AlwaysRebuild())
4043     return NNS;
4044 
4045   // If we can re-use the source-location data from the original
4046   // nested-name-specifier, do so.
4047   if (SS.location_size() == NNS.getDataLength() &&
4048       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
4049     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
4050 
4051   // Allocate new nested-name-specifier location information.
4052   return SS.getWithLocInContext(SemaRef.Context);
4053 }
4054 
4055 template<typename Derived>
4056 DeclarationNameInfo
4057 TreeTransform<Derived>
4058 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
4059   DeclarationName Name = NameInfo.getName();
4060   if (!Name)
4061     return DeclarationNameInfo();
4062 
4063   switch (Name.getNameKind()) {
4064   case DeclarationName::Identifier:
4065   case DeclarationName::ObjCZeroArgSelector:
4066   case DeclarationName::ObjCOneArgSelector:
4067   case DeclarationName::ObjCMultiArgSelector:
4068   case DeclarationName::CXXOperatorName:
4069   case DeclarationName::CXXLiteralOperatorName:
4070   case DeclarationName::CXXUsingDirective:
4071     return NameInfo;
4072 
4073   case DeclarationName::CXXDeductionGuideName: {
4074     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
4075     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
4076         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
4077     if (!NewTemplate)
4078       return DeclarationNameInfo();
4079 
4080     DeclarationNameInfo NewNameInfo(NameInfo);
4081     NewNameInfo.setName(
4082         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
4083     return NewNameInfo;
4084   }
4085 
4086   case DeclarationName::CXXConstructorName:
4087   case DeclarationName::CXXDestructorName:
4088   case DeclarationName::CXXConversionFunctionName: {
4089     TypeSourceInfo *NewTInfo;
4090     CanQualType NewCanTy;
4091     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
4092       NewTInfo = getDerived().TransformType(OldTInfo);
4093       if (!NewTInfo)
4094         return DeclarationNameInfo();
4095       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
4096     }
4097     else {
4098       NewTInfo = nullptr;
4099       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
4100       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
4101       if (NewT.isNull())
4102         return DeclarationNameInfo();
4103       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
4104     }
4105 
4106     DeclarationName NewName
4107       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
4108                                                            NewCanTy);
4109     DeclarationNameInfo NewNameInfo(NameInfo);
4110     NewNameInfo.setName(NewName);
4111     NewNameInfo.setNamedTypeInfo(NewTInfo);
4112     return NewNameInfo;
4113   }
4114   }
4115 
4116   llvm_unreachable("Unknown name kind.");
4117 }
4118 
4119 template<typename Derived>
4120 TemplateName
4121 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
4122                                               TemplateName Name,
4123                                               SourceLocation NameLoc,
4124                                               QualType ObjectType,
4125                                               NamedDecl *FirstQualifierInScope,
4126                                               bool AllowInjectedClassName) {
4127   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
4128     TemplateDecl *Template = QTN->getTemplateDecl();
4129     assert(Template && "qualified template name must refer to a template");
4130 
4131     TemplateDecl *TransTemplate
4132       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4133                                                               Template));
4134     if (!TransTemplate)
4135       return TemplateName();
4136 
4137     if (!getDerived().AlwaysRebuild() &&
4138         SS.getScopeRep() == QTN->getQualifier() &&
4139         TransTemplate == Template)
4140       return Name;
4141 
4142     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
4143                                             TransTemplate);
4144   }
4145 
4146   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
4147     if (SS.getScopeRep()) {
4148       // These apply to the scope specifier, not the template.
4149       ObjectType = QualType();
4150       FirstQualifierInScope = nullptr;
4151     }
4152 
4153     if (!getDerived().AlwaysRebuild() &&
4154         SS.getScopeRep() == DTN->getQualifier() &&
4155         ObjectType.isNull())
4156       return Name;
4157 
4158     // FIXME: Preserve the location of the "template" keyword.
4159     SourceLocation TemplateKWLoc = NameLoc;
4160 
4161     if (DTN->isIdentifier()) {
4162       return getDerived().RebuildTemplateName(SS,
4163                                               TemplateKWLoc,
4164                                               *DTN->getIdentifier(),
4165                                               NameLoc,
4166                                               ObjectType,
4167                                               FirstQualifierInScope,
4168                                               AllowInjectedClassName);
4169     }
4170 
4171     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
4172                                             DTN->getOperator(), NameLoc,
4173                                             ObjectType, AllowInjectedClassName);
4174   }
4175 
4176   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
4177     TemplateDecl *TransTemplate
4178       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
4179                                                               Template));
4180     if (!TransTemplate)
4181       return TemplateName();
4182 
4183     if (!getDerived().AlwaysRebuild() &&
4184         TransTemplate == Template)
4185       return Name;
4186 
4187     return TemplateName(TransTemplate);
4188   }
4189 
4190   if (SubstTemplateTemplateParmPackStorage *SubstPack
4191       = Name.getAsSubstTemplateTemplateParmPack()) {
4192     TemplateTemplateParmDecl *TransParam
4193     = cast_or_null<TemplateTemplateParmDecl>(
4194             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
4195     if (!TransParam)
4196       return TemplateName();
4197 
4198     if (!getDerived().AlwaysRebuild() &&
4199         TransParam == SubstPack->getParameterPack())
4200       return Name;
4201 
4202     return getDerived().RebuildTemplateName(TransParam,
4203                                             SubstPack->getArgumentPack());
4204   }
4205 
4206   // These should be getting filtered out before they reach the AST.
4207   llvm_unreachable("overloaded function decl survived to here");
4208 }
4209 
4210 template<typename Derived>
4211 void TreeTransform<Derived>::InventTemplateArgumentLoc(
4212                                          const TemplateArgument &Arg,
4213                                          TemplateArgumentLoc &Output) {
4214   Output = getSema().getTrivialTemplateArgumentLoc(
4215       Arg, QualType(), getDerived().getBaseLocation());
4216 }
4217 
4218 template<typename Derived>
4219 bool TreeTransform<Derived>::TransformTemplateArgument(
4220                                          const TemplateArgumentLoc &Input,
4221                                          TemplateArgumentLoc &Output, bool Uneval) {
4222   const TemplateArgument &Arg = Input.getArgument();
4223   switch (Arg.getKind()) {
4224   case TemplateArgument::Null:
4225   case TemplateArgument::Pack:
4226     llvm_unreachable("Unexpected TemplateArgument");
4227 
4228   case TemplateArgument::Integral:
4229   case TemplateArgument::NullPtr:
4230   case TemplateArgument::Declaration: {
4231     // Transform a resolved template argument straight to a resolved template
4232     // argument. We get here when substituting into an already-substituted
4233     // template type argument during concept satisfaction checking.
4234     QualType T = Arg.getNonTypeTemplateArgumentType();
4235     QualType NewT = getDerived().TransformType(T);
4236     if (NewT.isNull())
4237       return true;
4238 
4239     ValueDecl *D = Arg.getKind() == TemplateArgument::Declaration
4240                        ? Arg.getAsDecl()
4241                        : nullptr;
4242     ValueDecl *NewD = D ? cast_or_null<ValueDecl>(getDerived().TransformDecl(
4243                               getDerived().getBaseLocation(), D))
4244                         : nullptr;
4245     if (D && !NewD)
4246       return true;
4247 
4248     if (NewT == T && D == NewD)
4249       Output = Input;
4250     else if (Arg.getKind() == TemplateArgument::Integral)
4251       Output = TemplateArgumentLoc(
4252           TemplateArgument(getSema().Context, Arg.getAsIntegral(), NewT),
4253           TemplateArgumentLocInfo());
4254     else if (Arg.getKind() == TemplateArgument::NullPtr)
4255       Output = TemplateArgumentLoc(TemplateArgument(NewT, /*IsNullPtr=*/true),
4256                                    TemplateArgumentLocInfo());
4257     else
4258       Output = TemplateArgumentLoc(TemplateArgument(NewD, NewT),
4259                                    TemplateArgumentLocInfo());
4260 
4261     return false;
4262   }
4263 
4264   case TemplateArgument::Type: {
4265     TypeSourceInfo *DI = Input.getTypeSourceInfo();
4266     if (!DI)
4267       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
4268 
4269     DI = getDerived().TransformType(DI);
4270     if (!DI) return true;
4271 
4272     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
4273     return false;
4274   }
4275 
4276   case TemplateArgument::Template: {
4277     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
4278     if (QualifierLoc) {
4279       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
4280       if (!QualifierLoc)
4281         return true;
4282     }
4283 
4284     CXXScopeSpec SS;
4285     SS.Adopt(QualifierLoc);
4286     TemplateName Template
4287       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
4288                                            Input.getTemplateNameLoc());
4289     if (Template.isNull())
4290       return true;
4291 
4292     Output = TemplateArgumentLoc(SemaRef.Context, TemplateArgument(Template),
4293                                  QualifierLoc, Input.getTemplateNameLoc());
4294     return false;
4295   }
4296 
4297   case TemplateArgument::TemplateExpansion:
4298     llvm_unreachable("Caller should expand pack expansions");
4299 
4300   case TemplateArgument::Expression: {
4301     // Template argument expressions are constant expressions.
4302     EnterExpressionEvaluationContext Unevaluated(
4303         getSema(),
4304         Uneval ? Sema::ExpressionEvaluationContext::Unevaluated
4305                : Sema::ExpressionEvaluationContext::ConstantEvaluated,
4306         /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
4307         Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
4308 
4309     Expr *InputExpr = Input.getSourceExpression();
4310     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
4311 
4312     ExprResult E = getDerived().TransformExpr(InputExpr);
4313     E = SemaRef.ActOnConstantExpression(E);
4314     if (E.isInvalid()) return true;
4315     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
4316     return false;
4317   }
4318   }
4319 
4320   // Work around bogus GCC warning
4321   return true;
4322 }
4323 
4324 /// Iterator adaptor that invents template argument location information
4325 /// for each of the template arguments in its underlying iterator.
4326 template<typename Derived, typename InputIterator>
4327 class TemplateArgumentLocInventIterator {
4328   TreeTransform<Derived> &Self;
4329   InputIterator Iter;
4330 
4331 public:
4332   typedef TemplateArgumentLoc value_type;
4333   typedef TemplateArgumentLoc reference;
4334   typedef typename std::iterator_traits<InputIterator>::difference_type
4335     difference_type;
4336   typedef std::input_iterator_tag iterator_category;
4337 
4338   class pointer {
4339     TemplateArgumentLoc Arg;
4340 
4341   public:
4342     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
4343 
4344     const TemplateArgumentLoc *operator->() const { return &Arg; }
4345   };
4346 
4347   TemplateArgumentLocInventIterator() { }
4348 
4349   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
4350                                              InputIterator Iter)
4351     : Self(Self), Iter(Iter) { }
4352 
4353   TemplateArgumentLocInventIterator &operator++() {
4354     ++Iter;
4355     return *this;
4356   }
4357 
4358   TemplateArgumentLocInventIterator operator++(int) {
4359     TemplateArgumentLocInventIterator Old(*this);
4360     ++(*this);
4361     return Old;
4362   }
4363 
4364   reference operator*() const {
4365     TemplateArgumentLoc Result;
4366     Self.InventTemplateArgumentLoc(*Iter, Result);
4367     return Result;
4368   }
4369 
4370   pointer operator->() const { return pointer(**this); }
4371 
4372   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4373                          const TemplateArgumentLocInventIterator &Y) {
4374     return X.Iter == Y.Iter;
4375   }
4376 
4377   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4378                          const TemplateArgumentLocInventIterator &Y) {
4379     return X.Iter != Y.Iter;
4380   }
4381 };
4382 
4383 template<typename Derived>
4384 template<typename InputIterator>
4385 bool TreeTransform<Derived>::TransformTemplateArguments(
4386     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4387     bool Uneval) {
4388   for (; First != Last; ++First) {
4389     TemplateArgumentLoc Out;
4390     TemplateArgumentLoc In = *First;
4391 
4392     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4393       // Unpack argument packs, which we translate them into separate
4394       // arguments.
4395       // FIXME: We could do much better if we could guarantee that the
4396       // TemplateArgumentLocInfo for the pack expansion would be usable for
4397       // all of the template arguments in the argument pack.
4398       typedef TemplateArgumentLocInventIterator<Derived,
4399                                                 TemplateArgument::pack_iterator>
4400         PackLocIterator;
4401       if (TransformTemplateArguments(PackLocIterator(*this,
4402                                                  In.getArgument().pack_begin()),
4403                                      PackLocIterator(*this,
4404                                                    In.getArgument().pack_end()),
4405                                      Outputs, Uneval))
4406         return true;
4407 
4408       continue;
4409     }
4410 
4411     if (In.getArgument().isPackExpansion()) {
4412       // We have a pack expansion, for which we will be substituting into
4413       // the pattern.
4414       SourceLocation Ellipsis;
4415       Optional<unsigned> OrigNumExpansions;
4416       TemplateArgumentLoc Pattern
4417         = getSema().getTemplateArgumentPackExpansionPattern(
4418               In, Ellipsis, OrigNumExpansions);
4419 
4420       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4421       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4422       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4423 
4424       // Determine whether the set of unexpanded parameter packs can and should
4425       // be expanded.
4426       bool Expand = true;
4427       bool RetainExpansion = false;
4428       Optional<unsigned> NumExpansions = OrigNumExpansions;
4429       if (getDerived().TryExpandParameterPacks(Ellipsis,
4430                                                Pattern.getSourceRange(),
4431                                                Unexpanded,
4432                                                Expand,
4433                                                RetainExpansion,
4434                                                NumExpansions))
4435         return true;
4436 
4437       if (!Expand) {
4438         // The transform has determined that we should perform a simple
4439         // transformation on the pack expansion, producing another pack
4440         // expansion.
4441         TemplateArgumentLoc OutPattern;
4442         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4443         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4444           return true;
4445 
4446         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4447                                                 NumExpansions);
4448         if (Out.getArgument().isNull())
4449           return true;
4450 
4451         Outputs.addArgument(Out);
4452         continue;
4453       }
4454 
4455       // The transform has determined that we should perform an elementwise
4456       // expansion of the pattern. Do so.
4457       for (unsigned I = 0; I != *NumExpansions; ++I) {
4458         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4459 
4460         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4461           return true;
4462 
4463         if (Out.getArgument().containsUnexpandedParameterPack()) {
4464           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4465                                                   OrigNumExpansions);
4466           if (Out.getArgument().isNull())
4467             return true;
4468         }
4469 
4470         Outputs.addArgument(Out);
4471       }
4472 
4473       // If we're supposed to retain a pack expansion, do so by temporarily
4474       // forgetting the partially-substituted parameter pack.
4475       if (RetainExpansion) {
4476         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4477 
4478         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4479           return true;
4480 
4481         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4482                                                 OrigNumExpansions);
4483         if (Out.getArgument().isNull())
4484           return true;
4485 
4486         Outputs.addArgument(Out);
4487       }
4488 
4489       continue;
4490     }
4491 
4492     // The simple case:
4493     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4494       return true;
4495 
4496     Outputs.addArgument(Out);
4497   }
4498 
4499   return false;
4500 
4501 }
4502 
4503 //===----------------------------------------------------------------------===//
4504 // Type transformation
4505 //===----------------------------------------------------------------------===//
4506 
4507 template<typename Derived>
4508 QualType TreeTransform<Derived>::TransformType(QualType T) {
4509   if (getDerived().AlreadyTransformed(T))
4510     return T;
4511 
4512   // Temporary workaround.  All of these transformations should
4513   // eventually turn into transformations on TypeLocs.
4514   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4515                                                 getDerived().getBaseLocation());
4516 
4517   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4518 
4519   if (!NewDI)
4520     return QualType();
4521 
4522   return NewDI->getType();
4523 }
4524 
4525 template<typename Derived>
4526 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4527   // Refine the base location to the type's location.
4528   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4529                        getDerived().getBaseEntity());
4530   if (getDerived().AlreadyTransformed(DI->getType()))
4531     return DI;
4532 
4533   TypeLocBuilder TLB;
4534 
4535   TypeLoc TL = DI->getTypeLoc();
4536   TLB.reserve(TL.getFullDataSize());
4537 
4538   QualType Result = getDerived().TransformType(TLB, TL);
4539   if (Result.isNull())
4540     return nullptr;
4541 
4542   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4543 }
4544 
4545 template<typename Derived>
4546 QualType
4547 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4548   switch (T.getTypeLocClass()) {
4549 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4550 #define TYPELOC(CLASS, PARENT)                                                 \
4551   case TypeLoc::CLASS:                                                         \
4552     return getDerived().Transform##CLASS##Type(TLB,                            \
4553                                                T.castAs<CLASS##TypeLoc>());
4554 #include "clang/AST/TypeLocNodes.def"
4555   }
4556 
4557   llvm_unreachable("unhandled type loc!");
4558 }
4559 
4560 template<typename Derived>
4561 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4562   if (!isa<DependentNameType>(T))
4563     return TransformType(T);
4564 
4565   if (getDerived().AlreadyTransformed(T))
4566     return T;
4567   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4568                                                 getDerived().getBaseLocation());
4569   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4570   return NewDI ? NewDI->getType() : QualType();
4571 }
4572 
4573 template<typename Derived>
4574 TypeSourceInfo *
4575 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4576   if (!isa<DependentNameType>(DI->getType()))
4577     return TransformType(DI);
4578 
4579   // Refine the base location to the type's location.
4580   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4581                        getDerived().getBaseEntity());
4582   if (getDerived().AlreadyTransformed(DI->getType()))
4583     return DI;
4584 
4585   TypeLocBuilder TLB;
4586 
4587   TypeLoc TL = DI->getTypeLoc();
4588   TLB.reserve(TL.getFullDataSize());
4589 
4590   auto QTL = TL.getAs<QualifiedTypeLoc>();
4591   if (QTL)
4592     TL = QTL.getUnqualifiedLoc();
4593 
4594   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4595 
4596   QualType Result = getDerived().TransformDependentNameType(
4597       TLB, DNTL, /*DeducedTSTContext*/true);
4598   if (Result.isNull())
4599     return nullptr;
4600 
4601   if (QTL) {
4602     Result = getDerived().RebuildQualifiedType(Result, QTL);
4603     if (Result.isNull())
4604       return nullptr;
4605     TLB.TypeWasModifiedSafely(Result);
4606   }
4607 
4608   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4609 }
4610 
4611 template<typename Derived>
4612 QualType
4613 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4614                                                QualifiedTypeLoc T) {
4615   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4616   if (Result.isNull())
4617     return QualType();
4618 
4619   Result = getDerived().RebuildQualifiedType(Result, T);
4620 
4621   if (Result.isNull())
4622     return QualType();
4623 
4624   // RebuildQualifiedType might have updated the type, but not in a way
4625   // that invalidates the TypeLoc. (There's no location information for
4626   // qualifiers.)
4627   TLB.TypeWasModifiedSafely(Result);
4628 
4629   return Result;
4630 }
4631 
4632 template <typename Derived>
4633 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4634                                                       QualifiedTypeLoc TL) {
4635 
4636   SourceLocation Loc = TL.getBeginLoc();
4637   Qualifiers Quals = TL.getType().getLocalQualifiers();
4638 
4639   if (((T.getAddressSpace() != LangAS::Default &&
4640         Quals.getAddressSpace() != LangAS::Default)) &&
4641       T.getAddressSpace() != Quals.getAddressSpace()) {
4642     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4643         << TL.getType() << T;
4644     return QualType();
4645   }
4646 
4647   // C++ [dcl.fct]p7:
4648   //   [When] adding cv-qualifications on top of the function type [...] the
4649   //   cv-qualifiers are ignored.
4650   if (T->isFunctionType()) {
4651     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4652                                                      Quals.getAddressSpace());
4653     return T;
4654   }
4655 
4656   // C++ [dcl.ref]p1:
4657   //   when the cv-qualifiers are introduced through the use of a typedef-name
4658   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4659   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4660   // applied to a reference type.
4661   if (T->isReferenceType()) {
4662     // The only qualifier that applies to a reference type is restrict.
4663     if (!Quals.hasRestrict())
4664       return T;
4665     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4666   }
4667 
4668   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4669   // resulting type.
4670   if (Quals.hasObjCLifetime()) {
4671     if (!T->isObjCLifetimeType() && !T->isDependentType())
4672       Quals.removeObjCLifetime();
4673     else if (T.getObjCLifetime()) {
4674       // Objective-C ARC:
4675       //   A lifetime qualifier applied to a substituted template parameter
4676       //   overrides the lifetime qualifier from the template argument.
4677       const AutoType *AutoTy;
4678       if (const SubstTemplateTypeParmType *SubstTypeParam
4679                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4680         QualType Replacement = SubstTypeParam->getReplacementType();
4681         Qualifiers Qs = Replacement.getQualifiers();
4682         Qs.removeObjCLifetime();
4683         Replacement = SemaRef.Context.getQualifiedType(
4684             Replacement.getUnqualifiedType(), Qs);
4685         T = SemaRef.Context.getSubstTemplateTypeParmType(
4686             SubstTypeParam->getReplacedParameter(), Replacement);
4687       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4688         // 'auto' types behave the same way as template parameters.
4689         QualType Deduced = AutoTy->getDeducedType();
4690         Qualifiers Qs = Deduced.getQualifiers();
4691         Qs.removeObjCLifetime();
4692         Deduced =
4693             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4694         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4695                                         AutoTy->isDependentType(),
4696                                         /*isPack=*/false,
4697                                         AutoTy->getTypeConstraintConcept(),
4698                                         AutoTy->getTypeConstraintArguments());
4699       } else {
4700         // Otherwise, complain about the addition of a qualifier to an
4701         // already-qualified type.
4702         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4703         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4704         Quals.removeObjCLifetime();
4705       }
4706     }
4707   }
4708 
4709   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4710 }
4711 
4712 template<typename Derived>
4713 TypeLoc
4714 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4715                                                    QualType ObjectType,
4716                                                    NamedDecl *UnqualLookup,
4717                                                    CXXScopeSpec &SS) {
4718   if (getDerived().AlreadyTransformed(TL.getType()))
4719     return TL;
4720 
4721   TypeSourceInfo *TSI =
4722       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4723   if (TSI)
4724     return TSI->getTypeLoc();
4725   return TypeLoc();
4726 }
4727 
4728 template<typename Derived>
4729 TypeSourceInfo *
4730 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4731                                                    QualType ObjectType,
4732                                                    NamedDecl *UnqualLookup,
4733                                                    CXXScopeSpec &SS) {
4734   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4735     return TSInfo;
4736 
4737   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4738                                    UnqualLookup, SS);
4739 }
4740 
4741 template <typename Derived>
4742 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4743     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4744     CXXScopeSpec &SS) {
4745   QualType T = TL.getType();
4746   assert(!getDerived().AlreadyTransformed(T));
4747 
4748   TypeLocBuilder TLB;
4749   QualType Result;
4750 
4751   if (isa<TemplateSpecializationType>(T)) {
4752     TemplateSpecializationTypeLoc SpecTL =
4753         TL.castAs<TemplateSpecializationTypeLoc>();
4754 
4755     TemplateName Template = getDerived().TransformTemplateName(
4756         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4757         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4758     if (Template.isNull())
4759       return nullptr;
4760 
4761     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4762                                                               Template);
4763   } else if (isa<DependentTemplateSpecializationType>(T)) {
4764     DependentTemplateSpecializationTypeLoc SpecTL =
4765         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4766 
4767     TemplateName Template
4768       = getDerived().RebuildTemplateName(SS,
4769                                          SpecTL.getTemplateKeywordLoc(),
4770                                          *SpecTL.getTypePtr()->getIdentifier(),
4771                                          SpecTL.getTemplateNameLoc(),
4772                                          ObjectType, UnqualLookup,
4773                                          /*AllowInjectedClassName*/true);
4774     if (Template.isNull())
4775       return nullptr;
4776 
4777     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4778                                                                        SpecTL,
4779                                                                        Template,
4780                                                                        SS);
4781   } else {
4782     // Nothing special needs to be done for these.
4783     Result = getDerived().TransformType(TLB, TL);
4784   }
4785 
4786   if (Result.isNull())
4787     return nullptr;
4788 
4789   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4790 }
4791 
4792 template <class TyLoc> static inline
4793 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4794   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4795   NewT.setNameLoc(T.getNameLoc());
4796   return T.getType();
4797 }
4798 
4799 template<typename Derived>
4800 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4801                                                       BuiltinTypeLoc T) {
4802   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4803   NewT.setBuiltinLoc(T.getBuiltinLoc());
4804   if (T.needsExtraLocalData())
4805     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4806   return T.getType();
4807 }
4808 
4809 template<typename Derived>
4810 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4811                                                       ComplexTypeLoc T) {
4812   // FIXME: recurse?
4813   return TransformTypeSpecType(TLB, T);
4814 }
4815 
4816 template <typename Derived>
4817 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4818                                                        AdjustedTypeLoc TL) {
4819   // Adjustments applied during transformation are handled elsewhere.
4820   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4821 }
4822 
4823 template<typename Derived>
4824 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4825                                                       DecayedTypeLoc TL) {
4826   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4827   if (OriginalType.isNull())
4828     return QualType();
4829 
4830   QualType Result = TL.getType();
4831   if (getDerived().AlwaysRebuild() ||
4832       OriginalType != TL.getOriginalLoc().getType())
4833     Result = SemaRef.Context.getDecayedType(OriginalType);
4834   TLB.push<DecayedTypeLoc>(Result);
4835   // Nothing to set for DecayedTypeLoc.
4836   return Result;
4837 }
4838 
4839 template<typename Derived>
4840 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4841                                                       PointerTypeLoc TL) {
4842   QualType PointeeType
4843     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4844   if (PointeeType.isNull())
4845     return QualType();
4846 
4847   QualType Result = TL.getType();
4848   if (PointeeType->getAs<ObjCObjectType>()) {
4849     // A dependent pointer type 'T *' has is being transformed such
4850     // that an Objective-C class type is being replaced for 'T'. The
4851     // resulting pointer type is an ObjCObjectPointerType, not a
4852     // PointerType.
4853     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4854 
4855     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4856     NewT.setStarLoc(TL.getStarLoc());
4857     return Result;
4858   }
4859 
4860   if (getDerived().AlwaysRebuild() ||
4861       PointeeType != TL.getPointeeLoc().getType()) {
4862     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4863     if (Result.isNull())
4864       return QualType();
4865   }
4866 
4867   // Objective-C ARC can add lifetime qualifiers to the type that we're
4868   // pointing to.
4869   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4870 
4871   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4872   NewT.setSigilLoc(TL.getSigilLoc());
4873   return Result;
4874 }
4875 
4876 template<typename Derived>
4877 QualType
4878 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4879                                                   BlockPointerTypeLoc TL) {
4880   QualType PointeeType
4881     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4882   if (PointeeType.isNull())
4883     return QualType();
4884 
4885   QualType Result = TL.getType();
4886   if (getDerived().AlwaysRebuild() ||
4887       PointeeType != TL.getPointeeLoc().getType()) {
4888     Result = getDerived().RebuildBlockPointerType(PointeeType,
4889                                                   TL.getSigilLoc());
4890     if (Result.isNull())
4891       return QualType();
4892   }
4893 
4894   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4895   NewT.setSigilLoc(TL.getSigilLoc());
4896   return Result;
4897 }
4898 
4899 /// Transforms a reference type.  Note that somewhat paradoxically we
4900 /// don't care whether the type itself is an l-value type or an r-value
4901 /// type;  we only care if the type was *written* as an l-value type
4902 /// or an r-value type.
4903 template<typename Derived>
4904 QualType
4905 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4906                                                ReferenceTypeLoc TL) {
4907   const ReferenceType *T = TL.getTypePtr();
4908 
4909   // Note that this works with the pointee-as-written.
4910   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4911   if (PointeeType.isNull())
4912     return QualType();
4913 
4914   QualType Result = TL.getType();
4915   if (getDerived().AlwaysRebuild() ||
4916       PointeeType != T->getPointeeTypeAsWritten()) {
4917     Result = getDerived().RebuildReferenceType(PointeeType,
4918                                                T->isSpelledAsLValue(),
4919                                                TL.getSigilLoc());
4920     if (Result.isNull())
4921       return QualType();
4922   }
4923 
4924   // Objective-C ARC can add lifetime qualifiers to the type that we're
4925   // referring to.
4926   TLB.TypeWasModifiedSafely(
4927       Result->castAs<ReferenceType>()->getPointeeTypeAsWritten());
4928 
4929   // r-value references can be rebuilt as l-value references.
4930   ReferenceTypeLoc NewTL;
4931   if (isa<LValueReferenceType>(Result))
4932     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4933   else
4934     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4935   NewTL.setSigilLoc(TL.getSigilLoc());
4936 
4937   return Result;
4938 }
4939 
4940 template<typename Derived>
4941 QualType
4942 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4943                                                  LValueReferenceTypeLoc TL) {
4944   return TransformReferenceType(TLB, TL);
4945 }
4946 
4947 template<typename Derived>
4948 QualType
4949 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4950                                                  RValueReferenceTypeLoc TL) {
4951   return TransformReferenceType(TLB, TL);
4952 }
4953 
4954 template<typename Derived>
4955 QualType
4956 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4957                                                    MemberPointerTypeLoc TL) {
4958   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4959   if (PointeeType.isNull())
4960     return QualType();
4961 
4962   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4963   TypeSourceInfo *NewClsTInfo = nullptr;
4964   if (OldClsTInfo) {
4965     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4966     if (!NewClsTInfo)
4967       return QualType();
4968   }
4969 
4970   const MemberPointerType *T = TL.getTypePtr();
4971   QualType OldClsType = QualType(T->getClass(), 0);
4972   QualType NewClsType;
4973   if (NewClsTInfo)
4974     NewClsType = NewClsTInfo->getType();
4975   else {
4976     NewClsType = getDerived().TransformType(OldClsType);
4977     if (NewClsType.isNull())
4978       return QualType();
4979   }
4980 
4981   QualType Result = TL.getType();
4982   if (getDerived().AlwaysRebuild() ||
4983       PointeeType != T->getPointeeType() ||
4984       NewClsType != OldClsType) {
4985     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4986                                                    TL.getStarLoc());
4987     if (Result.isNull())
4988       return QualType();
4989   }
4990 
4991   // If we had to adjust the pointee type when building a member pointer, make
4992   // sure to push TypeLoc info for it.
4993   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4994   if (MPT && PointeeType != MPT->getPointeeType()) {
4995     assert(isa<AdjustedType>(MPT->getPointeeType()));
4996     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4997   }
4998 
4999   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
5000   NewTL.setSigilLoc(TL.getSigilLoc());
5001   NewTL.setClassTInfo(NewClsTInfo);
5002 
5003   return Result;
5004 }
5005 
5006 template<typename Derived>
5007 QualType
5008 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
5009                                                    ConstantArrayTypeLoc TL) {
5010   const ConstantArrayType *T = TL.getTypePtr();
5011   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5012   if (ElementType.isNull())
5013     return QualType();
5014 
5015   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5016   Expr *OldSize = TL.getSizeExpr();
5017   if (!OldSize)
5018     OldSize = const_cast<Expr*>(T->getSizeExpr());
5019   Expr *NewSize = nullptr;
5020   if (OldSize) {
5021     EnterExpressionEvaluationContext Unevaluated(
5022         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5023     NewSize = getDerived().TransformExpr(OldSize).template getAs<Expr>();
5024     NewSize = SemaRef.ActOnConstantExpression(NewSize).get();
5025   }
5026 
5027   QualType Result = TL.getType();
5028   if (getDerived().AlwaysRebuild() ||
5029       ElementType != T->getElementType() ||
5030       (T->getSizeExpr() && NewSize != OldSize)) {
5031     Result = getDerived().RebuildConstantArrayType(ElementType,
5032                                                    T->getSizeModifier(),
5033                                                    T->getSize(), NewSize,
5034                                              T->getIndexTypeCVRQualifiers(),
5035                                                    TL.getBracketsRange());
5036     if (Result.isNull())
5037       return QualType();
5038   }
5039 
5040   // We might have either a ConstantArrayType or a VariableArrayType now:
5041   // a ConstantArrayType is allowed to have an element type which is a
5042   // VariableArrayType if the type is dependent.  Fortunately, all array
5043   // types have the same location layout.
5044   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5045   NewTL.setLBracketLoc(TL.getLBracketLoc());
5046   NewTL.setRBracketLoc(TL.getRBracketLoc());
5047   NewTL.setSizeExpr(NewSize);
5048 
5049   return Result;
5050 }
5051 
5052 template<typename Derived>
5053 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
5054                                               TypeLocBuilder &TLB,
5055                                               IncompleteArrayTypeLoc TL) {
5056   const IncompleteArrayType *T = TL.getTypePtr();
5057   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5058   if (ElementType.isNull())
5059     return QualType();
5060 
5061   QualType Result = TL.getType();
5062   if (getDerived().AlwaysRebuild() ||
5063       ElementType != T->getElementType()) {
5064     Result = getDerived().RebuildIncompleteArrayType(ElementType,
5065                                                      T->getSizeModifier(),
5066                                            T->getIndexTypeCVRQualifiers(),
5067                                                      TL.getBracketsRange());
5068     if (Result.isNull())
5069       return QualType();
5070   }
5071 
5072   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
5073   NewTL.setLBracketLoc(TL.getLBracketLoc());
5074   NewTL.setRBracketLoc(TL.getRBracketLoc());
5075   NewTL.setSizeExpr(nullptr);
5076 
5077   return Result;
5078 }
5079 
5080 template<typename Derived>
5081 QualType
5082 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
5083                                                    VariableArrayTypeLoc TL) {
5084   const VariableArrayType *T = TL.getTypePtr();
5085   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5086   if (ElementType.isNull())
5087     return QualType();
5088 
5089   ExprResult SizeResult;
5090   {
5091     EnterExpressionEvaluationContext Context(
5092         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
5093     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
5094   }
5095   if (SizeResult.isInvalid())
5096     return QualType();
5097   SizeResult =
5098       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
5099   if (SizeResult.isInvalid())
5100     return QualType();
5101 
5102   Expr *Size = SizeResult.get();
5103 
5104   QualType Result = TL.getType();
5105   if (getDerived().AlwaysRebuild() ||
5106       ElementType != T->getElementType() ||
5107       Size != T->getSizeExpr()) {
5108     Result = getDerived().RebuildVariableArrayType(ElementType,
5109                                                    T->getSizeModifier(),
5110                                                    Size,
5111                                              T->getIndexTypeCVRQualifiers(),
5112                                                    TL.getBracketsRange());
5113     if (Result.isNull())
5114       return QualType();
5115   }
5116 
5117   // We might have constant size array now, but fortunately it has the same
5118   // location layout.
5119   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5120   NewTL.setLBracketLoc(TL.getLBracketLoc());
5121   NewTL.setRBracketLoc(TL.getRBracketLoc());
5122   NewTL.setSizeExpr(Size);
5123 
5124   return Result;
5125 }
5126 
5127 template<typename Derived>
5128 QualType
5129 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
5130                                              DependentSizedArrayTypeLoc TL) {
5131   const DependentSizedArrayType *T = TL.getTypePtr();
5132   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
5133   if (ElementType.isNull())
5134     return QualType();
5135 
5136   // Array bounds are constant expressions.
5137   EnterExpressionEvaluationContext Unevaluated(
5138       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5139 
5140   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
5141   Expr *origSize = TL.getSizeExpr();
5142   if (!origSize) origSize = T->getSizeExpr();
5143 
5144   ExprResult sizeResult
5145     = getDerived().TransformExpr(origSize);
5146   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
5147   if (sizeResult.isInvalid())
5148     return QualType();
5149 
5150   Expr *size = sizeResult.get();
5151 
5152   QualType Result = TL.getType();
5153   if (getDerived().AlwaysRebuild() ||
5154       ElementType != T->getElementType() ||
5155       size != origSize) {
5156     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
5157                                                          T->getSizeModifier(),
5158                                                          size,
5159                                                 T->getIndexTypeCVRQualifiers(),
5160                                                         TL.getBracketsRange());
5161     if (Result.isNull())
5162       return QualType();
5163   }
5164 
5165   // We might have any sort of array type now, but fortunately they
5166   // all have the same location layout.
5167   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
5168   NewTL.setLBracketLoc(TL.getLBracketLoc());
5169   NewTL.setRBracketLoc(TL.getRBracketLoc());
5170   NewTL.setSizeExpr(size);
5171 
5172   return Result;
5173 }
5174 
5175 template <typename Derived>
5176 QualType TreeTransform<Derived>::TransformDependentVectorType(
5177     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
5178   const DependentVectorType *T = TL.getTypePtr();
5179   QualType ElementType = getDerived().TransformType(T->getElementType());
5180   if (ElementType.isNull())
5181     return QualType();
5182 
5183   EnterExpressionEvaluationContext Unevaluated(
5184       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5185 
5186   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5187   Size = SemaRef.ActOnConstantExpression(Size);
5188   if (Size.isInvalid())
5189     return QualType();
5190 
5191   QualType Result = TL.getType();
5192   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5193       Size.get() != T->getSizeExpr()) {
5194     Result = getDerived().RebuildDependentVectorType(
5195         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
5196     if (Result.isNull())
5197       return QualType();
5198   }
5199 
5200   // Result might be dependent or not.
5201   if (isa<DependentVectorType>(Result)) {
5202     DependentVectorTypeLoc NewTL =
5203         TLB.push<DependentVectorTypeLoc>(Result);
5204     NewTL.setNameLoc(TL.getNameLoc());
5205   } else {
5206     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5207     NewTL.setNameLoc(TL.getNameLoc());
5208   }
5209 
5210   return Result;
5211 }
5212 
5213 template<typename Derived>
5214 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
5215                                       TypeLocBuilder &TLB,
5216                                       DependentSizedExtVectorTypeLoc TL) {
5217   const DependentSizedExtVectorType *T = TL.getTypePtr();
5218 
5219   // FIXME: ext vector locs should be nested
5220   QualType ElementType = getDerived().TransformType(T->getElementType());
5221   if (ElementType.isNull())
5222     return QualType();
5223 
5224   // Vector sizes are constant expressions.
5225   EnterExpressionEvaluationContext Unevaluated(
5226       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5227 
5228   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
5229   Size = SemaRef.ActOnConstantExpression(Size);
5230   if (Size.isInvalid())
5231     return QualType();
5232 
5233   QualType Result = TL.getType();
5234   if (getDerived().AlwaysRebuild() ||
5235       ElementType != T->getElementType() ||
5236       Size.get() != T->getSizeExpr()) {
5237     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
5238                                                              Size.get(),
5239                                                          T->getAttributeLoc());
5240     if (Result.isNull())
5241       return QualType();
5242   }
5243 
5244   // Result might be dependent or not.
5245   if (isa<DependentSizedExtVectorType>(Result)) {
5246     DependentSizedExtVectorTypeLoc NewTL
5247       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
5248     NewTL.setNameLoc(TL.getNameLoc());
5249   } else {
5250     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5251     NewTL.setNameLoc(TL.getNameLoc());
5252   }
5253 
5254   return Result;
5255 }
5256 
5257 template <typename Derived>
5258 QualType
5259 TreeTransform<Derived>::TransformConstantMatrixType(TypeLocBuilder &TLB,
5260                                                     ConstantMatrixTypeLoc TL) {
5261   const ConstantMatrixType *T = TL.getTypePtr();
5262   QualType ElementType = getDerived().TransformType(T->getElementType());
5263   if (ElementType.isNull())
5264     return QualType();
5265 
5266   QualType Result = TL.getType();
5267   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType()) {
5268     Result = getDerived().RebuildConstantMatrixType(
5269         ElementType, T->getNumRows(), T->getNumColumns());
5270     if (Result.isNull())
5271       return QualType();
5272   }
5273 
5274   ConstantMatrixTypeLoc NewTL = TLB.push<ConstantMatrixTypeLoc>(Result);
5275   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5276   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5277   NewTL.setAttrRowOperand(TL.getAttrRowOperand());
5278   NewTL.setAttrColumnOperand(TL.getAttrColumnOperand());
5279 
5280   return Result;
5281 }
5282 
5283 template <typename Derived>
5284 QualType TreeTransform<Derived>::TransformDependentSizedMatrixType(
5285     TypeLocBuilder &TLB, DependentSizedMatrixTypeLoc TL) {
5286   const DependentSizedMatrixType *T = TL.getTypePtr();
5287 
5288   QualType ElementType = getDerived().TransformType(T->getElementType());
5289   if (ElementType.isNull()) {
5290     return QualType();
5291   }
5292 
5293   // Matrix dimensions are constant expressions.
5294   EnterExpressionEvaluationContext Unevaluated(
5295       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5296 
5297   Expr *origRows = TL.getAttrRowOperand();
5298   if (!origRows)
5299     origRows = T->getRowExpr();
5300   Expr *origColumns = TL.getAttrColumnOperand();
5301   if (!origColumns)
5302     origColumns = T->getColumnExpr();
5303 
5304   ExprResult rowResult = getDerived().TransformExpr(origRows);
5305   rowResult = SemaRef.ActOnConstantExpression(rowResult);
5306   if (rowResult.isInvalid())
5307     return QualType();
5308 
5309   ExprResult columnResult = getDerived().TransformExpr(origColumns);
5310   columnResult = SemaRef.ActOnConstantExpression(columnResult);
5311   if (columnResult.isInvalid())
5312     return QualType();
5313 
5314   Expr *rows = rowResult.get();
5315   Expr *columns = columnResult.get();
5316 
5317   QualType Result = TL.getType();
5318   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
5319       rows != origRows || columns != origColumns) {
5320     Result = getDerived().RebuildDependentSizedMatrixType(
5321         ElementType, rows, columns, T->getAttributeLoc());
5322 
5323     if (Result.isNull())
5324       return QualType();
5325   }
5326 
5327   // We might have any sort of matrix type now, but fortunately they
5328   // all have the same location layout.
5329   MatrixTypeLoc NewTL = TLB.push<MatrixTypeLoc>(Result);
5330   NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5331   NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5332   NewTL.setAttrRowOperand(rows);
5333   NewTL.setAttrColumnOperand(columns);
5334   return Result;
5335 }
5336 
5337 template <typename Derived>
5338 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
5339     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
5340   const DependentAddressSpaceType *T = TL.getTypePtr();
5341 
5342   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
5343 
5344   if (pointeeType.isNull())
5345     return QualType();
5346 
5347   // Address spaces are constant expressions.
5348   EnterExpressionEvaluationContext Unevaluated(
5349       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
5350 
5351   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
5352   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
5353   if (AddrSpace.isInvalid())
5354     return QualType();
5355 
5356   QualType Result = TL.getType();
5357   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
5358       AddrSpace.get() != T->getAddrSpaceExpr()) {
5359     Result = getDerived().RebuildDependentAddressSpaceType(
5360         pointeeType, AddrSpace.get(), T->getAttributeLoc());
5361     if (Result.isNull())
5362       return QualType();
5363   }
5364 
5365   // Result might be dependent or not.
5366   if (isa<DependentAddressSpaceType>(Result)) {
5367     DependentAddressSpaceTypeLoc NewTL =
5368         TLB.push<DependentAddressSpaceTypeLoc>(Result);
5369 
5370     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
5371     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
5372     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
5373 
5374   } else {
5375     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
5376         Result, getDerived().getBaseLocation());
5377     TransformType(TLB, DI->getTypeLoc());
5378   }
5379 
5380   return Result;
5381 }
5382 
5383 template <typename Derived>
5384 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
5385                                                      VectorTypeLoc TL) {
5386   const VectorType *T = TL.getTypePtr();
5387   QualType ElementType = getDerived().TransformType(T->getElementType());
5388   if (ElementType.isNull())
5389     return QualType();
5390 
5391   QualType Result = TL.getType();
5392   if (getDerived().AlwaysRebuild() ||
5393       ElementType != T->getElementType()) {
5394     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
5395                                             T->getVectorKind());
5396     if (Result.isNull())
5397       return QualType();
5398   }
5399 
5400   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
5401   NewTL.setNameLoc(TL.getNameLoc());
5402 
5403   return Result;
5404 }
5405 
5406 template<typename Derived>
5407 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
5408                                                         ExtVectorTypeLoc TL) {
5409   const VectorType *T = TL.getTypePtr();
5410   QualType ElementType = getDerived().TransformType(T->getElementType());
5411   if (ElementType.isNull())
5412     return QualType();
5413 
5414   QualType Result = TL.getType();
5415   if (getDerived().AlwaysRebuild() ||
5416       ElementType != T->getElementType()) {
5417     Result = getDerived().RebuildExtVectorType(ElementType,
5418                                                T->getNumElements(),
5419                                                /*FIXME*/ SourceLocation());
5420     if (Result.isNull())
5421       return QualType();
5422   }
5423 
5424   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
5425   NewTL.setNameLoc(TL.getNameLoc());
5426 
5427   return Result;
5428 }
5429 
5430 template <typename Derived>
5431 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
5432     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
5433     bool ExpectParameterPack) {
5434   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
5435   TypeSourceInfo *NewDI = nullptr;
5436 
5437   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
5438     // If we're substituting into a pack expansion type and we know the
5439     // length we want to expand to, just substitute for the pattern.
5440     TypeLoc OldTL = OldDI->getTypeLoc();
5441     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5442 
5443     TypeLocBuilder TLB;
5444     TypeLoc NewTL = OldDI->getTypeLoc();
5445     TLB.reserve(NewTL.getFullDataSize());
5446 
5447     QualType Result = getDerived().TransformType(TLB,
5448                                                OldExpansionTL.getPatternLoc());
5449     if (Result.isNull())
5450       return nullptr;
5451 
5452     Result = RebuildPackExpansionType(Result,
5453                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5454                                       OldExpansionTL.getEllipsisLoc(),
5455                                       NumExpansions);
5456     if (Result.isNull())
5457       return nullptr;
5458 
5459     PackExpansionTypeLoc NewExpansionTL
5460       = TLB.push<PackExpansionTypeLoc>(Result);
5461     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5462     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5463   } else
5464     NewDI = getDerived().TransformType(OldDI);
5465   if (!NewDI)
5466     return nullptr;
5467 
5468   if (NewDI == OldDI && indexAdjustment == 0)
5469     return OldParm;
5470 
5471   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5472                                              OldParm->getDeclContext(),
5473                                              OldParm->getInnerLocStart(),
5474                                              OldParm->getLocation(),
5475                                              OldParm->getIdentifier(),
5476                                              NewDI->getType(),
5477                                              NewDI,
5478                                              OldParm->getStorageClass(),
5479                                              /* DefArg */ nullptr);
5480   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5481                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5482   transformedLocalDecl(OldParm, {newParm});
5483   return newParm;
5484 }
5485 
5486 template <typename Derived>
5487 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5488     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5489     const QualType *ParamTypes,
5490     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5491     SmallVectorImpl<QualType> &OutParamTypes,
5492     SmallVectorImpl<ParmVarDecl *> *PVars,
5493     Sema::ExtParameterInfoBuilder &PInfos) {
5494   int indexAdjustment = 0;
5495 
5496   unsigned NumParams = Params.size();
5497   for (unsigned i = 0; i != NumParams; ++i) {
5498     if (ParmVarDecl *OldParm = Params[i]) {
5499       assert(OldParm->getFunctionScopeIndex() == i);
5500 
5501       Optional<unsigned> NumExpansions;
5502       ParmVarDecl *NewParm = nullptr;
5503       if (OldParm->isParameterPack()) {
5504         // We have a function parameter pack that may need to be expanded.
5505         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5506 
5507         // Find the parameter packs that could be expanded.
5508         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5509         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5510         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5511         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5512 
5513         // Determine whether we should expand the parameter packs.
5514         bool ShouldExpand = false;
5515         bool RetainExpansion = false;
5516         Optional<unsigned> OrigNumExpansions;
5517         if (Unexpanded.size() > 0) {
5518           OrigNumExpansions = ExpansionTL.getTypePtr()->getNumExpansions();
5519           NumExpansions = OrigNumExpansions;
5520           if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5521                                                    Pattern.getSourceRange(),
5522                                                    Unexpanded,
5523                                                    ShouldExpand,
5524                                                    RetainExpansion,
5525                                                    NumExpansions)) {
5526             return true;
5527           }
5528         } else {
5529 #ifndef NDEBUG
5530           const AutoType *AT =
5531               Pattern.getType().getTypePtr()->getContainedAutoType();
5532           assert((AT && (!AT->isDeduced() || AT->getDeducedType().isNull())) &&
5533                  "Could not find parameter packs or undeduced auto type!");
5534 #endif
5535         }
5536 
5537         if (ShouldExpand) {
5538           // Expand the function parameter pack into multiple, separate
5539           // parameters.
5540           getDerived().ExpandingFunctionParameterPack(OldParm);
5541           for (unsigned I = 0; I != *NumExpansions; ++I) {
5542             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5543             ParmVarDecl *NewParm
5544               = getDerived().TransformFunctionTypeParam(OldParm,
5545                                                         indexAdjustment++,
5546                                                         OrigNumExpansions,
5547                                                 /*ExpectParameterPack=*/false);
5548             if (!NewParm)
5549               return true;
5550 
5551             if (ParamInfos)
5552               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5553             OutParamTypes.push_back(NewParm->getType());
5554             if (PVars)
5555               PVars->push_back(NewParm);
5556           }
5557 
5558           // If we're supposed to retain a pack expansion, do so by temporarily
5559           // forgetting the partially-substituted parameter pack.
5560           if (RetainExpansion) {
5561             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5562             ParmVarDecl *NewParm
5563               = getDerived().TransformFunctionTypeParam(OldParm,
5564                                                         indexAdjustment++,
5565                                                         OrigNumExpansions,
5566                                                 /*ExpectParameterPack=*/false);
5567             if (!NewParm)
5568               return true;
5569 
5570             if (ParamInfos)
5571               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5572             OutParamTypes.push_back(NewParm->getType());
5573             if (PVars)
5574               PVars->push_back(NewParm);
5575           }
5576 
5577           // The next parameter should have the same adjustment as the
5578           // last thing we pushed, but we post-incremented indexAdjustment
5579           // on every push.  Also, if we push nothing, the adjustment should
5580           // go down by one.
5581           indexAdjustment--;
5582 
5583           // We're done with the pack expansion.
5584           continue;
5585         }
5586 
5587         // We'll substitute the parameter now without expanding the pack
5588         // expansion.
5589         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5590         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5591                                                           indexAdjustment,
5592                                                           NumExpansions,
5593                                                   /*ExpectParameterPack=*/true);
5594         assert(NewParm->isParameterPack() &&
5595                "Parameter pack no longer a parameter pack after "
5596                "transformation.");
5597       } else {
5598         NewParm = getDerived().TransformFunctionTypeParam(
5599             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5600       }
5601 
5602       if (!NewParm)
5603         return true;
5604 
5605       if (ParamInfos)
5606         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5607       OutParamTypes.push_back(NewParm->getType());
5608       if (PVars)
5609         PVars->push_back(NewParm);
5610       continue;
5611     }
5612 
5613     // Deal with the possibility that we don't have a parameter
5614     // declaration for this parameter.
5615     QualType OldType = ParamTypes[i];
5616     bool IsPackExpansion = false;
5617     Optional<unsigned> NumExpansions;
5618     QualType NewType;
5619     if (const PackExpansionType *Expansion
5620                                        = dyn_cast<PackExpansionType>(OldType)) {
5621       // We have a function parameter pack that may need to be expanded.
5622       QualType Pattern = Expansion->getPattern();
5623       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5624       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5625 
5626       // Determine whether we should expand the parameter packs.
5627       bool ShouldExpand = false;
5628       bool RetainExpansion = false;
5629       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5630                                                Unexpanded,
5631                                                ShouldExpand,
5632                                                RetainExpansion,
5633                                                NumExpansions)) {
5634         return true;
5635       }
5636 
5637       if (ShouldExpand) {
5638         // Expand the function parameter pack into multiple, separate
5639         // parameters.
5640         for (unsigned I = 0; I != *NumExpansions; ++I) {
5641           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5642           QualType NewType = getDerived().TransformType(Pattern);
5643           if (NewType.isNull())
5644             return true;
5645 
5646           if (NewType->containsUnexpandedParameterPack()) {
5647             NewType =
5648                 getSema().getASTContext().getPackExpansionType(NewType, None);
5649 
5650             if (NewType.isNull())
5651               return true;
5652           }
5653 
5654           if (ParamInfos)
5655             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5656           OutParamTypes.push_back(NewType);
5657           if (PVars)
5658             PVars->push_back(nullptr);
5659         }
5660 
5661         // We're done with the pack expansion.
5662         continue;
5663       }
5664 
5665       // If we're supposed to retain a pack expansion, do so by temporarily
5666       // forgetting the partially-substituted parameter pack.
5667       if (RetainExpansion) {
5668         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5669         QualType NewType = getDerived().TransformType(Pattern);
5670         if (NewType.isNull())
5671           return true;
5672 
5673         if (ParamInfos)
5674           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5675         OutParamTypes.push_back(NewType);
5676         if (PVars)
5677           PVars->push_back(nullptr);
5678       }
5679 
5680       // We'll substitute the parameter now without expanding the pack
5681       // expansion.
5682       OldType = Expansion->getPattern();
5683       IsPackExpansion = true;
5684       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5685       NewType = getDerived().TransformType(OldType);
5686     } else {
5687       NewType = getDerived().TransformType(OldType);
5688     }
5689 
5690     if (NewType.isNull())
5691       return true;
5692 
5693     if (IsPackExpansion)
5694       NewType = getSema().Context.getPackExpansionType(NewType,
5695                                                        NumExpansions);
5696 
5697     if (ParamInfos)
5698       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5699     OutParamTypes.push_back(NewType);
5700     if (PVars)
5701       PVars->push_back(nullptr);
5702   }
5703 
5704 #ifndef NDEBUG
5705   if (PVars) {
5706     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5707       if (ParmVarDecl *parm = (*PVars)[i])
5708         assert(parm->getFunctionScopeIndex() == i);
5709   }
5710 #endif
5711 
5712   return false;
5713 }
5714 
5715 template<typename Derived>
5716 QualType
5717 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5718                                                    FunctionProtoTypeLoc TL) {
5719   SmallVector<QualType, 4> ExceptionStorage;
5720   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5721   return getDerived().TransformFunctionProtoType(
5722       TLB, TL, nullptr, Qualifiers(),
5723       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5724         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5725                                             ExceptionStorage, Changed);
5726       });
5727 }
5728 
5729 template<typename Derived> template<typename Fn>
5730 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5731     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5732     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5733 
5734   // Transform the parameters and return type.
5735   //
5736   // We are required to instantiate the params and return type in source order.
5737   // When the function has a trailing return type, we instantiate the
5738   // parameters before the return type,  since the return type can then refer
5739   // to the parameters themselves (via decltype, sizeof, etc.).
5740   //
5741   SmallVector<QualType, 4> ParamTypes;
5742   SmallVector<ParmVarDecl*, 4> ParamDecls;
5743   Sema::ExtParameterInfoBuilder ExtParamInfos;
5744   const FunctionProtoType *T = TL.getTypePtr();
5745 
5746   QualType ResultType;
5747 
5748   if (T->hasTrailingReturn()) {
5749     if (getDerived().TransformFunctionTypeParams(
5750             TL.getBeginLoc(), TL.getParams(),
5751             TL.getTypePtr()->param_type_begin(),
5752             T->getExtParameterInfosOrNull(),
5753             ParamTypes, &ParamDecls, ExtParamInfos))
5754       return QualType();
5755 
5756     {
5757       // C++11 [expr.prim.general]p3:
5758       //   If a declaration declares a member function or member function
5759       //   template of a class X, the expression this is a prvalue of type
5760       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5761       //   and the end of the function-definition, member-declarator, or
5762       //   declarator.
5763       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5764 
5765       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5766       if (ResultType.isNull())
5767         return QualType();
5768     }
5769   }
5770   else {
5771     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5772     if (ResultType.isNull())
5773       return QualType();
5774 
5775     if (getDerived().TransformFunctionTypeParams(
5776             TL.getBeginLoc(), TL.getParams(),
5777             TL.getTypePtr()->param_type_begin(),
5778             T->getExtParameterInfosOrNull(),
5779             ParamTypes, &ParamDecls, ExtParamInfos))
5780       return QualType();
5781   }
5782 
5783   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5784 
5785   bool EPIChanged = false;
5786   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5787     return QualType();
5788 
5789   // Handle extended parameter information.
5790   if (auto NewExtParamInfos =
5791         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5792     if (!EPI.ExtParameterInfos ||
5793         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5794           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5795       EPIChanged = true;
5796     }
5797     EPI.ExtParameterInfos = NewExtParamInfos;
5798   } else if (EPI.ExtParameterInfos) {
5799     EPIChanged = true;
5800     EPI.ExtParameterInfos = nullptr;
5801   }
5802 
5803   QualType Result = TL.getType();
5804   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5805       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5806     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5807     if (Result.isNull())
5808       return QualType();
5809   }
5810 
5811   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5812   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5813   NewTL.setLParenLoc(TL.getLParenLoc());
5814   NewTL.setRParenLoc(TL.getRParenLoc());
5815   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5816   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5817   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5818     NewTL.setParam(i, ParamDecls[i]);
5819 
5820   return Result;
5821 }
5822 
5823 template<typename Derived>
5824 bool TreeTransform<Derived>::TransformExceptionSpec(
5825     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5826     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5827   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5828 
5829   // Instantiate a dynamic noexcept expression, if any.
5830   if (isComputedNoexcept(ESI.Type)) {
5831     EnterExpressionEvaluationContext Unevaluated(
5832         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5833     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5834     if (NoexceptExpr.isInvalid())
5835       return true;
5836 
5837     ExceptionSpecificationType EST = ESI.Type;
5838     NoexceptExpr =
5839         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5840     if (NoexceptExpr.isInvalid())
5841       return true;
5842 
5843     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5844       Changed = true;
5845     ESI.NoexceptExpr = NoexceptExpr.get();
5846     ESI.Type = EST;
5847   }
5848 
5849   if (ESI.Type != EST_Dynamic)
5850     return false;
5851 
5852   // Instantiate a dynamic exception specification's type.
5853   for (QualType T : ESI.Exceptions) {
5854     if (const PackExpansionType *PackExpansion =
5855             T->getAs<PackExpansionType>()) {
5856       Changed = true;
5857 
5858       // We have a pack expansion. Instantiate it.
5859       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5860       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5861                                               Unexpanded);
5862       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5863 
5864       // Determine whether the set of unexpanded parameter packs can and
5865       // should
5866       // be expanded.
5867       bool Expand = false;
5868       bool RetainExpansion = false;
5869       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5870       // FIXME: Track the location of the ellipsis (and track source location
5871       // information for the types in the exception specification in general).
5872       if (getDerived().TryExpandParameterPacks(
5873               Loc, SourceRange(), Unexpanded, Expand,
5874               RetainExpansion, NumExpansions))
5875         return true;
5876 
5877       if (!Expand) {
5878         // We can't expand this pack expansion into separate arguments yet;
5879         // just substitute into the pattern and create a new pack expansion
5880         // type.
5881         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5882         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5883         if (U.isNull())
5884           return true;
5885 
5886         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5887         Exceptions.push_back(U);
5888         continue;
5889       }
5890 
5891       // Substitute into the pack expansion pattern for each slice of the
5892       // pack.
5893       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5894         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5895 
5896         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5897         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5898           return true;
5899 
5900         Exceptions.push_back(U);
5901       }
5902     } else {
5903       QualType U = getDerived().TransformType(T);
5904       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5905         return true;
5906       if (T != U)
5907         Changed = true;
5908 
5909       Exceptions.push_back(U);
5910     }
5911   }
5912 
5913   ESI.Exceptions = Exceptions;
5914   if (ESI.Exceptions.empty())
5915     ESI.Type = EST_DynamicNone;
5916   return false;
5917 }
5918 
5919 template<typename Derived>
5920 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5921                                                  TypeLocBuilder &TLB,
5922                                                  FunctionNoProtoTypeLoc TL) {
5923   const FunctionNoProtoType *T = TL.getTypePtr();
5924   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5925   if (ResultType.isNull())
5926     return QualType();
5927 
5928   QualType Result = TL.getType();
5929   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5930     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5931 
5932   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5933   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5934   NewTL.setLParenLoc(TL.getLParenLoc());
5935   NewTL.setRParenLoc(TL.getRParenLoc());
5936   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5937 
5938   return Result;
5939 }
5940 
5941 template<typename Derived> QualType
5942 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5943                                                  UnresolvedUsingTypeLoc TL) {
5944   const UnresolvedUsingType *T = TL.getTypePtr();
5945   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5946   if (!D)
5947     return QualType();
5948 
5949   QualType Result = TL.getType();
5950   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5951     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5952     if (Result.isNull())
5953       return QualType();
5954   }
5955 
5956   // We might get an arbitrary type spec type back.  We should at
5957   // least always get a type spec type, though.
5958   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5959   NewTL.setNameLoc(TL.getNameLoc());
5960 
5961   return Result;
5962 }
5963 
5964 template<typename Derived>
5965 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5966                                                       TypedefTypeLoc TL) {
5967   const TypedefType *T = TL.getTypePtr();
5968   TypedefNameDecl *Typedef
5969     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5970                                                                T->getDecl()));
5971   if (!Typedef)
5972     return QualType();
5973 
5974   QualType Result = TL.getType();
5975   if (getDerived().AlwaysRebuild() ||
5976       Typedef != T->getDecl()) {
5977     Result = getDerived().RebuildTypedefType(Typedef);
5978     if (Result.isNull())
5979       return QualType();
5980   }
5981 
5982   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5983   NewTL.setNameLoc(TL.getNameLoc());
5984 
5985   return Result;
5986 }
5987 
5988 template<typename Derived>
5989 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5990                                                       TypeOfExprTypeLoc TL) {
5991   // typeof expressions are not potentially evaluated contexts
5992   EnterExpressionEvaluationContext Unevaluated(
5993       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5994       Sema::ReuseLambdaContextDecl);
5995 
5996   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5997   if (E.isInvalid())
5998     return QualType();
5999 
6000   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
6001   if (E.isInvalid())
6002     return QualType();
6003 
6004   QualType Result = TL.getType();
6005   if (getDerived().AlwaysRebuild() ||
6006       E.get() != TL.getUnderlyingExpr()) {
6007     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
6008     if (Result.isNull())
6009       return QualType();
6010   }
6011   else E.get();
6012 
6013   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
6014   NewTL.setTypeofLoc(TL.getTypeofLoc());
6015   NewTL.setLParenLoc(TL.getLParenLoc());
6016   NewTL.setRParenLoc(TL.getRParenLoc());
6017 
6018   return Result;
6019 }
6020 
6021 template<typename Derived>
6022 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
6023                                                      TypeOfTypeLoc TL) {
6024   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
6025   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
6026   if (!New_Under_TI)
6027     return QualType();
6028 
6029   QualType Result = TL.getType();
6030   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
6031     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
6032     if (Result.isNull())
6033       return QualType();
6034   }
6035 
6036   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
6037   NewTL.setTypeofLoc(TL.getTypeofLoc());
6038   NewTL.setLParenLoc(TL.getLParenLoc());
6039   NewTL.setRParenLoc(TL.getRParenLoc());
6040   NewTL.setUnderlyingTInfo(New_Under_TI);
6041 
6042   return Result;
6043 }
6044 
6045 template<typename Derived>
6046 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
6047                                                        DecltypeTypeLoc TL) {
6048   const DecltypeType *T = TL.getTypePtr();
6049 
6050   // decltype expressions are not potentially evaluated contexts
6051   EnterExpressionEvaluationContext Unevaluated(
6052       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
6053       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
6054 
6055   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
6056   if (E.isInvalid())
6057     return QualType();
6058 
6059   E = getSema().ActOnDecltypeExpression(E.get());
6060   if (E.isInvalid())
6061     return QualType();
6062 
6063   QualType Result = TL.getType();
6064   if (getDerived().AlwaysRebuild() ||
6065       E.get() != T->getUnderlyingExpr()) {
6066     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
6067     if (Result.isNull())
6068       return QualType();
6069   }
6070   else E.get();
6071 
6072   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
6073   NewTL.setNameLoc(TL.getNameLoc());
6074 
6075   return Result;
6076 }
6077 
6078 template<typename Derived>
6079 QualType TreeTransform<Derived>::TransformUnaryTransformType(
6080                                                             TypeLocBuilder &TLB,
6081                                                      UnaryTransformTypeLoc TL) {
6082   QualType Result = TL.getType();
6083   if (Result->isDependentType()) {
6084     const UnaryTransformType *T = TL.getTypePtr();
6085     QualType NewBase =
6086       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
6087     Result = getDerived().RebuildUnaryTransformType(NewBase,
6088                                                     T->getUTTKind(),
6089                                                     TL.getKWLoc());
6090     if (Result.isNull())
6091       return QualType();
6092   }
6093 
6094   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
6095   NewTL.setKWLoc(TL.getKWLoc());
6096   NewTL.setParensRange(TL.getParensRange());
6097   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
6098   return Result;
6099 }
6100 
6101 template<typename Derived>
6102 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
6103     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
6104   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
6105 
6106   CXXScopeSpec SS;
6107   TemplateName TemplateName = getDerived().TransformTemplateName(
6108       SS, T->getTemplateName(), TL.getTemplateNameLoc());
6109   if (TemplateName.isNull())
6110     return QualType();
6111 
6112   QualType OldDeduced = T->getDeducedType();
6113   QualType NewDeduced;
6114   if (!OldDeduced.isNull()) {
6115     NewDeduced = getDerived().TransformType(OldDeduced);
6116     if (NewDeduced.isNull())
6117       return QualType();
6118   }
6119 
6120   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
6121       TemplateName, NewDeduced);
6122   if (Result.isNull())
6123     return QualType();
6124 
6125   DeducedTemplateSpecializationTypeLoc NewTL =
6126       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
6127   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6128 
6129   return Result;
6130 }
6131 
6132 template<typename Derived>
6133 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
6134                                                      RecordTypeLoc TL) {
6135   const RecordType *T = TL.getTypePtr();
6136   RecordDecl *Record
6137     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6138                                                           T->getDecl()));
6139   if (!Record)
6140     return QualType();
6141 
6142   QualType Result = TL.getType();
6143   if (getDerived().AlwaysRebuild() ||
6144       Record != T->getDecl()) {
6145     Result = getDerived().RebuildRecordType(Record);
6146     if (Result.isNull())
6147       return QualType();
6148   }
6149 
6150   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
6151   NewTL.setNameLoc(TL.getNameLoc());
6152 
6153   return Result;
6154 }
6155 
6156 template<typename Derived>
6157 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
6158                                                    EnumTypeLoc TL) {
6159   const EnumType *T = TL.getTypePtr();
6160   EnumDecl *Enum
6161     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
6162                                                         T->getDecl()));
6163   if (!Enum)
6164     return QualType();
6165 
6166   QualType Result = TL.getType();
6167   if (getDerived().AlwaysRebuild() ||
6168       Enum != T->getDecl()) {
6169     Result = getDerived().RebuildEnumType(Enum);
6170     if (Result.isNull())
6171       return QualType();
6172   }
6173 
6174   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
6175   NewTL.setNameLoc(TL.getNameLoc());
6176 
6177   return Result;
6178 }
6179 
6180 template<typename Derived>
6181 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
6182                                          TypeLocBuilder &TLB,
6183                                          InjectedClassNameTypeLoc TL) {
6184   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
6185                                        TL.getTypePtr()->getDecl());
6186   if (!D) return QualType();
6187 
6188   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
6189   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
6190   return T;
6191 }
6192 
6193 template<typename Derived>
6194 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
6195                                                 TypeLocBuilder &TLB,
6196                                                 TemplateTypeParmTypeLoc TL) {
6197   return TransformTypeSpecType(TLB, TL);
6198 }
6199 
6200 template<typename Derived>
6201 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
6202                                          TypeLocBuilder &TLB,
6203                                          SubstTemplateTypeParmTypeLoc TL) {
6204   const SubstTemplateTypeParmType *T = TL.getTypePtr();
6205 
6206   // Substitute into the replacement type, which itself might involve something
6207   // that needs to be transformed. This only tends to occur with default
6208   // template arguments of template template parameters.
6209   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
6210   QualType Replacement = getDerived().TransformType(T->getReplacementType());
6211   if (Replacement.isNull())
6212     return QualType();
6213 
6214   // Always canonicalize the replacement type.
6215   Replacement = SemaRef.Context.getCanonicalType(Replacement);
6216   QualType Result
6217     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
6218                                                    Replacement);
6219 
6220   // Propagate type-source information.
6221   SubstTemplateTypeParmTypeLoc NewTL
6222     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
6223   NewTL.setNameLoc(TL.getNameLoc());
6224   return Result;
6225 
6226 }
6227 
6228 template<typename Derived>
6229 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
6230                                           TypeLocBuilder &TLB,
6231                                           SubstTemplateTypeParmPackTypeLoc TL) {
6232   return TransformTypeSpecType(TLB, TL);
6233 }
6234 
6235 template<typename Derived>
6236 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6237                                                         TypeLocBuilder &TLB,
6238                                            TemplateSpecializationTypeLoc TL) {
6239   const TemplateSpecializationType *T = TL.getTypePtr();
6240 
6241   // The nested-name-specifier never matters in a TemplateSpecializationType,
6242   // because we can't have a dependent nested-name-specifier anyway.
6243   CXXScopeSpec SS;
6244   TemplateName Template
6245     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
6246                                          TL.getTemplateNameLoc());
6247   if (Template.isNull())
6248     return QualType();
6249 
6250   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
6251 }
6252 
6253 template<typename Derived>
6254 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
6255                                                      AtomicTypeLoc TL) {
6256   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6257   if (ValueType.isNull())
6258     return QualType();
6259 
6260   QualType Result = TL.getType();
6261   if (getDerived().AlwaysRebuild() ||
6262       ValueType != TL.getValueLoc().getType()) {
6263     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
6264     if (Result.isNull())
6265       return QualType();
6266   }
6267 
6268   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
6269   NewTL.setKWLoc(TL.getKWLoc());
6270   NewTL.setLParenLoc(TL.getLParenLoc());
6271   NewTL.setRParenLoc(TL.getRParenLoc());
6272 
6273   return Result;
6274 }
6275 
6276 template <typename Derived>
6277 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
6278                                                    PipeTypeLoc TL) {
6279   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
6280   if (ValueType.isNull())
6281     return QualType();
6282 
6283   QualType Result = TL.getType();
6284   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
6285     const PipeType *PT = Result->castAs<PipeType>();
6286     bool isReadPipe = PT->isReadOnly();
6287     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
6288     if (Result.isNull())
6289       return QualType();
6290   }
6291 
6292   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
6293   NewTL.setKWLoc(TL.getKWLoc());
6294 
6295   return Result;
6296 }
6297 
6298 template <typename Derived>
6299 QualType TreeTransform<Derived>::TransformExtIntType(TypeLocBuilder &TLB,
6300                                                      ExtIntTypeLoc TL) {
6301   const ExtIntType *EIT = TL.getTypePtr();
6302   QualType Result = TL.getType();
6303 
6304   if (getDerived().AlwaysRebuild()) {
6305     Result = getDerived().RebuildExtIntType(EIT->isUnsigned(),
6306                                             EIT->getNumBits(), TL.getNameLoc());
6307     if (Result.isNull())
6308       return QualType();
6309   }
6310 
6311   ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6312   NewTL.setNameLoc(TL.getNameLoc());
6313   return Result;
6314 }
6315 
6316 template <typename Derived>
6317 QualType TreeTransform<Derived>::TransformDependentExtIntType(
6318     TypeLocBuilder &TLB, DependentExtIntTypeLoc TL) {
6319   const DependentExtIntType *EIT = TL.getTypePtr();
6320 
6321   EnterExpressionEvaluationContext Unevaluated(
6322       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6323   ExprResult BitsExpr = getDerived().TransformExpr(EIT->getNumBitsExpr());
6324   BitsExpr = SemaRef.ActOnConstantExpression(BitsExpr);
6325 
6326   if (BitsExpr.isInvalid())
6327     return QualType();
6328 
6329   QualType Result = TL.getType();
6330 
6331   if (getDerived().AlwaysRebuild() || BitsExpr.get() != EIT->getNumBitsExpr()) {
6332     Result = getDerived().RebuildDependentExtIntType(
6333         EIT->isUnsigned(), BitsExpr.get(), TL.getNameLoc());
6334 
6335     if (Result.isNull())
6336       return QualType();
6337   }
6338 
6339   if (isa<DependentExtIntType>(Result)) {
6340     DependentExtIntTypeLoc NewTL = TLB.push<DependentExtIntTypeLoc>(Result);
6341     NewTL.setNameLoc(TL.getNameLoc());
6342   } else {
6343     ExtIntTypeLoc NewTL = TLB.push<ExtIntTypeLoc>(Result);
6344     NewTL.setNameLoc(TL.getNameLoc());
6345   }
6346   return Result;
6347 }
6348 
6349   /// Simple iterator that traverses the template arguments in a
6350   /// container that provides a \c getArgLoc() member function.
6351   ///
6352   /// This iterator is intended to be used with the iterator form of
6353   /// \c TreeTransform<Derived>::TransformTemplateArguments().
6354   template<typename ArgLocContainer>
6355   class TemplateArgumentLocContainerIterator {
6356     ArgLocContainer *Container;
6357     unsigned Index;
6358 
6359   public:
6360     typedef TemplateArgumentLoc value_type;
6361     typedef TemplateArgumentLoc reference;
6362     typedef int difference_type;
6363     typedef std::input_iterator_tag iterator_category;
6364 
6365     class pointer {
6366       TemplateArgumentLoc Arg;
6367 
6368     public:
6369       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
6370 
6371       const TemplateArgumentLoc *operator->() const {
6372         return &Arg;
6373       }
6374     };
6375 
6376 
6377     TemplateArgumentLocContainerIterator() {}
6378 
6379     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
6380                                  unsigned Index)
6381       : Container(&Container), Index(Index) { }
6382 
6383     TemplateArgumentLocContainerIterator &operator++() {
6384       ++Index;
6385       return *this;
6386     }
6387 
6388     TemplateArgumentLocContainerIterator operator++(int) {
6389       TemplateArgumentLocContainerIterator Old(*this);
6390       ++(*this);
6391       return Old;
6392     }
6393 
6394     TemplateArgumentLoc operator*() const {
6395       return Container->getArgLoc(Index);
6396     }
6397 
6398     pointer operator->() const {
6399       return pointer(Container->getArgLoc(Index));
6400     }
6401 
6402     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
6403                            const TemplateArgumentLocContainerIterator &Y) {
6404       return X.Container == Y.Container && X.Index == Y.Index;
6405     }
6406 
6407     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
6408                            const TemplateArgumentLocContainerIterator &Y) {
6409       return !(X == Y);
6410     }
6411   };
6412 
6413 template<typename Derived>
6414 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
6415                                                    AutoTypeLoc TL) {
6416   const AutoType *T = TL.getTypePtr();
6417   QualType OldDeduced = T->getDeducedType();
6418   QualType NewDeduced;
6419   if (!OldDeduced.isNull()) {
6420     NewDeduced = getDerived().TransformType(OldDeduced);
6421     if (NewDeduced.isNull())
6422       return QualType();
6423   }
6424 
6425   ConceptDecl *NewCD = nullptr;
6426   TemplateArgumentListInfo NewTemplateArgs;
6427   NestedNameSpecifierLoc NewNestedNameSpec;
6428   if (TL.getTypePtr()->isConstrained()) {
6429     NewCD = cast_or_null<ConceptDecl>(
6430         getDerived().TransformDecl(
6431             TL.getConceptNameLoc(),
6432             TL.getTypePtr()->getTypeConstraintConcept()));
6433 
6434     NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6435     NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6436     typedef TemplateArgumentLocContainerIterator<AutoTypeLoc> ArgIterator;
6437     if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6438                                                 ArgIterator(TL,
6439                                                             TL.getNumArgs()),
6440                                                 NewTemplateArgs))
6441       return QualType();
6442 
6443     if (TL.getNestedNameSpecifierLoc()) {
6444       NewNestedNameSpec
6445         = getDerived().TransformNestedNameSpecifierLoc(
6446             TL.getNestedNameSpecifierLoc());
6447       if (!NewNestedNameSpec)
6448         return QualType();
6449     }
6450   }
6451 
6452   QualType Result = TL.getType();
6453   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
6454       T->isDependentType()) {
6455     llvm::SmallVector<TemplateArgument, 4> NewArgList;
6456     NewArgList.reserve(NewArgList.size());
6457     for (const auto &ArgLoc : NewTemplateArgs.arguments())
6458       NewArgList.push_back(ArgLoc.getArgument());
6459     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword(), NewCD,
6460                                           NewArgList);
6461     if (Result.isNull())
6462       return QualType();
6463   }
6464 
6465   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
6466   NewTL.setNameLoc(TL.getNameLoc());
6467   NewTL.setNestedNameSpecifierLoc(NewNestedNameSpec);
6468   NewTL.setTemplateKWLoc(TL.getTemplateKWLoc());
6469   NewTL.setConceptNameLoc(TL.getConceptNameLoc());
6470   NewTL.setFoundDecl(TL.getFoundDecl());
6471   NewTL.setLAngleLoc(TL.getLAngleLoc());
6472   NewTL.setRAngleLoc(TL.getRAngleLoc());
6473   for (unsigned I = 0; I < TL.getNumArgs(); ++I)
6474     NewTL.setArgLocInfo(I, NewTemplateArgs.arguments()[I].getLocInfo());
6475 
6476   return Result;
6477 }
6478 
6479 template <typename Derived>
6480 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
6481                                                         TypeLocBuilder &TLB,
6482                                            TemplateSpecializationTypeLoc TL,
6483                                                       TemplateName Template) {
6484   TemplateArgumentListInfo NewTemplateArgs;
6485   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6486   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6487   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
6488     ArgIterator;
6489   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6490                                               ArgIterator(TL, TL.getNumArgs()),
6491                                               NewTemplateArgs))
6492     return QualType();
6493 
6494   // FIXME: maybe don't rebuild if all the template arguments are the same.
6495 
6496   QualType Result =
6497     getDerived().RebuildTemplateSpecializationType(Template,
6498                                                    TL.getTemplateNameLoc(),
6499                                                    NewTemplateArgs);
6500 
6501   if (!Result.isNull()) {
6502     // Specializations of template template parameters are represented as
6503     // TemplateSpecializationTypes, and substitution of type alias templates
6504     // within a dependent context can transform them into
6505     // DependentTemplateSpecializationTypes.
6506     if (isa<DependentTemplateSpecializationType>(Result)) {
6507       DependentTemplateSpecializationTypeLoc NewTL
6508         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6509       NewTL.setElaboratedKeywordLoc(SourceLocation());
6510       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
6511       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6512       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6513       NewTL.setLAngleLoc(TL.getLAngleLoc());
6514       NewTL.setRAngleLoc(TL.getRAngleLoc());
6515       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6516         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6517       return Result;
6518     }
6519 
6520     TemplateSpecializationTypeLoc NewTL
6521       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6522     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6523     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6524     NewTL.setLAngleLoc(TL.getLAngleLoc());
6525     NewTL.setRAngleLoc(TL.getRAngleLoc());
6526     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6527       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6528   }
6529 
6530   return Result;
6531 }
6532 
6533 template <typename Derived>
6534 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6535                                      TypeLocBuilder &TLB,
6536                                      DependentTemplateSpecializationTypeLoc TL,
6537                                      TemplateName Template,
6538                                      CXXScopeSpec &SS) {
6539   TemplateArgumentListInfo NewTemplateArgs;
6540   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6541   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6542   typedef TemplateArgumentLocContainerIterator<
6543             DependentTemplateSpecializationTypeLoc> ArgIterator;
6544   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6545                                               ArgIterator(TL, TL.getNumArgs()),
6546                                               NewTemplateArgs))
6547     return QualType();
6548 
6549   // FIXME: maybe don't rebuild if all the template arguments are the same.
6550 
6551   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6552     QualType Result
6553       = getSema().Context.getDependentTemplateSpecializationType(
6554                                                 TL.getTypePtr()->getKeyword(),
6555                                                          DTN->getQualifier(),
6556                                                          DTN->getIdentifier(),
6557                                                                NewTemplateArgs);
6558 
6559     DependentTemplateSpecializationTypeLoc NewTL
6560       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6561     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6562     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6563     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6564     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6565     NewTL.setLAngleLoc(TL.getLAngleLoc());
6566     NewTL.setRAngleLoc(TL.getRAngleLoc());
6567     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6568       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6569     return Result;
6570   }
6571 
6572   QualType Result
6573     = getDerived().RebuildTemplateSpecializationType(Template,
6574                                                      TL.getTemplateNameLoc(),
6575                                                      NewTemplateArgs);
6576 
6577   if (!Result.isNull()) {
6578     /// FIXME: Wrap this in an elaborated-type-specifier?
6579     TemplateSpecializationTypeLoc NewTL
6580       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6581     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6582     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6583     NewTL.setLAngleLoc(TL.getLAngleLoc());
6584     NewTL.setRAngleLoc(TL.getRAngleLoc());
6585     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6586       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6587   }
6588 
6589   return Result;
6590 }
6591 
6592 template<typename Derived>
6593 QualType
6594 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6595                                                 ElaboratedTypeLoc TL) {
6596   const ElaboratedType *T = TL.getTypePtr();
6597 
6598   NestedNameSpecifierLoc QualifierLoc;
6599   // NOTE: the qualifier in an ElaboratedType is optional.
6600   if (TL.getQualifierLoc()) {
6601     QualifierLoc
6602       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6603     if (!QualifierLoc)
6604       return QualType();
6605   }
6606 
6607   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6608   if (NamedT.isNull())
6609     return QualType();
6610 
6611   // C++0x [dcl.type.elab]p2:
6612   //   If the identifier resolves to a typedef-name or the simple-template-id
6613   //   resolves to an alias template specialization, the
6614   //   elaborated-type-specifier is ill-formed.
6615   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6616     if (const TemplateSpecializationType *TST =
6617           NamedT->getAs<TemplateSpecializationType>()) {
6618       TemplateName Template = TST->getTemplateName();
6619       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6620               Template.getAsTemplateDecl())) {
6621         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6622                      diag::err_tag_reference_non_tag)
6623             << TAT << Sema::NTK_TypeAliasTemplate
6624             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6625         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6626       }
6627     }
6628   }
6629 
6630   QualType Result = TL.getType();
6631   if (getDerived().AlwaysRebuild() ||
6632       QualifierLoc != TL.getQualifierLoc() ||
6633       NamedT != T->getNamedType()) {
6634     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6635                                                 T->getKeyword(),
6636                                                 QualifierLoc, NamedT);
6637     if (Result.isNull())
6638       return QualType();
6639   }
6640 
6641   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6642   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6643   NewTL.setQualifierLoc(QualifierLoc);
6644   return Result;
6645 }
6646 
6647 template<typename Derived>
6648 QualType TreeTransform<Derived>::TransformAttributedType(
6649                                                 TypeLocBuilder &TLB,
6650                                                 AttributedTypeLoc TL) {
6651   const AttributedType *oldType = TL.getTypePtr();
6652   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6653   if (modifiedType.isNull())
6654     return QualType();
6655 
6656   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6657   const Attr *oldAttr = TL.getAttr();
6658   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6659   if (oldAttr && !newAttr)
6660     return QualType();
6661 
6662   QualType result = TL.getType();
6663 
6664   // FIXME: dependent operand expressions?
6665   if (getDerived().AlwaysRebuild() ||
6666       modifiedType != oldType->getModifiedType()) {
6667     // TODO: this is really lame; we should really be rebuilding the
6668     // equivalent type from first principles.
6669     QualType equivalentType
6670       = getDerived().TransformType(oldType->getEquivalentType());
6671     if (equivalentType.isNull())
6672       return QualType();
6673 
6674     // Check whether we can add nullability; it is only represented as
6675     // type sugar, and therefore cannot be diagnosed in any other way.
6676     if (auto nullability = oldType->getImmediateNullability()) {
6677       if (!modifiedType->canHaveNullability()) {
6678         SemaRef.Diag(TL.getAttr()->getLocation(),
6679                      diag::err_nullability_nonpointer)
6680             << DiagNullabilityKind(*nullability, false) << modifiedType;
6681         return QualType();
6682       }
6683     }
6684 
6685     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6686                                                modifiedType,
6687                                                equivalentType);
6688   }
6689 
6690   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6691   newTL.setAttr(newAttr);
6692   return result;
6693 }
6694 
6695 template<typename Derived>
6696 QualType
6697 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6698                                            ParenTypeLoc TL) {
6699   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6700   if (Inner.isNull())
6701     return QualType();
6702 
6703   QualType Result = TL.getType();
6704   if (getDerived().AlwaysRebuild() ||
6705       Inner != TL.getInnerLoc().getType()) {
6706     Result = getDerived().RebuildParenType(Inner);
6707     if (Result.isNull())
6708       return QualType();
6709   }
6710 
6711   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6712   NewTL.setLParenLoc(TL.getLParenLoc());
6713   NewTL.setRParenLoc(TL.getRParenLoc());
6714   return Result;
6715 }
6716 
6717 template <typename Derived>
6718 QualType
6719 TreeTransform<Derived>::TransformMacroQualifiedType(TypeLocBuilder &TLB,
6720                                                     MacroQualifiedTypeLoc TL) {
6721   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6722   if (Inner.isNull())
6723     return QualType();
6724 
6725   QualType Result = TL.getType();
6726   if (getDerived().AlwaysRebuild() || Inner != TL.getInnerLoc().getType()) {
6727     Result =
6728         getDerived().RebuildMacroQualifiedType(Inner, TL.getMacroIdentifier());
6729     if (Result.isNull())
6730       return QualType();
6731   }
6732 
6733   MacroQualifiedTypeLoc NewTL = TLB.push<MacroQualifiedTypeLoc>(Result);
6734   NewTL.setExpansionLoc(TL.getExpansionLoc());
6735   return Result;
6736 }
6737 
6738 template<typename Derived>
6739 QualType TreeTransform<Derived>::TransformDependentNameType(
6740     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6741   return TransformDependentNameType(TLB, TL, false);
6742 }
6743 
6744 template<typename Derived>
6745 QualType TreeTransform<Derived>::TransformDependentNameType(
6746     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6747   const DependentNameType *T = TL.getTypePtr();
6748 
6749   NestedNameSpecifierLoc QualifierLoc
6750     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6751   if (!QualifierLoc)
6752     return QualType();
6753 
6754   QualType Result
6755     = getDerived().RebuildDependentNameType(T->getKeyword(),
6756                                             TL.getElaboratedKeywordLoc(),
6757                                             QualifierLoc,
6758                                             T->getIdentifier(),
6759                                             TL.getNameLoc(),
6760                                             DeducedTSTContext);
6761   if (Result.isNull())
6762     return QualType();
6763 
6764   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6765     QualType NamedT = ElabT->getNamedType();
6766     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6767 
6768     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6769     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6770     NewTL.setQualifierLoc(QualifierLoc);
6771   } else {
6772     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6773     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6774     NewTL.setQualifierLoc(QualifierLoc);
6775     NewTL.setNameLoc(TL.getNameLoc());
6776   }
6777   return Result;
6778 }
6779 
6780 template<typename Derived>
6781 QualType TreeTransform<Derived>::
6782           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6783                                  DependentTemplateSpecializationTypeLoc TL) {
6784   NestedNameSpecifierLoc QualifierLoc;
6785   if (TL.getQualifierLoc()) {
6786     QualifierLoc
6787       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6788     if (!QualifierLoc)
6789       return QualType();
6790   }
6791 
6792   return getDerived()
6793            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6794 }
6795 
6796 template<typename Derived>
6797 QualType TreeTransform<Derived>::
6798 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6799                                    DependentTemplateSpecializationTypeLoc TL,
6800                                        NestedNameSpecifierLoc QualifierLoc) {
6801   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6802 
6803   TemplateArgumentListInfo NewTemplateArgs;
6804   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6805   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6806 
6807   typedef TemplateArgumentLocContainerIterator<
6808   DependentTemplateSpecializationTypeLoc> ArgIterator;
6809   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6810                                               ArgIterator(TL, TL.getNumArgs()),
6811                                               NewTemplateArgs))
6812     return QualType();
6813 
6814   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6815       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6816       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6817       /*AllowInjectedClassName*/ false);
6818   if (Result.isNull())
6819     return QualType();
6820 
6821   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6822     QualType NamedT = ElabT->getNamedType();
6823 
6824     // Copy information relevant to the template specialization.
6825     TemplateSpecializationTypeLoc NamedTL
6826       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6827     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6828     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6829     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6830     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6831     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6832       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6833 
6834     // Copy information relevant to the elaborated type.
6835     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6836     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6837     NewTL.setQualifierLoc(QualifierLoc);
6838   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6839     DependentTemplateSpecializationTypeLoc SpecTL
6840       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6841     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6842     SpecTL.setQualifierLoc(QualifierLoc);
6843     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6844     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6845     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6846     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6847     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6848       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6849   } else {
6850     TemplateSpecializationTypeLoc SpecTL
6851       = TLB.push<TemplateSpecializationTypeLoc>(Result);
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   }
6859   return Result;
6860 }
6861 
6862 template<typename Derived>
6863 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6864                                                       PackExpansionTypeLoc TL) {
6865   QualType Pattern
6866     = getDerived().TransformType(TLB, TL.getPatternLoc());
6867   if (Pattern.isNull())
6868     return QualType();
6869 
6870   QualType Result = TL.getType();
6871   if (getDerived().AlwaysRebuild() ||
6872       Pattern != TL.getPatternLoc().getType()) {
6873     Result = getDerived().RebuildPackExpansionType(Pattern,
6874                                            TL.getPatternLoc().getSourceRange(),
6875                                                    TL.getEllipsisLoc(),
6876                                            TL.getTypePtr()->getNumExpansions());
6877     if (Result.isNull())
6878       return QualType();
6879   }
6880 
6881   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6882   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6883   return Result;
6884 }
6885 
6886 template<typename Derived>
6887 QualType
6888 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6889                                                    ObjCInterfaceTypeLoc TL) {
6890   // ObjCInterfaceType is never dependent.
6891   TLB.pushFullCopy(TL);
6892   return TL.getType();
6893 }
6894 
6895 template<typename Derived>
6896 QualType
6897 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6898                                                    ObjCTypeParamTypeLoc TL) {
6899   const ObjCTypeParamType *T = TL.getTypePtr();
6900   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6901       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6902   if (!OTP)
6903     return QualType();
6904 
6905   QualType Result = TL.getType();
6906   if (getDerived().AlwaysRebuild() ||
6907       OTP != T->getDecl()) {
6908     Result = getDerived().RebuildObjCTypeParamType(OTP,
6909                  TL.getProtocolLAngleLoc(),
6910                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6911                                     TL.getNumProtocols()),
6912                  TL.getProtocolLocs(),
6913                  TL.getProtocolRAngleLoc());
6914     if (Result.isNull())
6915       return QualType();
6916   }
6917 
6918   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6919   if (TL.getNumProtocols()) {
6920     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6921     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6922       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6923     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6924   }
6925   return Result;
6926 }
6927 
6928 template<typename Derived>
6929 QualType
6930 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6931                                                 ObjCObjectTypeLoc TL) {
6932   // Transform base type.
6933   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6934   if (BaseType.isNull())
6935     return QualType();
6936 
6937   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6938 
6939   // Transform type arguments.
6940   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6941   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6942     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6943     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6944     QualType TypeArg = TypeArgInfo->getType();
6945     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6946       AnyChanged = true;
6947 
6948       // We have a pack expansion. Instantiate it.
6949       const auto *PackExpansion = PackExpansionLoc.getType()
6950                                     ->castAs<PackExpansionType>();
6951       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6952       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6953                                               Unexpanded);
6954       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6955 
6956       // Determine whether the set of unexpanded parameter packs can
6957       // and should be expanded.
6958       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6959       bool Expand = false;
6960       bool RetainExpansion = false;
6961       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6962       if (getDerived().TryExpandParameterPacks(
6963             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6964             Unexpanded, Expand, RetainExpansion, NumExpansions))
6965         return QualType();
6966 
6967       if (!Expand) {
6968         // We can't expand this pack expansion into separate arguments yet;
6969         // just substitute into the pattern and create a new pack expansion
6970         // type.
6971         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6972 
6973         TypeLocBuilder TypeArgBuilder;
6974         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6975         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6976                                                              PatternLoc);
6977         if (NewPatternType.isNull())
6978           return QualType();
6979 
6980         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6981                                       NewPatternType, NumExpansions);
6982         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6983         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6984         NewTypeArgInfos.push_back(
6985           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6986         continue;
6987       }
6988 
6989       // Substitute into the pack expansion pattern for each slice of the
6990       // pack.
6991       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6992         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6993 
6994         TypeLocBuilder TypeArgBuilder;
6995         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6996 
6997         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6998                                                          PatternLoc);
6999         if (NewTypeArg.isNull())
7000           return QualType();
7001 
7002         NewTypeArgInfos.push_back(
7003           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7004       }
7005 
7006       continue;
7007     }
7008 
7009     TypeLocBuilder TypeArgBuilder;
7010     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
7011     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
7012     if (NewTypeArg.isNull())
7013       return QualType();
7014 
7015     // If nothing changed, just keep the old TypeSourceInfo.
7016     if (NewTypeArg == TypeArg) {
7017       NewTypeArgInfos.push_back(TypeArgInfo);
7018       continue;
7019     }
7020 
7021     NewTypeArgInfos.push_back(
7022       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
7023     AnyChanged = true;
7024   }
7025 
7026   QualType Result = TL.getType();
7027   if (getDerived().AlwaysRebuild() || AnyChanged) {
7028     // Rebuild the type.
7029     Result = getDerived().RebuildObjCObjectType(
7030         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
7031         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
7032         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
7033         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
7034 
7035     if (Result.isNull())
7036       return QualType();
7037   }
7038 
7039   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
7040   NewT.setHasBaseTypeAsWritten(true);
7041   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
7042   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
7043     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
7044   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
7045   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
7046   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
7047     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
7048   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
7049   return Result;
7050 }
7051 
7052 template<typename Derived>
7053 QualType
7054 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
7055                                                ObjCObjectPointerTypeLoc TL) {
7056   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
7057   if (PointeeType.isNull())
7058     return QualType();
7059 
7060   QualType Result = TL.getType();
7061   if (getDerived().AlwaysRebuild() ||
7062       PointeeType != TL.getPointeeLoc().getType()) {
7063     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
7064                                                        TL.getStarLoc());
7065     if (Result.isNull())
7066       return QualType();
7067   }
7068 
7069   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
7070   NewT.setStarLoc(TL.getStarLoc());
7071   return Result;
7072 }
7073 
7074 //===----------------------------------------------------------------------===//
7075 // Statement transformation
7076 //===----------------------------------------------------------------------===//
7077 template<typename Derived>
7078 StmtResult
7079 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
7080   return S;
7081 }
7082 
7083 template<typename Derived>
7084 StmtResult
7085 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
7086   return getDerived().TransformCompoundStmt(S, false);
7087 }
7088 
7089 template<typename Derived>
7090 StmtResult
7091 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
7092                                               bool IsStmtExpr) {
7093   Sema::CompoundScopeRAII CompoundScope(getSema());
7094 
7095   const Stmt *ExprResult = S->getStmtExprResult();
7096   bool SubStmtInvalid = false;
7097   bool SubStmtChanged = false;
7098   SmallVector<Stmt*, 8> Statements;
7099   for (auto *B : S->body()) {
7100     StmtResult Result = getDerived().TransformStmt(
7101         B, IsStmtExpr && B == ExprResult ? SDK_StmtExprResult : SDK_Discarded);
7102 
7103     if (Result.isInvalid()) {
7104       // Immediately fail if this was a DeclStmt, since it's very
7105       // likely that this will cause problems for future statements.
7106       if (isa<DeclStmt>(B))
7107         return StmtError();
7108 
7109       // Otherwise, just keep processing substatements and fail later.
7110       SubStmtInvalid = true;
7111       continue;
7112     }
7113 
7114     SubStmtChanged = SubStmtChanged || Result.get() != B;
7115     Statements.push_back(Result.getAs<Stmt>());
7116   }
7117 
7118   if (SubStmtInvalid)
7119     return StmtError();
7120 
7121   if (!getDerived().AlwaysRebuild() &&
7122       !SubStmtChanged)
7123     return S;
7124 
7125   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
7126                                           Statements,
7127                                           S->getRBracLoc(),
7128                                           IsStmtExpr);
7129 }
7130 
7131 template<typename Derived>
7132 StmtResult
7133 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
7134   ExprResult LHS, RHS;
7135   {
7136     EnterExpressionEvaluationContext Unevaluated(
7137         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
7138 
7139     // Transform the left-hand case value.
7140     LHS = getDerived().TransformExpr(S->getLHS());
7141     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
7142     if (LHS.isInvalid())
7143       return StmtError();
7144 
7145     // Transform the right-hand case value (for the GNU case-range extension).
7146     RHS = getDerived().TransformExpr(S->getRHS());
7147     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
7148     if (RHS.isInvalid())
7149       return StmtError();
7150   }
7151 
7152   // Build the case statement.
7153   // Case statements are always rebuilt so that they will attached to their
7154   // transformed switch statement.
7155   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
7156                                                        LHS.get(),
7157                                                        S->getEllipsisLoc(),
7158                                                        RHS.get(),
7159                                                        S->getColonLoc());
7160   if (Case.isInvalid())
7161     return StmtError();
7162 
7163   // Transform the statement following the case
7164   StmtResult SubStmt =
7165       getDerived().TransformStmt(S->getSubStmt());
7166   if (SubStmt.isInvalid())
7167     return StmtError();
7168 
7169   // Attach the body to the case statement
7170   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
7171 }
7172 
7173 template <typename Derived>
7174 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
7175   // Transform the statement following the default case
7176   StmtResult SubStmt =
7177       getDerived().TransformStmt(S->getSubStmt());
7178   if (SubStmt.isInvalid())
7179     return StmtError();
7180 
7181   // Default statements are always rebuilt
7182   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
7183                                          SubStmt.get());
7184 }
7185 
7186 template<typename Derived>
7187 StmtResult
7188 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
7189   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7190   if (SubStmt.isInvalid())
7191     return StmtError();
7192 
7193   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
7194                                         S->getDecl());
7195   if (!LD)
7196     return StmtError();
7197 
7198   // If we're transforming "in-place" (we're not creating new local
7199   // declarations), assume we're replacing the old label statement
7200   // and clear out the reference to it.
7201   if (LD == S->getDecl())
7202     S->getDecl()->setStmt(nullptr);
7203 
7204   // FIXME: Pass the real colon location in.
7205   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
7206                                        cast<LabelDecl>(LD), SourceLocation(),
7207                                        SubStmt.get());
7208 }
7209 
7210 template <typename Derived>
7211 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
7212   if (!R)
7213     return R;
7214 
7215   switch (R->getKind()) {
7216 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
7217 #define ATTR(X)
7218 #define PRAGMA_SPELLING_ATTR(X)                                                \
7219   case attr::X:                                                                \
7220     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
7221 #include "clang/Basic/AttrList.inc"
7222   default:
7223     return R;
7224   }
7225 }
7226 
7227 template <typename Derived>
7228 StmtResult
7229 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
7230                                                 StmtDiscardKind SDK) {
7231   bool AttrsChanged = false;
7232   SmallVector<const Attr *, 1> Attrs;
7233 
7234   // Visit attributes and keep track if any are transformed.
7235   for (const auto *I : S->getAttrs()) {
7236     const Attr *R = getDerived().TransformAttr(I);
7237     AttrsChanged |= (I != R);
7238     Attrs.push_back(R);
7239   }
7240 
7241   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
7242   if (SubStmt.isInvalid())
7243     return StmtError();
7244 
7245   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
7246     return S;
7247 
7248   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
7249                                             SubStmt.get());
7250 }
7251 
7252 template<typename Derived>
7253 StmtResult
7254 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
7255   // Transform the initialization statement
7256   StmtResult Init = getDerived().TransformStmt(S->getInit());
7257   if (Init.isInvalid())
7258     return StmtError();
7259 
7260   // Transform the condition
7261   Sema::ConditionResult Cond = getDerived().TransformCondition(
7262       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
7263       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
7264                        : Sema::ConditionKind::Boolean);
7265   if (Cond.isInvalid())
7266     return StmtError();
7267 
7268   // If this is a constexpr if, determine which arm we should instantiate.
7269   llvm::Optional<bool> ConstexprConditionValue;
7270   if (S->isConstexpr())
7271     ConstexprConditionValue = Cond.getKnownValue();
7272 
7273   // Transform the "then" branch.
7274   StmtResult Then;
7275   if (!ConstexprConditionValue || *ConstexprConditionValue) {
7276     Then = getDerived().TransformStmt(S->getThen());
7277     if (Then.isInvalid())
7278       return StmtError();
7279   } else {
7280     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
7281   }
7282 
7283   // Transform the "else" branch.
7284   StmtResult Else;
7285   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
7286     Else = getDerived().TransformStmt(S->getElse());
7287     if (Else.isInvalid())
7288       return StmtError();
7289   }
7290 
7291   if (!getDerived().AlwaysRebuild() &&
7292       Init.get() == S->getInit() &&
7293       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7294       Then.get() == S->getThen() &&
7295       Else.get() == S->getElse())
7296     return S;
7297 
7298   return getDerived().RebuildIfStmt(
7299       S->getIfLoc(), S->isConstexpr(), S->getLParenLoc(), Cond,
7300       S->getRParenLoc(), Init.get(), Then.get(), S->getElseLoc(), Else.get());
7301 }
7302 
7303 template<typename Derived>
7304 StmtResult
7305 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
7306   // Transform the initialization statement
7307   StmtResult Init = getDerived().TransformStmt(S->getInit());
7308   if (Init.isInvalid())
7309     return StmtError();
7310 
7311   // Transform the condition.
7312   Sema::ConditionResult Cond = getDerived().TransformCondition(
7313       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
7314       Sema::ConditionKind::Switch);
7315   if (Cond.isInvalid())
7316     return StmtError();
7317 
7318   // Rebuild the switch statement.
7319   StmtResult Switch =
7320       getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), S->getLParenLoc(),
7321                                           Init.get(), Cond, S->getRParenLoc());
7322   if (Switch.isInvalid())
7323     return StmtError();
7324 
7325   // Transform the body of the switch statement.
7326   StmtResult Body = getDerived().TransformStmt(S->getBody());
7327   if (Body.isInvalid())
7328     return StmtError();
7329 
7330   // Complete the switch statement.
7331   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
7332                                             Body.get());
7333 }
7334 
7335 template<typename Derived>
7336 StmtResult
7337 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
7338   // Transform the condition
7339   Sema::ConditionResult Cond = getDerived().TransformCondition(
7340       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
7341       Sema::ConditionKind::Boolean);
7342   if (Cond.isInvalid())
7343     return StmtError();
7344 
7345   // Transform the body
7346   StmtResult Body = getDerived().TransformStmt(S->getBody());
7347   if (Body.isInvalid())
7348     return StmtError();
7349 
7350   if (!getDerived().AlwaysRebuild() &&
7351       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7352       Body.get() == S->getBody())
7353     return Owned(S);
7354 
7355   return getDerived().RebuildWhileStmt(S->getWhileLoc(), S->getLParenLoc(),
7356                                        Cond, S->getRParenLoc(), Body.get());
7357 }
7358 
7359 template<typename Derived>
7360 StmtResult
7361 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
7362   // Transform the body
7363   StmtResult Body = getDerived().TransformStmt(S->getBody());
7364   if (Body.isInvalid())
7365     return StmtError();
7366 
7367   // Transform the condition
7368   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7369   if (Cond.isInvalid())
7370     return StmtError();
7371 
7372   if (!getDerived().AlwaysRebuild() &&
7373       Cond.get() == S->getCond() &&
7374       Body.get() == S->getBody())
7375     return S;
7376 
7377   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
7378                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
7379                                     S->getRParenLoc());
7380 }
7381 
7382 template<typename Derived>
7383 StmtResult
7384 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
7385   if (getSema().getLangOpts().OpenMP)
7386     getSema().startOpenMPLoop();
7387 
7388   // Transform the initialization statement
7389   StmtResult Init = getDerived().TransformStmt(S->getInit());
7390   if (Init.isInvalid())
7391     return StmtError();
7392 
7393   // In OpenMP loop region loop control variable must be captured and be
7394   // private. Perform analysis of first part (if any).
7395   if (getSema().getLangOpts().OpenMP && Init.isUsable())
7396     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
7397 
7398   // Transform the condition
7399   Sema::ConditionResult Cond = getDerived().TransformCondition(
7400       S->getForLoc(), S->getConditionVariable(), S->getCond(),
7401       Sema::ConditionKind::Boolean);
7402   if (Cond.isInvalid())
7403     return StmtError();
7404 
7405   // Transform the increment
7406   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7407   if (Inc.isInvalid())
7408     return StmtError();
7409 
7410   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
7411   if (S->getInc() && !FullInc.get())
7412     return StmtError();
7413 
7414   // Transform the body
7415   StmtResult Body = getDerived().TransformStmt(S->getBody());
7416   if (Body.isInvalid())
7417     return StmtError();
7418 
7419   if (!getDerived().AlwaysRebuild() &&
7420       Init.get() == S->getInit() &&
7421       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
7422       Inc.get() == S->getInc() &&
7423       Body.get() == S->getBody())
7424     return S;
7425 
7426   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
7427                                      Init.get(), Cond, FullInc,
7428                                      S->getRParenLoc(), Body.get());
7429 }
7430 
7431 template<typename Derived>
7432 StmtResult
7433 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
7434   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
7435                                         S->getLabel());
7436   if (!LD)
7437     return StmtError();
7438 
7439   // Goto statements must always be rebuilt, to resolve the label.
7440   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
7441                                       cast<LabelDecl>(LD));
7442 }
7443 
7444 template<typename Derived>
7445 StmtResult
7446 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
7447   ExprResult Target = getDerived().TransformExpr(S->getTarget());
7448   if (Target.isInvalid())
7449     return StmtError();
7450   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
7451 
7452   if (!getDerived().AlwaysRebuild() &&
7453       Target.get() == S->getTarget())
7454     return S;
7455 
7456   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
7457                                               Target.get());
7458 }
7459 
7460 template<typename Derived>
7461 StmtResult
7462 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
7463   return S;
7464 }
7465 
7466 template<typename Derived>
7467 StmtResult
7468 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
7469   return S;
7470 }
7471 
7472 template<typename Derived>
7473 StmtResult
7474 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
7475   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
7476                                                         /*NotCopyInit*/false);
7477   if (Result.isInvalid())
7478     return StmtError();
7479 
7480   // FIXME: We always rebuild the return statement because there is no way
7481   // to tell whether the return type of the function has changed.
7482   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
7483 }
7484 
7485 template<typename Derived>
7486 StmtResult
7487 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
7488   bool DeclChanged = false;
7489   SmallVector<Decl *, 4> Decls;
7490   for (auto *D : S->decls()) {
7491     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
7492     if (!Transformed)
7493       return StmtError();
7494 
7495     if (Transformed != D)
7496       DeclChanged = true;
7497 
7498     Decls.push_back(Transformed);
7499   }
7500 
7501   if (!getDerived().AlwaysRebuild() && !DeclChanged)
7502     return S;
7503 
7504   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
7505 }
7506 
7507 template<typename Derived>
7508 StmtResult
7509 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
7510 
7511   SmallVector<Expr*, 8> Constraints;
7512   SmallVector<Expr*, 8> Exprs;
7513   SmallVector<IdentifierInfo *, 4> Names;
7514 
7515   ExprResult AsmString;
7516   SmallVector<Expr*, 8> Clobbers;
7517 
7518   bool ExprsChanged = false;
7519 
7520   // Go through the outputs.
7521   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
7522     Names.push_back(S->getOutputIdentifier(I));
7523 
7524     // No need to transform the constraint literal.
7525     Constraints.push_back(S->getOutputConstraintLiteral(I));
7526 
7527     // Transform the output expr.
7528     Expr *OutputExpr = S->getOutputExpr(I);
7529     ExprResult Result = getDerived().TransformExpr(OutputExpr);
7530     if (Result.isInvalid())
7531       return StmtError();
7532 
7533     ExprsChanged |= Result.get() != OutputExpr;
7534 
7535     Exprs.push_back(Result.get());
7536   }
7537 
7538   // Go through the inputs.
7539   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
7540     Names.push_back(S->getInputIdentifier(I));
7541 
7542     // No need to transform the constraint literal.
7543     Constraints.push_back(S->getInputConstraintLiteral(I));
7544 
7545     // Transform the input expr.
7546     Expr *InputExpr = S->getInputExpr(I);
7547     ExprResult Result = getDerived().TransformExpr(InputExpr);
7548     if (Result.isInvalid())
7549       return StmtError();
7550 
7551     ExprsChanged |= Result.get() != InputExpr;
7552 
7553     Exprs.push_back(Result.get());
7554   }
7555 
7556   // Go through the Labels.
7557   for (unsigned I = 0, E = S->getNumLabels(); I != E; ++I) {
7558     Names.push_back(S->getLabelIdentifier(I));
7559 
7560     ExprResult Result = getDerived().TransformExpr(S->getLabelExpr(I));
7561     if (Result.isInvalid())
7562       return StmtError();
7563     ExprsChanged |= Result.get() != S->getLabelExpr(I);
7564     Exprs.push_back(Result.get());
7565   }
7566   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7567     return S;
7568 
7569   // Go through the clobbers.
7570   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7571     Clobbers.push_back(S->getClobberStringLiteral(I));
7572 
7573   // No need to transform the asm string literal.
7574   AsmString = S->getAsmString();
7575   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7576                                         S->isVolatile(), S->getNumOutputs(),
7577                                         S->getNumInputs(), Names.data(),
7578                                         Constraints, Exprs, AsmString.get(),
7579                                         Clobbers, S->getNumLabels(),
7580                                         S->getRParenLoc());
7581 }
7582 
7583 template<typename Derived>
7584 StmtResult
7585 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7586   ArrayRef<Token> AsmToks =
7587     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7588 
7589   bool HadError = false, HadChange = false;
7590 
7591   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7592   SmallVector<Expr*, 8> TransformedExprs;
7593   TransformedExprs.reserve(SrcExprs.size());
7594   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7595     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7596     if (!Result.isUsable()) {
7597       HadError = true;
7598     } else {
7599       HadChange |= (Result.get() != SrcExprs[i]);
7600       TransformedExprs.push_back(Result.get());
7601     }
7602   }
7603 
7604   if (HadError) return StmtError();
7605   if (!HadChange && !getDerived().AlwaysRebuild())
7606     return Owned(S);
7607 
7608   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7609                                        AsmToks, S->getAsmString(),
7610                                        S->getNumOutputs(), S->getNumInputs(),
7611                                        S->getAllConstraints(), S->getClobbers(),
7612                                        TransformedExprs, S->getEndLoc());
7613 }
7614 
7615 // C++ Coroutines TS
7616 
7617 template<typename Derived>
7618 StmtResult
7619 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7620   auto *ScopeInfo = SemaRef.getCurFunction();
7621   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7622   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7623          ScopeInfo->NeedsCoroutineSuspends &&
7624          ScopeInfo->CoroutineSuspends.first == nullptr &&
7625          ScopeInfo->CoroutineSuspends.second == nullptr &&
7626          "expected clean scope info");
7627 
7628   // Set that we have (possibly-invalid) suspend points before we do anything
7629   // that may fail.
7630   ScopeInfo->setNeedsCoroutineSuspends(false);
7631 
7632   // We re-build the coroutine promise object (and the coroutine parameters its
7633   // type and constructor depend on) based on the types used in our current
7634   // function. We must do so, and set it on the current FunctionScopeInfo,
7635   // before attempting to transform the other parts of the coroutine body
7636   // statement, such as the implicit suspend statements (because those
7637   // statements reference the FunctionScopeInfo::CoroutinePromise).
7638   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7639     return StmtError();
7640   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7641   if (!Promise)
7642     return StmtError();
7643   getDerived().transformedLocalDecl(S->getPromiseDecl(), {Promise});
7644   ScopeInfo->CoroutinePromise = Promise;
7645 
7646   // Transform the implicit coroutine statements constructed using dependent
7647   // types during the previous parse: initial and final suspensions, the return
7648   // object, and others. We also transform the coroutine function's body.
7649   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7650   if (InitSuspend.isInvalid())
7651     return StmtError();
7652   StmtResult FinalSuspend =
7653       getDerived().TransformStmt(S->getFinalSuspendStmt());
7654   if (FinalSuspend.isInvalid() ||
7655       !SemaRef.checkFinalSuspendNoThrow(FinalSuspend.get()))
7656     return StmtError();
7657   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7658   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7659 
7660   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7661   if (BodyRes.isInvalid())
7662     return StmtError();
7663 
7664   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7665   if (Builder.isInvalid())
7666     return StmtError();
7667 
7668   Expr *ReturnObject = S->getReturnValueInit();
7669   assert(ReturnObject && "the return object is expected to be valid");
7670   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7671                                                      /*NoCopyInit*/ false);
7672   if (Res.isInvalid())
7673     return StmtError();
7674   Builder.ReturnValue = Res.get();
7675 
7676   // If during the previous parse the coroutine still had a dependent promise
7677   // statement, we may need to build some implicit coroutine statements
7678   // (such as exception and fallthrough handlers) for the first time.
7679   if (S->hasDependentPromiseType()) {
7680     // We can only build these statements, however, if the current promise type
7681     // is not dependent.
7682     if (!Promise->getType()->isDependentType()) {
7683       assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7684              !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7685              "these nodes should not have been built yet");
7686       if (!Builder.buildDependentStatements())
7687         return StmtError();
7688     }
7689   } else {
7690     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7691       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7692       if (Res.isInvalid())
7693         return StmtError();
7694       Builder.OnFallthrough = Res.get();
7695     }
7696 
7697     if (auto *OnException = S->getExceptionHandler()) {
7698       StmtResult Res = getDerived().TransformStmt(OnException);
7699       if (Res.isInvalid())
7700         return StmtError();
7701       Builder.OnException = Res.get();
7702     }
7703 
7704     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7705       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7706       if (Res.isInvalid())
7707         return StmtError();
7708       Builder.ReturnStmtOnAllocFailure = Res.get();
7709     }
7710 
7711     // Transform any additional statements we may have already built
7712     assert(S->getAllocate() && S->getDeallocate() &&
7713            "allocation and deallocation calls must already be built");
7714     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7715     if (AllocRes.isInvalid())
7716       return StmtError();
7717     Builder.Allocate = AllocRes.get();
7718 
7719     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7720     if (DeallocRes.isInvalid())
7721       return StmtError();
7722     Builder.Deallocate = DeallocRes.get();
7723 
7724     assert(S->getResultDecl() && "ResultDecl must already be built");
7725     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7726     if (ResultDecl.isInvalid())
7727       return StmtError();
7728     Builder.ResultDecl = ResultDecl.get();
7729 
7730     if (auto *ReturnStmt = S->getReturnStmt()) {
7731       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7732       if (Res.isInvalid())
7733         return StmtError();
7734       Builder.ReturnStmt = Res.get();
7735     }
7736   }
7737 
7738   return getDerived().RebuildCoroutineBodyStmt(Builder);
7739 }
7740 
7741 template<typename Derived>
7742 StmtResult
7743 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7744   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7745                                                         /*NotCopyInit*/false);
7746   if (Result.isInvalid())
7747     return StmtError();
7748 
7749   // Always rebuild; we don't know if this needs to be injected into a new
7750   // context or if the promise type has changed.
7751   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7752                                           S->isImplicit());
7753 }
7754 
7755 template<typename Derived>
7756 ExprResult
7757 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7758   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7759                                                         /*NotCopyInit*/false);
7760   if (Result.isInvalid())
7761     return ExprError();
7762 
7763   // Always rebuild; we don't know if this needs to be injected into a new
7764   // context or if the promise type has changed.
7765   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7766                                          E->isImplicit());
7767 }
7768 
7769 template <typename Derived>
7770 ExprResult
7771 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7772   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7773                                                         /*NotCopyInit*/ false);
7774   if (OperandResult.isInvalid())
7775     return ExprError();
7776 
7777   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7778           E->getOperatorCoawaitLookup());
7779 
7780   if (LookupResult.isInvalid())
7781     return ExprError();
7782 
7783   // Always rebuild; we don't know if this needs to be injected into a new
7784   // context or if the promise type has changed.
7785   return getDerived().RebuildDependentCoawaitExpr(
7786       E->getKeywordLoc(), OperandResult.get(),
7787       cast<UnresolvedLookupExpr>(LookupResult.get()));
7788 }
7789 
7790 template<typename Derived>
7791 ExprResult
7792 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7793   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7794                                                         /*NotCopyInit*/false);
7795   if (Result.isInvalid())
7796     return ExprError();
7797 
7798   // Always rebuild; we don't know if this needs to be injected into a new
7799   // context or if the promise type has changed.
7800   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7801 }
7802 
7803 // Objective-C Statements.
7804 
7805 template<typename Derived>
7806 StmtResult
7807 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7808   // Transform the body of the @try.
7809   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7810   if (TryBody.isInvalid())
7811     return StmtError();
7812 
7813   // Transform the @catch statements (if present).
7814   bool AnyCatchChanged = false;
7815   SmallVector<Stmt*, 8> CatchStmts;
7816   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7817     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7818     if (Catch.isInvalid())
7819       return StmtError();
7820     if (Catch.get() != S->getCatchStmt(I))
7821       AnyCatchChanged = true;
7822     CatchStmts.push_back(Catch.get());
7823   }
7824 
7825   // Transform the @finally statement (if present).
7826   StmtResult Finally;
7827   if (S->getFinallyStmt()) {
7828     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7829     if (Finally.isInvalid())
7830       return StmtError();
7831   }
7832 
7833   // If nothing changed, just retain this statement.
7834   if (!getDerived().AlwaysRebuild() &&
7835       TryBody.get() == S->getTryBody() &&
7836       !AnyCatchChanged &&
7837       Finally.get() == S->getFinallyStmt())
7838     return S;
7839 
7840   // Build a new statement.
7841   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7842                                            CatchStmts, Finally.get());
7843 }
7844 
7845 template<typename Derived>
7846 StmtResult
7847 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7848   // Transform the @catch parameter, if there is one.
7849   VarDecl *Var = nullptr;
7850   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7851     TypeSourceInfo *TSInfo = nullptr;
7852     if (FromVar->getTypeSourceInfo()) {
7853       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7854       if (!TSInfo)
7855         return StmtError();
7856     }
7857 
7858     QualType T;
7859     if (TSInfo)
7860       T = TSInfo->getType();
7861     else {
7862       T = getDerived().TransformType(FromVar->getType());
7863       if (T.isNull())
7864         return StmtError();
7865     }
7866 
7867     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7868     if (!Var)
7869       return StmtError();
7870   }
7871 
7872   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7873   if (Body.isInvalid())
7874     return StmtError();
7875 
7876   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7877                                              S->getRParenLoc(),
7878                                              Var, Body.get());
7879 }
7880 
7881 template<typename Derived>
7882 StmtResult
7883 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7884   // Transform the body.
7885   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7886   if (Body.isInvalid())
7887     return StmtError();
7888 
7889   // If nothing changed, just retain this statement.
7890   if (!getDerived().AlwaysRebuild() &&
7891       Body.get() == S->getFinallyBody())
7892     return S;
7893 
7894   // Build a new statement.
7895   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7896                                                Body.get());
7897 }
7898 
7899 template<typename Derived>
7900 StmtResult
7901 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7902   ExprResult Operand;
7903   if (S->getThrowExpr()) {
7904     Operand = getDerived().TransformExpr(S->getThrowExpr());
7905     if (Operand.isInvalid())
7906       return StmtError();
7907   }
7908 
7909   if (!getDerived().AlwaysRebuild() &&
7910       Operand.get() == S->getThrowExpr())
7911     return S;
7912 
7913   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7914 }
7915 
7916 template<typename Derived>
7917 StmtResult
7918 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7919                                                   ObjCAtSynchronizedStmt *S) {
7920   // Transform the object we are locking.
7921   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7922   if (Object.isInvalid())
7923     return StmtError();
7924   Object =
7925     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7926                                                   Object.get());
7927   if (Object.isInvalid())
7928     return StmtError();
7929 
7930   // Transform the body.
7931   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7932   if (Body.isInvalid())
7933     return StmtError();
7934 
7935   // If nothing change, just retain the current statement.
7936   if (!getDerived().AlwaysRebuild() &&
7937       Object.get() == S->getSynchExpr() &&
7938       Body.get() == S->getSynchBody())
7939     return S;
7940 
7941   // Build a new statement.
7942   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7943                                                     Object.get(), Body.get());
7944 }
7945 
7946 template<typename Derived>
7947 StmtResult
7948 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7949                                               ObjCAutoreleasePoolStmt *S) {
7950   // Transform the body.
7951   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7952   if (Body.isInvalid())
7953     return StmtError();
7954 
7955   // If nothing changed, just retain this statement.
7956   if (!getDerived().AlwaysRebuild() &&
7957       Body.get() == S->getSubStmt())
7958     return S;
7959 
7960   // Build a new statement.
7961   return getDerived().RebuildObjCAutoreleasePoolStmt(
7962                         S->getAtLoc(), Body.get());
7963 }
7964 
7965 template<typename Derived>
7966 StmtResult
7967 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7968                                                   ObjCForCollectionStmt *S) {
7969   // Transform the element statement.
7970   StmtResult Element =
7971       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7972   if (Element.isInvalid())
7973     return StmtError();
7974 
7975   // Transform the collection expression.
7976   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7977   if (Collection.isInvalid())
7978     return StmtError();
7979 
7980   // Transform the body.
7981   StmtResult Body = getDerived().TransformStmt(S->getBody());
7982   if (Body.isInvalid())
7983     return StmtError();
7984 
7985   // If nothing changed, just retain this statement.
7986   if (!getDerived().AlwaysRebuild() &&
7987       Element.get() == S->getElement() &&
7988       Collection.get() == S->getCollection() &&
7989       Body.get() == S->getBody())
7990     return S;
7991 
7992   // Build a new statement.
7993   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7994                                                    Element.get(),
7995                                                    Collection.get(),
7996                                                    S->getRParenLoc(),
7997                                                    Body.get());
7998 }
7999 
8000 template <typename Derived>
8001 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
8002   // Transform the exception declaration, if any.
8003   VarDecl *Var = nullptr;
8004   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
8005     TypeSourceInfo *T =
8006         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
8007     if (!T)
8008       return StmtError();
8009 
8010     Var = getDerived().RebuildExceptionDecl(
8011         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
8012         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
8013     if (!Var || Var->isInvalidDecl())
8014       return StmtError();
8015   }
8016 
8017   // Transform the actual exception handler.
8018   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
8019   if (Handler.isInvalid())
8020     return StmtError();
8021 
8022   if (!getDerived().AlwaysRebuild() && !Var &&
8023       Handler.get() == S->getHandlerBlock())
8024     return S;
8025 
8026   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
8027 }
8028 
8029 template <typename Derived>
8030 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
8031   // Transform the try block itself.
8032   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8033   if (TryBlock.isInvalid())
8034     return StmtError();
8035 
8036   // Transform the handlers.
8037   bool HandlerChanged = false;
8038   SmallVector<Stmt *, 8> Handlers;
8039   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
8040     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
8041     if (Handler.isInvalid())
8042       return StmtError();
8043 
8044     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
8045     Handlers.push_back(Handler.getAs<Stmt>());
8046   }
8047 
8048   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8049       !HandlerChanged)
8050     return S;
8051 
8052   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
8053                                         Handlers);
8054 }
8055 
8056 template<typename Derived>
8057 StmtResult
8058 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
8059   StmtResult Init =
8060       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
8061   if (Init.isInvalid())
8062     return StmtError();
8063 
8064   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
8065   if (Range.isInvalid())
8066     return StmtError();
8067 
8068   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
8069   if (Begin.isInvalid())
8070     return StmtError();
8071   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
8072   if (End.isInvalid())
8073     return StmtError();
8074 
8075   ExprResult Cond = getDerived().TransformExpr(S->getCond());
8076   if (Cond.isInvalid())
8077     return StmtError();
8078   if (Cond.get())
8079     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
8080   if (Cond.isInvalid())
8081     return StmtError();
8082   if (Cond.get())
8083     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
8084 
8085   ExprResult Inc = getDerived().TransformExpr(S->getInc());
8086   if (Inc.isInvalid())
8087     return StmtError();
8088   if (Inc.get())
8089     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
8090 
8091   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
8092   if (LoopVar.isInvalid())
8093     return StmtError();
8094 
8095   StmtResult NewStmt = S;
8096   if (getDerived().AlwaysRebuild() ||
8097       Init.get() != S->getInit() ||
8098       Range.get() != S->getRangeStmt() ||
8099       Begin.get() != S->getBeginStmt() ||
8100       End.get() != S->getEndStmt() ||
8101       Cond.get() != S->getCond() ||
8102       Inc.get() != S->getInc() ||
8103       LoopVar.get() != S->getLoopVarStmt()) {
8104     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8105                                                   S->getCoawaitLoc(), Init.get(),
8106                                                   S->getColonLoc(), Range.get(),
8107                                                   Begin.get(), End.get(),
8108                                                   Cond.get(),
8109                                                   Inc.get(), LoopVar.get(),
8110                                                   S->getRParenLoc());
8111     if (NewStmt.isInvalid() && LoopVar.get() != S->getLoopVarStmt()) {
8112       // Might not have attached any initializer to the loop variable.
8113       getSema().ActOnInitializerError(
8114           cast<DeclStmt>(LoopVar.get())->getSingleDecl());
8115       return StmtError();
8116     }
8117   }
8118 
8119   StmtResult Body = getDerived().TransformStmt(S->getBody());
8120   if (Body.isInvalid())
8121     return StmtError();
8122 
8123   // Body has changed but we didn't rebuild the for-range statement. Rebuild
8124   // it now so we have a new statement to attach the body to.
8125   if (Body.get() != S->getBody() && NewStmt.get() == S) {
8126     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
8127                                                   S->getCoawaitLoc(), Init.get(),
8128                                                   S->getColonLoc(), Range.get(),
8129                                                   Begin.get(), End.get(),
8130                                                   Cond.get(),
8131                                                   Inc.get(), LoopVar.get(),
8132                                                   S->getRParenLoc());
8133     if (NewStmt.isInvalid())
8134       return StmtError();
8135   }
8136 
8137   if (NewStmt.get() == S)
8138     return S;
8139 
8140   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
8141 }
8142 
8143 template<typename Derived>
8144 StmtResult
8145 TreeTransform<Derived>::TransformMSDependentExistsStmt(
8146                                                     MSDependentExistsStmt *S) {
8147   // Transform the nested-name-specifier, if any.
8148   NestedNameSpecifierLoc QualifierLoc;
8149   if (S->getQualifierLoc()) {
8150     QualifierLoc
8151       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
8152     if (!QualifierLoc)
8153       return StmtError();
8154   }
8155 
8156   // Transform the declaration name.
8157   DeclarationNameInfo NameInfo = S->getNameInfo();
8158   if (NameInfo.getName()) {
8159     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8160     if (!NameInfo.getName())
8161       return StmtError();
8162   }
8163 
8164   // Check whether anything changed.
8165   if (!getDerived().AlwaysRebuild() &&
8166       QualifierLoc == S->getQualifierLoc() &&
8167       NameInfo.getName() == S->getNameInfo().getName())
8168     return S;
8169 
8170   // Determine whether this name exists, if we can.
8171   CXXScopeSpec SS;
8172   SS.Adopt(QualifierLoc);
8173   bool Dependent = false;
8174   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
8175   case Sema::IER_Exists:
8176     if (S->isIfExists())
8177       break;
8178 
8179     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8180 
8181   case Sema::IER_DoesNotExist:
8182     if (S->isIfNotExists())
8183       break;
8184 
8185     return new (getSema().Context) NullStmt(S->getKeywordLoc());
8186 
8187   case Sema::IER_Dependent:
8188     Dependent = true;
8189     break;
8190 
8191   case Sema::IER_Error:
8192     return StmtError();
8193   }
8194 
8195   // We need to continue with the instantiation, so do so now.
8196   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
8197   if (SubStmt.isInvalid())
8198     return StmtError();
8199 
8200   // If we have resolved the name, just transform to the substatement.
8201   if (!Dependent)
8202     return SubStmt;
8203 
8204   // The name is still dependent, so build a dependent expression again.
8205   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
8206                                                    S->isIfExists(),
8207                                                    QualifierLoc,
8208                                                    NameInfo,
8209                                                    SubStmt.get());
8210 }
8211 
8212 template<typename Derived>
8213 ExprResult
8214 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
8215   NestedNameSpecifierLoc QualifierLoc;
8216   if (E->getQualifierLoc()) {
8217     QualifierLoc
8218     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
8219     if (!QualifierLoc)
8220       return ExprError();
8221   }
8222 
8223   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
8224     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
8225   if (!PD)
8226     return ExprError();
8227 
8228   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
8229   if (Base.isInvalid())
8230     return ExprError();
8231 
8232   return new (SemaRef.getASTContext())
8233       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
8234                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
8235                         QualifierLoc, E->getMemberLoc());
8236 }
8237 
8238 template <typename Derived>
8239 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
8240     MSPropertySubscriptExpr *E) {
8241   auto BaseRes = getDerived().TransformExpr(E->getBase());
8242   if (BaseRes.isInvalid())
8243     return ExprError();
8244   auto IdxRes = getDerived().TransformExpr(E->getIdx());
8245   if (IdxRes.isInvalid())
8246     return ExprError();
8247 
8248   if (!getDerived().AlwaysRebuild() &&
8249       BaseRes.get() == E->getBase() &&
8250       IdxRes.get() == E->getIdx())
8251     return E;
8252 
8253   return getDerived().RebuildArraySubscriptExpr(
8254       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
8255 }
8256 
8257 template <typename Derived>
8258 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
8259   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
8260   if (TryBlock.isInvalid())
8261     return StmtError();
8262 
8263   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
8264   if (Handler.isInvalid())
8265     return StmtError();
8266 
8267   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
8268       Handler.get() == S->getHandler())
8269     return S;
8270 
8271   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
8272                                         TryBlock.get(), Handler.get());
8273 }
8274 
8275 template <typename Derived>
8276 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
8277   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8278   if (Block.isInvalid())
8279     return StmtError();
8280 
8281   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
8282 }
8283 
8284 template <typename Derived>
8285 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
8286   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
8287   if (FilterExpr.isInvalid())
8288     return StmtError();
8289 
8290   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
8291   if (Block.isInvalid())
8292     return StmtError();
8293 
8294   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
8295                                            Block.get());
8296 }
8297 
8298 template <typename Derived>
8299 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
8300   if (isa<SEHFinallyStmt>(Handler))
8301     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
8302   else
8303     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
8304 }
8305 
8306 template<typename Derived>
8307 StmtResult
8308 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
8309   return S;
8310 }
8311 
8312 //===----------------------------------------------------------------------===//
8313 // OpenMP directive transformation
8314 //===----------------------------------------------------------------------===//
8315 template <typename Derived>
8316 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
8317     OMPExecutableDirective *D) {
8318 
8319   // Transform the clauses
8320   llvm::SmallVector<OMPClause *, 16> TClauses;
8321   ArrayRef<OMPClause *> Clauses = D->clauses();
8322   TClauses.reserve(Clauses.size());
8323   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
8324        I != E; ++I) {
8325     if (*I) {
8326       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
8327       OMPClause *Clause = getDerived().TransformOMPClause(*I);
8328       getDerived().getSema().EndOpenMPClause();
8329       if (Clause)
8330         TClauses.push_back(Clause);
8331     } else {
8332       TClauses.push_back(nullptr);
8333     }
8334   }
8335   StmtResult AssociatedStmt;
8336   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
8337     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
8338                                                   /*CurScope=*/nullptr);
8339     StmtResult Body;
8340     {
8341       Sema::CompoundScopeRAII CompoundScope(getSema());
8342       Stmt *CS;
8343       if (D->getDirectiveKind() == OMPD_atomic ||
8344           D->getDirectiveKind() == OMPD_critical ||
8345           D->getDirectiveKind() == OMPD_section ||
8346           D->getDirectiveKind() == OMPD_master)
8347         CS = D->getAssociatedStmt();
8348       else
8349         CS = D->getInnermostCapturedStmt()->getCapturedStmt();
8350       Body = getDerived().TransformStmt(CS);
8351     }
8352     AssociatedStmt =
8353         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
8354     if (AssociatedStmt.isInvalid()) {
8355       return StmtError();
8356     }
8357   }
8358   if (TClauses.size() != Clauses.size()) {
8359     return StmtError();
8360   }
8361 
8362   // Transform directive name for 'omp critical' directive.
8363   DeclarationNameInfo DirName;
8364   if (D->getDirectiveKind() == OMPD_critical) {
8365     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
8366     DirName = getDerived().TransformDeclarationNameInfo(DirName);
8367   }
8368   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
8369   if (D->getDirectiveKind() == OMPD_cancellation_point) {
8370     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
8371   } else if (D->getDirectiveKind() == OMPD_cancel) {
8372     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
8373   }
8374 
8375   return getDerived().RebuildOMPExecutableDirective(
8376       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
8377       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
8378 }
8379 
8380 template <typename Derived>
8381 StmtResult
8382 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
8383   DeclarationNameInfo DirName;
8384   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
8385                                              D->getBeginLoc());
8386   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8387   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8388   return Res;
8389 }
8390 
8391 template <typename Derived>
8392 StmtResult
8393 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
8394   DeclarationNameInfo DirName;
8395   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
8396                                              D->getBeginLoc());
8397   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8398   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8399   return Res;
8400 }
8401 
8402 template <typename Derived>
8403 StmtResult
8404 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
8405   DeclarationNameInfo DirName;
8406   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
8407                                              D->getBeginLoc());
8408   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8409   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8410   return Res;
8411 }
8412 
8413 template <typename Derived>
8414 StmtResult
8415 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
8416   DeclarationNameInfo DirName;
8417   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
8418                                              D->getBeginLoc());
8419   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8420   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8421   return Res;
8422 }
8423 
8424 template <typename Derived>
8425 StmtResult
8426 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
8427   DeclarationNameInfo DirName;
8428   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
8429                                              D->getBeginLoc());
8430   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8431   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8432   return Res;
8433 }
8434 
8435 template <typename Derived>
8436 StmtResult
8437 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
8438   DeclarationNameInfo DirName;
8439   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
8440                                              D->getBeginLoc());
8441   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8442   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8443   return Res;
8444 }
8445 
8446 template <typename Derived>
8447 StmtResult
8448 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
8449   DeclarationNameInfo DirName;
8450   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
8451                                              D->getBeginLoc());
8452   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8453   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8454   return Res;
8455 }
8456 
8457 template <typename Derived>
8458 StmtResult
8459 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
8460   DeclarationNameInfo DirName;
8461   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
8462                                              D->getBeginLoc());
8463   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8464   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8465   return Res;
8466 }
8467 
8468 template <typename Derived>
8469 StmtResult
8470 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
8471   getDerived().getSema().StartOpenMPDSABlock(
8472       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
8473   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8474   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8475   return Res;
8476 }
8477 
8478 template <typename Derived>
8479 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
8480     OMPParallelForDirective *D) {
8481   DeclarationNameInfo DirName;
8482   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
8483                                              nullptr, D->getBeginLoc());
8484   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8485   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8486   return Res;
8487 }
8488 
8489 template <typename Derived>
8490 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
8491     OMPParallelForSimdDirective *D) {
8492   DeclarationNameInfo DirName;
8493   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
8494                                              nullptr, D->getBeginLoc());
8495   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8496   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8497   return Res;
8498 }
8499 
8500 template <typename Derived>
8501 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterDirective(
8502     OMPParallelMasterDirective *D) {
8503   DeclarationNameInfo DirName;
8504   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_master, DirName,
8505                                              nullptr, D->getBeginLoc());
8506   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8507   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8508   return Res;
8509 }
8510 
8511 template <typename Derived>
8512 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
8513     OMPParallelSectionsDirective *D) {
8514   DeclarationNameInfo DirName;
8515   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
8516                                              nullptr, D->getBeginLoc());
8517   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8518   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8519   return Res;
8520 }
8521 
8522 template <typename Derived>
8523 StmtResult
8524 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
8525   DeclarationNameInfo DirName;
8526   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
8527                                              D->getBeginLoc());
8528   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8529   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8530   return Res;
8531 }
8532 
8533 template <typename Derived>
8534 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
8535     OMPTaskyieldDirective *D) {
8536   DeclarationNameInfo DirName;
8537   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
8538                                              D->getBeginLoc());
8539   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8540   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8541   return Res;
8542 }
8543 
8544 template <typename Derived>
8545 StmtResult
8546 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
8547   DeclarationNameInfo DirName;
8548   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
8549                                              D->getBeginLoc());
8550   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8551   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8552   return Res;
8553 }
8554 
8555 template <typename Derived>
8556 StmtResult
8557 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
8558   DeclarationNameInfo DirName;
8559   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
8560                                              D->getBeginLoc());
8561   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8562   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8563   return Res;
8564 }
8565 
8566 template <typename Derived>
8567 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
8568     OMPTaskgroupDirective *D) {
8569   DeclarationNameInfo DirName;
8570   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
8571                                              D->getBeginLoc());
8572   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8573   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8574   return Res;
8575 }
8576 
8577 template <typename Derived>
8578 StmtResult
8579 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
8580   DeclarationNameInfo DirName;
8581   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
8582                                              D->getBeginLoc());
8583   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8584   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8585   return Res;
8586 }
8587 
8588 template <typename Derived>
8589 StmtResult
8590 TreeTransform<Derived>::TransformOMPDepobjDirective(OMPDepobjDirective *D) {
8591   DeclarationNameInfo DirName;
8592   getDerived().getSema().StartOpenMPDSABlock(OMPD_depobj, DirName, nullptr,
8593                                              D->getBeginLoc());
8594   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8595   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8596   return Res;
8597 }
8598 
8599 template <typename Derived>
8600 StmtResult
8601 TreeTransform<Derived>::TransformOMPScanDirective(OMPScanDirective *D) {
8602   DeclarationNameInfo DirName;
8603   getDerived().getSema().StartOpenMPDSABlock(OMPD_scan, DirName, nullptr,
8604                                              D->getBeginLoc());
8605   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8606   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8607   return Res;
8608 }
8609 
8610 template <typename Derived>
8611 StmtResult
8612 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
8613   DeclarationNameInfo DirName;
8614   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
8615                                              D->getBeginLoc());
8616   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8617   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8618   return Res;
8619 }
8620 
8621 template <typename Derived>
8622 StmtResult
8623 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8624   DeclarationNameInfo DirName;
8625   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8626                                              D->getBeginLoc());
8627   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8628   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8629   return Res;
8630 }
8631 
8632 template <typename Derived>
8633 StmtResult
8634 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8635   DeclarationNameInfo DirName;
8636   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8637                                              D->getBeginLoc());
8638   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8639   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8640   return Res;
8641 }
8642 
8643 template <typename Derived>
8644 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8645     OMPTargetDataDirective *D) {
8646   DeclarationNameInfo DirName;
8647   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8648                                              D->getBeginLoc());
8649   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8650   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8651   return Res;
8652 }
8653 
8654 template <typename Derived>
8655 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8656     OMPTargetEnterDataDirective *D) {
8657   DeclarationNameInfo DirName;
8658   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8659                                              nullptr, D->getBeginLoc());
8660   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8661   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8662   return Res;
8663 }
8664 
8665 template <typename Derived>
8666 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8667     OMPTargetExitDataDirective *D) {
8668   DeclarationNameInfo DirName;
8669   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8670                                              nullptr, D->getBeginLoc());
8671   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8672   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8673   return Res;
8674 }
8675 
8676 template <typename Derived>
8677 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8678     OMPTargetParallelDirective *D) {
8679   DeclarationNameInfo DirName;
8680   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8681                                              nullptr, D->getBeginLoc());
8682   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8683   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8684   return Res;
8685 }
8686 
8687 template <typename Derived>
8688 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8689     OMPTargetParallelForDirective *D) {
8690   DeclarationNameInfo DirName;
8691   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8692                                              nullptr, D->getBeginLoc());
8693   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8694   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8695   return Res;
8696 }
8697 
8698 template <typename Derived>
8699 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8700     OMPTargetUpdateDirective *D) {
8701   DeclarationNameInfo DirName;
8702   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8703                                              nullptr, D->getBeginLoc());
8704   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8705   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8706   return Res;
8707 }
8708 
8709 template <typename Derived>
8710 StmtResult
8711 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8712   DeclarationNameInfo DirName;
8713   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8714                                              D->getBeginLoc());
8715   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8716   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8717   return Res;
8718 }
8719 
8720 template <typename Derived>
8721 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8722     OMPCancellationPointDirective *D) {
8723   DeclarationNameInfo DirName;
8724   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8725                                              nullptr, D->getBeginLoc());
8726   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8727   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8728   return Res;
8729 }
8730 
8731 template <typename Derived>
8732 StmtResult
8733 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8734   DeclarationNameInfo DirName;
8735   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8736                                              D->getBeginLoc());
8737   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8738   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8739   return Res;
8740 }
8741 
8742 template <typename Derived>
8743 StmtResult
8744 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8745   DeclarationNameInfo DirName;
8746   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8747                                              D->getBeginLoc());
8748   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8749   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8750   return Res;
8751 }
8752 
8753 template <typename Derived>
8754 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8755     OMPTaskLoopSimdDirective *D) {
8756   DeclarationNameInfo DirName;
8757   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8758                                              nullptr, D->getBeginLoc());
8759   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8760   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8761   return Res;
8762 }
8763 
8764 template <typename Derived>
8765 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopDirective(
8766     OMPMasterTaskLoopDirective *D) {
8767   DeclarationNameInfo DirName;
8768   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop, DirName,
8769                                              nullptr, D->getBeginLoc());
8770   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8771   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8772   return Res;
8773 }
8774 
8775 template <typename Derived>
8776 StmtResult TreeTransform<Derived>::TransformOMPMasterTaskLoopSimdDirective(
8777     OMPMasterTaskLoopSimdDirective *D) {
8778   DeclarationNameInfo DirName;
8779   getDerived().getSema().StartOpenMPDSABlock(OMPD_master_taskloop_simd, DirName,
8780                                              nullptr, D->getBeginLoc());
8781   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8782   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8783   return Res;
8784 }
8785 
8786 template <typename Derived>
8787 StmtResult TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopDirective(
8788     OMPParallelMasterTaskLoopDirective *D) {
8789   DeclarationNameInfo DirName;
8790   getDerived().getSema().StartOpenMPDSABlock(
8791       OMPD_parallel_master_taskloop, DirName, nullptr, D->getBeginLoc());
8792   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8793   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8794   return Res;
8795 }
8796 
8797 template <typename Derived>
8798 StmtResult
8799 TreeTransform<Derived>::TransformOMPParallelMasterTaskLoopSimdDirective(
8800     OMPParallelMasterTaskLoopSimdDirective *D) {
8801   DeclarationNameInfo DirName;
8802   getDerived().getSema().StartOpenMPDSABlock(
8803       OMPD_parallel_master_taskloop_simd, DirName, nullptr, D->getBeginLoc());
8804   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8805   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8806   return Res;
8807 }
8808 
8809 template <typename Derived>
8810 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8811     OMPDistributeDirective *D) {
8812   DeclarationNameInfo DirName;
8813   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8814                                              D->getBeginLoc());
8815   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8816   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8817   return Res;
8818 }
8819 
8820 template <typename Derived>
8821 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8822     OMPDistributeParallelForDirective *D) {
8823   DeclarationNameInfo DirName;
8824   getDerived().getSema().StartOpenMPDSABlock(
8825       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8826   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8827   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8828   return Res;
8829 }
8830 
8831 template <typename Derived>
8832 StmtResult
8833 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8834     OMPDistributeParallelForSimdDirective *D) {
8835   DeclarationNameInfo DirName;
8836   getDerived().getSema().StartOpenMPDSABlock(
8837       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8838   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8839   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8840   return Res;
8841 }
8842 
8843 template <typename Derived>
8844 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8845     OMPDistributeSimdDirective *D) {
8846   DeclarationNameInfo DirName;
8847   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8848                                              nullptr, D->getBeginLoc());
8849   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8850   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8851   return Res;
8852 }
8853 
8854 template <typename Derived>
8855 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8856     OMPTargetParallelForSimdDirective *D) {
8857   DeclarationNameInfo DirName;
8858   getDerived().getSema().StartOpenMPDSABlock(
8859       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8860   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8861   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8862   return Res;
8863 }
8864 
8865 template <typename Derived>
8866 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8867     OMPTargetSimdDirective *D) {
8868   DeclarationNameInfo DirName;
8869   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8870                                              D->getBeginLoc());
8871   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8872   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8873   return Res;
8874 }
8875 
8876 template <typename Derived>
8877 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8878     OMPTeamsDistributeDirective *D) {
8879   DeclarationNameInfo DirName;
8880   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8881                                              nullptr, D->getBeginLoc());
8882   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8883   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8884   return Res;
8885 }
8886 
8887 template <typename Derived>
8888 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8889     OMPTeamsDistributeSimdDirective *D) {
8890   DeclarationNameInfo DirName;
8891   getDerived().getSema().StartOpenMPDSABlock(
8892       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8893   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8894   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8895   return Res;
8896 }
8897 
8898 template <typename Derived>
8899 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8900     OMPTeamsDistributeParallelForSimdDirective *D) {
8901   DeclarationNameInfo DirName;
8902   getDerived().getSema().StartOpenMPDSABlock(
8903       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8904       D->getBeginLoc());
8905   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8906   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8907   return Res;
8908 }
8909 
8910 template <typename Derived>
8911 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8912     OMPTeamsDistributeParallelForDirective *D) {
8913   DeclarationNameInfo DirName;
8914   getDerived().getSema().StartOpenMPDSABlock(
8915       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8916   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8917   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8918   return Res;
8919 }
8920 
8921 template <typename Derived>
8922 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8923     OMPTargetTeamsDirective *D) {
8924   DeclarationNameInfo DirName;
8925   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8926                                              nullptr, D->getBeginLoc());
8927   auto Res = getDerived().TransformOMPExecutableDirective(D);
8928   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8929   return Res;
8930 }
8931 
8932 template <typename Derived>
8933 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8934     OMPTargetTeamsDistributeDirective *D) {
8935   DeclarationNameInfo DirName;
8936   getDerived().getSema().StartOpenMPDSABlock(
8937       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8938   auto Res = getDerived().TransformOMPExecutableDirective(D);
8939   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8940   return Res;
8941 }
8942 
8943 template <typename Derived>
8944 StmtResult
8945 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8946     OMPTargetTeamsDistributeParallelForDirective *D) {
8947   DeclarationNameInfo DirName;
8948   getDerived().getSema().StartOpenMPDSABlock(
8949       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8950       D->getBeginLoc());
8951   auto Res = getDerived().TransformOMPExecutableDirective(D);
8952   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8953   return Res;
8954 }
8955 
8956 template <typename Derived>
8957 StmtResult TreeTransform<Derived>::
8958     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8959         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8960   DeclarationNameInfo DirName;
8961   getDerived().getSema().StartOpenMPDSABlock(
8962       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8963       D->getBeginLoc());
8964   auto Res = getDerived().TransformOMPExecutableDirective(D);
8965   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8966   return Res;
8967 }
8968 
8969 template <typename Derived>
8970 StmtResult
8971 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8972     OMPTargetTeamsDistributeSimdDirective *D) {
8973   DeclarationNameInfo DirName;
8974   getDerived().getSema().StartOpenMPDSABlock(
8975       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8976   auto Res = getDerived().TransformOMPExecutableDirective(D);
8977   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8978   return Res;
8979 }
8980 
8981 
8982 //===----------------------------------------------------------------------===//
8983 // OpenMP clause transformation
8984 //===----------------------------------------------------------------------===//
8985 template <typename Derived>
8986 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8987   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8988   if (Cond.isInvalid())
8989     return nullptr;
8990   return getDerived().RebuildOMPIfClause(
8991       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8992       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8993 }
8994 
8995 template <typename Derived>
8996 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8997   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8998   if (Cond.isInvalid())
8999     return nullptr;
9000   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
9001                                             C->getLParenLoc(), C->getEndLoc());
9002 }
9003 
9004 template <typename Derived>
9005 OMPClause *
9006 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
9007   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
9008   if (NumThreads.isInvalid())
9009     return nullptr;
9010   return getDerived().RebuildOMPNumThreadsClause(
9011       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9012 }
9013 
9014 template <typename Derived>
9015 OMPClause *
9016 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
9017   ExprResult E = getDerived().TransformExpr(C->getSafelen());
9018   if (E.isInvalid())
9019     return nullptr;
9020   return getDerived().RebuildOMPSafelenClause(
9021       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9022 }
9023 
9024 template <typename Derived>
9025 OMPClause *
9026 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
9027   ExprResult E = getDerived().TransformExpr(C->getAllocator());
9028   if (E.isInvalid())
9029     return nullptr;
9030   return getDerived().RebuildOMPAllocatorClause(
9031       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9032 }
9033 
9034 template <typename Derived>
9035 OMPClause *
9036 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
9037   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
9038   if (E.isInvalid())
9039     return nullptr;
9040   return getDerived().RebuildOMPSimdlenClause(
9041       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9042 }
9043 
9044 template <typename Derived>
9045 OMPClause *
9046 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
9047   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
9048   if (E.isInvalid())
9049     return nullptr;
9050   return getDerived().RebuildOMPCollapseClause(
9051       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9052 }
9053 
9054 template <typename Derived>
9055 OMPClause *
9056 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
9057   return getDerived().RebuildOMPDefaultClause(
9058       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
9059       C->getLParenLoc(), C->getEndLoc());
9060 }
9061 
9062 template <typename Derived>
9063 OMPClause *
9064 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
9065   return getDerived().RebuildOMPProcBindClause(
9066       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
9067       C->getLParenLoc(), C->getEndLoc());
9068 }
9069 
9070 template <typename Derived>
9071 OMPClause *
9072 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
9073   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9074   if (E.isInvalid())
9075     return nullptr;
9076   return getDerived().RebuildOMPScheduleClause(
9077       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
9078       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9079       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
9080       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9081 }
9082 
9083 template <typename Derived>
9084 OMPClause *
9085 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
9086   ExprResult E;
9087   if (auto *Num = C->getNumForLoops()) {
9088     E = getDerived().TransformExpr(Num);
9089     if (E.isInvalid())
9090       return nullptr;
9091   }
9092   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
9093                                               C->getLParenLoc(), E.get());
9094 }
9095 
9096 template <typename Derived>
9097 OMPClause *
9098 TreeTransform<Derived>::TransformOMPDetachClause(OMPDetachClause *C) {
9099   ExprResult E;
9100   if (Expr *Evt = C->getEventHandler()) {
9101     E = getDerived().TransformExpr(Evt);
9102     if (E.isInvalid())
9103       return nullptr;
9104   }
9105   return getDerived().RebuildOMPDetachClause(E.get(), C->getBeginLoc(),
9106                                              C->getLParenLoc(), C->getEndLoc());
9107 }
9108 
9109 template <typename Derived>
9110 OMPClause *
9111 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
9112   // No need to rebuild this clause, no template-dependent parameters.
9113   return C;
9114 }
9115 
9116 template <typename Derived>
9117 OMPClause *
9118 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
9119   // No need to rebuild this clause, no template-dependent parameters.
9120   return C;
9121 }
9122 
9123 template <typename Derived>
9124 OMPClause *
9125 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
9126   // No need to rebuild this clause, no template-dependent parameters.
9127   return C;
9128 }
9129 
9130 template <typename Derived>
9131 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
9132   // No need to rebuild this clause, no template-dependent parameters.
9133   return C;
9134 }
9135 
9136 template <typename Derived>
9137 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
9138   // No need to rebuild this clause, no template-dependent parameters.
9139   return C;
9140 }
9141 
9142 template <typename Derived>
9143 OMPClause *
9144 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
9145   // No need to rebuild this clause, no template-dependent parameters.
9146   return C;
9147 }
9148 
9149 template <typename Derived>
9150 OMPClause *
9151 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
9152   // No need to rebuild this clause, no template-dependent parameters.
9153   return C;
9154 }
9155 
9156 template <typename Derived>
9157 OMPClause *
9158 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
9159   // No need to rebuild this clause, no template-dependent parameters.
9160   return C;
9161 }
9162 
9163 template <typename Derived>
9164 OMPClause *
9165 TreeTransform<Derived>::TransformOMPAcqRelClause(OMPAcqRelClause *C) {
9166   // No need to rebuild this clause, no template-dependent parameters.
9167   return C;
9168 }
9169 
9170 template <typename Derived>
9171 OMPClause *
9172 TreeTransform<Derived>::TransformOMPAcquireClause(OMPAcquireClause *C) {
9173   // No need to rebuild this clause, no template-dependent parameters.
9174   return C;
9175 }
9176 
9177 template <typename Derived>
9178 OMPClause *
9179 TreeTransform<Derived>::TransformOMPReleaseClause(OMPReleaseClause *C) {
9180   // No need to rebuild this clause, no template-dependent parameters.
9181   return C;
9182 }
9183 
9184 template <typename Derived>
9185 OMPClause *
9186 TreeTransform<Derived>::TransformOMPRelaxedClause(OMPRelaxedClause *C) {
9187   // No need to rebuild this clause, no template-dependent parameters.
9188   return C;
9189 }
9190 
9191 template <typename Derived>
9192 OMPClause *
9193 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
9194   // No need to rebuild this clause, no template-dependent parameters.
9195   return C;
9196 }
9197 
9198 template <typename Derived>
9199 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
9200   // No need to rebuild this clause, no template-dependent parameters.
9201   return C;
9202 }
9203 
9204 template <typename Derived>
9205 OMPClause *
9206 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
9207   // No need to rebuild this clause, no template-dependent parameters.
9208   return C;
9209 }
9210 
9211 template <typename Derived>
9212 OMPClause *
9213 TreeTransform<Derived>::TransformOMPDestroyClause(OMPDestroyClause *C) {
9214   // No need to rebuild this clause, no template-dependent parameters.
9215   return C;
9216 }
9217 
9218 template <typename Derived>
9219 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
9220     OMPUnifiedAddressClause *C) {
9221   llvm_unreachable("unified_address clause cannot appear in dependent context");
9222 }
9223 
9224 template <typename Derived>
9225 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
9226     OMPUnifiedSharedMemoryClause *C) {
9227   llvm_unreachable(
9228       "unified_shared_memory clause cannot appear in dependent context");
9229 }
9230 
9231 template <typename Derived>
9232 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
9233     OMPReverseOffloadClause *C) {
9234   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
9235 }
9236 
9237 template <typename Derived>
9238 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
9239     OMPDynamicAllocatorsClause *C) {
9240   llvm_unreachable(
9241       "dynamic_allocators clause cannot appear in dependent context");
9242 }
9243 
9244 template <typename Derived>
9245 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
9246     OMPAtomicDefaultMemOrderClause *C) {
9247   llvm_unreachable(
9248       "atomic_default_mem_order clause cannot appear in dependent context");
9249 }
9250 
9251 template <typename Derived>
9252 OMPClause *
9253 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
9254   llvm::SmallVector<Expr *, 16> Vars;
9255   Vars.reserve(C->varlist_size());
9256   for (auto *VE : C->varlists()) {
9257     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9258     if (EVar.isInvalid())
9259       return nullptr;
9260     Vars.push_back(EVar.get());
9261   }
9262   return getDerived().RebuildOMPPrivateClause(
9263       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9264 }
9265 
9266 template <typename Derived>
9267 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
9268     OMPFirstprivateClause *C) {
9269   llvm::SmallVector<Expr *, 16> Vars;
9270   Vars.reserve(C->varlist_size());
9271   for (auto *VE : C->varlists()) {
9272     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9273     if (EVar.isInvalid())
9274       return nullptr;
9275     Vars.push_back(EVar.get());
9276   }
9277   return getDerived().RebuildOMPFirstprivateClause(
9278       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9279 }
9280 
9281 template <typename Derived>
9282 OMPClause *
9283 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
9284   llvm::SmallVector<Expr *, 16> Vars;
9285   Vars.reserve(C->varlist_size());
9286   for (auto *VE : C->varlists()) {
9287     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9288     if (EVar.isInvalid())
9289       return nullptr;
9290     Vars.push_back(EVar.get());
9291   }
9292   return getDerived().RebuildOMPLastprivateClause(
9293       Vars, C->getKind(), C->getKindLoc(), C->getColonLoc(), C->getBeginLoc(),
9294       C->getLParenLoc(), C->getEndLoc());
9295 }
9296 
9297 template <typename Derived>
9298 OMPClause *
9299 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
9300   llvm::SmallVector<Expr *, 16> Vars;
9301   Vars.reserve(C->varlist_size());
9302   for (auto *VE : C->varlists()) {
9303     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9304     if (EVar.isInvalid())
9305       return nullptr;
9306     Vars.push_back(EVar.get());
9307   }
9308   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
9309                                              C->getLParenLoc(), C->getEndLoc());
9310 }
9311 
9312 template <typename Derived>
9313 OMPClause *
9314 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
9315   llvm::SmallVector<Expr *, 16> Vars;
9316   Vars.reserve(C->varlist_size());
9317   for (auto *VE : C->varlists()) {
9318     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9319     if (EVar.isInvalid())
9320       return nullptr;
9321     Vars.push_back(EVar.get());
9322   }
9323   CXXScopeSpec ReductionIdScopeSpec;
9324   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9325 
9326   DeclarationNameInfo NameInfo = C->getNameInfo();
9327   if (NameInfo.getName()) {
9328     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9329     if (!NameInfo.getName())
9330       return nullptr;
9331   }
9332   // Build a list of all UDR decls with the same names ranged by the Scopes.
9333   // The Scope boundary is a duplication of the previous decl.
9334   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9335   for (auto *E : C->reduction_ops()) {
9336     // Transform all the decls.
9337     if (E) {
9338       auto *ULE = cast<UnresolvedLookupExpr>(E);
9339       UnresolvedSet<8> Decls;
9340       for (auto *D : ULE->decls()) {
9341         NamedDecl *InstD =
9342             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9343         Decls.addDecl(InstD, InstD->getAccess());
9344       }
9345       UnresolvedReductions.push_back(
9346        UnresolvedLookupExpr::Create(
9347           SemaRef.Context, /*NamingClass=*/nullptr,
9348           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
9349           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
9350           Decls.begin(), Decls.end()));
9351     } else
9352       UnresolvedReductions.push_back(nullptr);
9353   }
9354   return getDerived().RebuildOMPReductionClause(
9355       Vars, C->getModifier(), C->getBeginLoc(), C->getLParenLoc(),
9356       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc(),
9357       ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9358 }
9359 
9360 template <typename Derived>
9361 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
9362     OMPTaskReductionClause *C) {
9363   llvm::SmallVector<Expr *, 16> Vars;
9364   Vars.reserve(C->varlist_size());
9365   for (auto *VE : C->varlists()) {
9366     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9367     if (EVar.isInvalid())
9368       return nullptr;
9369     Vars.push_back(EVar.get());
9370   }
9371   CXXScopeSpec ReductionIdScopeSpec;
9372   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
9373 
9374   DeclarationNameInfo NameInfo = C->getNameInfo();
9375   if (NameInfo.getName()) {
9376     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9377     if (!NameInfo.getName())
9378       return nullptr;
9379   }
9380   // Build a list of all UDR decls with the same names ranged by the Scopes.
9381   // The Scope boundary is a duplication of the previous decl.
9382   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
9383   for (auto *E : C->reduction_ops()) {
9384     // Transform all the decls.
9385     if (E) {
9386       auto *ULE = cast<UnresolvedLookupExpr>(E);
9387       UnresolvedSet<8> Decls;
9388       for (auto *D : ULE->decls()) {
9389         NamedDecl *InstD =
9390             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
9391         Decls.addDecl(InstD, InstD->getAccess());
9392       }
9393       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
9394           SemaRef.Context, /*NamingClass=*/nullptr,
9395           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
9396           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
9397     } else
9398       UnresolvedReductions.push_back(nullptr);
9399   }
9400   return getDerived().RebuildOMPTaskReductionClause(
9401       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9402       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
9403 }
9404 
9405 template <typename Derived>
9406 OMPClause *
9407 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *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().RebuildOMPInReductionClause(
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>::TransformOMPLinearClause(OMPLinearClause *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   ExprResult Step = getDerived().TransformExpr(C->getStep());
9462   if (Step.isInvalid())
9463     return nullptr;
9464   return getDerived().RebuildOMPLinearClause(
9465       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
9466       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
9467 }
9468 
9469 template <typename Derived>
9470 OMPClause *
9471 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
9472   llvm::SmallVector<Expr *, 16> Vars;
9473   Vars.reserve(C->varlist_size());
9474   for (auto *VE : C->varlists()) {
9475     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9476     if (EVar.isInvalid())
9477       return nullptr;
9478     Vars.push_back(EVar.get());
9479   }
9480   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
9481   if (Alignment.isInvalid())
9482     return nullptr;
9483   return getDerived().RebuildOMPAlignedClause(
9484       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
9485       C->getColonLoc(), C->getEndLoc());
9486 }
9487 
9488 template <typename Derived>
9489 OMPClause *
9490 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
9491   llvm::SmallVector<Expr *, 16> Vars;
9492   Vars.reserve(C->varlist_size());
9493   for (auto *VE : C->varlists()) {
9494     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9495     if (EVar.isInvalid())
9496       return nullptr;
9497     Vars.push_back(EVar.get());
9498   }
9499   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
9500                                              C->getLParenLoc(), C->getEndLoc());
9501 }
9502 
9503 template <typename Derived>
9504 OMPClause *
9505 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
9506   llvm::SmallVector<Expr *, 16> Vars;
9507   Vars.reserve(C->varlist_size());
9508   for (auto *VE : C->varlists()) {
9509     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9510     if (EVar.isInvalid())
9511       return nullptr;
9512     Vars.push_back(EVar.get());
9513   }
9514   return getDerived().RebuildOMPCopyprivateClause(
9515       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9516 }
9517 
9518 template <typename Derived>
9519 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
9520   llvm::SmallVector<Expr *, 16> Vars;
9521   Vars.reserve(C->varlist_size());
9522   for (auto *VE : C->varlists()) {
9523     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9524     if (EVar.isInvalid())
9525       return nullptr;
9526     Vars.push_back(EVar.get());
9527   }
9528   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
9529                                             C->getLParenLoc(), C->getEndLoc());
9530 }
9531 
9532 template <typename Derived>
9533 OMPClause *
9534 TreeTransform<Derived>::TransformOMPDepobjClause(OMPDepobjClause *C) {
9535   ExprResult E = getDerived().TransformExpr(C->getDepobj());
9536   if (E.isInvalid())
9537     return nullptr;
9538   return getDerived().RebuildOMPDepobjClause(E.get(), C->getBeginLoc(),
9539                                              C->getLParenLoc(), C->getEndLoc());
9540 }
9541 
9542 template <typename Derived>
9543 OMPClause *
9544 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
9545   llvm::SmallVector<Expr *, 16> Vars;
9546   Expr *DepModifier = C->getModifier();
9547   if (DepModifier) {
9548     ExprResult DepModRes = getDerived().TransformExpr(DepModifier);
9549     if (DepModRes.isInvalid())
9550       return nullptr;
9551     DepModifier = DepModRes.get();
9552   }
9553   Vars.reserve(C->varlist_size());
9554   for (auto *VE : C->varlists()) {
9555     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9556     if (EVar.isInvalid())
9557       return nullptr;
9558     Vars.push_back(EVar.get());
9559   }
9560   return getDerived().RebuildOMPDependClause(
9561       DepModifier, C->getDependencyKind(), C->getDependencyLoc(),
9562       C->getColonLoc(), Vars, C->getBeginLoc(), C->getLParenLoc(),
9563       C->getEndLoc());
9564 }
9565 
9566 template <typename Derived>
9567 OMPClause *
9568 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
9569   ExprResult E = getDerived().TransformExpr(C->getDevice());
9570   if (E.isInvalid())
9571     return nullptr;
9572   return getDerived().RebuildOMPDeviceClause(
9573       C->getModifier(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9574       C->getModifierLoc(), C->getEndLoc());
9575 }
9576 
9577 template <typename Derived, class T>
9578 bool transformOMPMappableExprListClause(
9579     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
9580     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
9581     DeclarationNameInfo &MapperIdInfo,
9582     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
9583   // Transform expressions in the list.
9584   Vars.reserve(C->varlist_size());
9585   for (auto *VE : C->varlists()) {
9586     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
9587     if (EVar.isInvalid())
9588       return true;
9589     Vars.push_back(EVar.get());
9590   }
9591   // Transform mapper scope specifier and identifier.
9592   NestedNameSpecifierLoc QualifierLoc;
9593   if (C->getMapperQualifierLoc()) {
9594     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
9595         C->getMapperQualifierLoc());
9596     if (!QualifierLoc)
9597       return true;
9598   }
9599   MapperIdScopeSpec.Adopt(QualifierLoc);
9600   MapperIdInfo = C->getMapperIdInfo();
9601   if (MapperIdInfo.getName()) {
9602     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
9603     if (!MapperIdInfo.getName())
9604       return true;
9605   }
9606   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
9607   // the previous user-defined mapper lookup in dependent environment.
9608   for (auto *E : C->mapperlists()) {
9609     // Transform all the decls.
9610     if (E) {
9611       auto *ULE = cast<UnresolvedLookupExpr>(E);
9612       UnresolvedSet<8> Decls;
9613       for (auto *D : ULE->decls()) {
9614         NamedDecl *InstD =
9615             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
9616         Decls.addDecl(InstD, InstD->getAccess());
9617       }
9618       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
9619           TT.getSema().Context, /*NamingClass=*/nullptr,
9620           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
9621           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
9622           Decls.end()));
9623     } else {
9624       UnresolvedMappers.push_back(nullptr);
9625     }
9626   }
9627   return false;
9628 }
9629 
9630 template <typename Derived>
9631 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
9632   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9633   llvm::SmallVector<Expr *, 16> Vars;
9634   CXXScopeSpec MapperIdScopeSpec;
9635   DeclarationNameInfo MapperIdInfo;
9636   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9637   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
9638           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9639     return nullptr;
9640   return getDerived().RebuildOMPMapClause(
9641       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
9642       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
9643       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9644 }
9645 
9646 template <typename Derived>
9647 OMPClause *
9648 TreeTransform<Derived>::TransformOMPAllocateClause(OMPAllocateClause *C) {
9649   Expr *Allocator = C->getAllocator();
9650   if (Allocator) {
9651     ExprResult AllocatorRes = getDerived().TransformExpr(Allocator);
9652     if (AllocatorRes.isInvalid())
9653       return nullptr;
9654     Allocator = AllocatorRes.get();
9655   }
9656   llvm::SmallVector<Expr *, 16> Vars;
9657   Vars.reserve(C->varlist_size());
9658   for (auto *VE : C->varlists()) {
9659     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9660     if (EVar.isInvalid())
9661       return nullptr;
9662     Vars.push_back(EVar.get());
9663   }
9664   return getDerived().RebuildOMPAllocateClause(
9665       Allocator, Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
9666       C->getEndLoc());
9667 }
9668 
9669 template <typename Derived>
9670 OMPClause *
9671 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
9672   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
9673   if (E.isInvalid())
9674     return nullptr;
9675   return getDerived().RebuildOMPNumTeamsClause(
9676       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9677 }
9678 
9679 template <typename Derived>
9680 OMPClause *
9681 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
9682   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
9683   if (E.isInvalid())
9684     return nullptr;
9685   return getDerived().RebuildOMPThreadLimitClause(
9686       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9687 }
9688 
9689 template <typename Derived>
9690 OMPClause *
9691 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
9692   ExprResult E = getDerived().TransformExpr(C->getPriority());
9693   if (E.isInvalid())
9694     return nullptr;
9695   return getDerived().RebuildOMPPriorityClause(
9696       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9697 }
9698 
9699 template <typename Derived>
9700 OMPClause *
9701 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
9702   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
9703   if (E.isInvalid())
9704     return nullptr;
9705   return getDerived().RebuildOMPGrainsizeClause(
9706       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9707 }
9708 
9709 template <typename Derived>
9710 OMPClause *
9711 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
9712   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
9713   if (E.isInvalid())
9714     return nullptr;
9715   return getDerived().RebuildOMPNumTasksClause(
9716       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9717 }
9718 
9719 template <typename Derived>
9720 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
9721   ExprResult E = getDerived().TransformExpr(C->getHint());
9722   if (E.isInvalid())
9723     return nullptr;
9724   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
9725                                            C->getLParenLoc(), C->getEndLoc());
9726 }
9727 
9728 template <typename Derived>
9729 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
9730     OMPDistScheduleClause *C) {
9731   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
9732   if (E.isInvalid())
9733     return nullptr;
9734   return getDerived().RebuildOMPDistScheduleClause(
9735       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
9736       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
9737 }
9738 
9739 template <typename Derived>
9740 OMPClause *
9741 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
9742   // Rebuild Defaultmap Clause since we need to invoke the checking of
9743   // defaultmap(none:variable-category) after template initialization.
9744   return getDerived().RebuildOMPDefaultmapClause(C->getDefaultmapModifier(),
9745                                                  C->getDefaultmapKind(),
9746                                                  C->getBeginLoc(),
9747                                                  C->getLParenLoc(),
9748                                                  C->getDefaultmapModifierLoc(),
9749                                                  C->getDefaultmapKindLoc(),
9750                                                  C->getEndLoc());
9751 }
9752 
9753 template <typename Derived>
9754 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
9755   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9756   llvm::SmallVector<Expr *, 16> Vars;
9757   CXXScopeSpec MapperIdScopeSpec;
9758   DeclarationNameInfo MapperIdInfo;
9759   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9760   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
9761           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9762     return nullptr;
9763   return getDerived().RebuildOMPToClause(
9764       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9765       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9766 }
9767 
9768 template <typename Derived>
9769 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9770   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9771   llvm::SmallVector<Expr *, 16> Vars;
9772   CXXScopeSpec MapperIdScopeSpec;
9773   DeclarationNameInfo MapperIdInfo;
9774   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9775   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9776           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9777     return nullptr;
9778   return getDerived().RebuildOMPFromClause(
9779       C->getMotionModifiers(), C->getMotionModifiersLoc(), MapperIdScopeSpec,
9780       MapperIdInfo, C->getColonLoc(), Vars, Locs, UnresolvedMappers);
9781 }
9782 
9783 template <typename Derived>
9784 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9785     OMPUseDevicePtrClause *C) {
9786   llvm::SmallVector<Expr *, 16> Vars;
9787   Vars.reserve(C->varlist_size());
9788   for (auto *VE : C->varlists()) {
9789     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9790     if (EVar.isInvalid())
9791       return nullptr;
9792     Vars.push_back(EVar.get());
9793   }
9794   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9795   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9796 }
9797 
9798 template <typename Derived>
9799 OMPClause *TreeTransform<Derived>::TransformOMPUseDeviceAddrClause(
9800     OMPUseDeviceAddrClause *C) {
9801   llvm::SmallVector<Expr *, 16> Vars;
9802   Vars.reserve(C->varlist_size());
9803   for (auto *VE : C->varlists()) {
9804     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9805     if (EVar.isInvalid())
9806       return nullptr;
9807     Vars.push_back(EVar.get());
9808   }
9809   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9810   return getDerived().RebuildOMPUseDeviceAddrClause(Vars, Locs);
9811 }
9812 
9813 template <typename Derived>
9814 OMPClause *
9815 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9816   llvm::SmallVector<Expr *, 16> Vars;
9817   Vars.reserve(C->varlist_size());
9818   for (auto *VE : C->varlists()) {
9819     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9820     if (EVar.isInvalid())
9821       return nullptr;
9822     Vars.push_back(EVar.get());
9823   }
9824   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9825   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9826 }
9827 
9828 template <typename Derived>
9829 OMPClause *
9830 TreeTransform<Derived>::TransformOMPNontemporalClause(OMPNontemporalClause *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   return getDerived().RebuildOMPNontemporalClause(
9840       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9841 }
9842 
9843 template <typename Derived>
9844 OMPClause *
9845 TreeTransform<Derived>::TransformOMPInclusiveClause(OMPInclusiveClause *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   return getDerived().RebuildOMPInclusiveClause(
9855       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9856 }
9857 
9858 template <typename Derived>
9859 OMPClause *
9860 TreeTransform<Derived>::TransformOMPExclusiveClause(OMPExclusiveClause *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   return getDerived().RebuildOMPExclusiveClause(
9870       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9871 }
9872 
9873 template <typename Derived>
9874 OMPClause *TreeTransform<Derived>::TransformOMPUsesAllocatorsClause(
9875     OMPUsesAllocatorsClause *C) {
9876   SmallVector<Sema::UsesAllocatorsData, 16> Data;
9877   Data.reserve(C->getNumberOfAllocators());
9878   for (unsigned I = 0, E = C->getNumberOfAllocators(); I < E; ++I) {
9879     OMPUsesAllocatorsClause::Data D = C->getAllocatorData(I);
9880     ExprResult Allocator = getDerived().TransformExpr(D.Allocator);
9881     if (Allocator.isInvalid())
9882       continue;
9883     ExprResult AllocatorTraits;
9884     if (Expr *AT = D.AllocatorTraits) {
9885       AllocatorTraits = getDerived().TransformExpr(AT);
9886       if (AllocatorTraits.isInvalid())
9887         continue;
9888     }
9889     Sema::UsesAllocatorsData &NewD = Data.emplace_back();
9890     NewD.Allocator = Allocator.get();
9891     NewD.AllocatorTraits = AllocatorTraits.get();
9892     NewD.LParenLoc = D.LParenLoc;
9893     NewD.RParenLoc = D.RParenLoc;
9894   }
9895   return getDerived().RebuildOMPUsesAllocatorsClause(
9896       Data, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9897 }
9898 
9899 template <typename Derived>
9900 OMPClause *
9901 TreeTransform<Derived>::TransformOMPAffinityClause(OMPAffinityClause *C) {
9902   SmallVector<Expr *, 4> Locators;
9903   Locators.reserve(C->varlist_size());
9904   ExprResult ModifierRes;
9905   if (Expr *Modifier = C->getModifier()) {
9906     ModifierRes = getDerived().TransformExpr(Modifier);
9907     if (ModifierRes.isInvalid())
9908       return nullptr;
9909   }
9910   for (Expr *E : C->varlists()) {
9911     ExprResult Locator = getDerived().TransformExpr(E);
9912     if (Locator.isInvalid())
9913       continue;
9914     Locators.push_back(Locator.get());
9915   }
9916   return getDerived().RebuildOMPAffinityClause(
9917       C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(), C->getEndLoc(),
9918       ModifierRes.get(), Locators);
9919 }
9920 
9921 template <typename Derived>
9922 OMPClause *TreeTransform<Derived>::TransformOMPOrderClause(OMPOrderClause *C) {
9923   return getDerived().RebuildOMPOrderClause(C->getKind(), C->getKindKwLoc(),
9924                                             C->getBeginLoc(), C->getLParenLoc(),
9925                                             C->getEndLoc());
9926 }
9927 
9928 //===----------------------------------------------------------------------===//
9929 // Expression transformation
9930 //===----------------------------------------------------------------------===//
9931 template<typename Derived>
9932 ExprResult
9933 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9934   return TransformExpr(E->getSubExpr());
9935 }
9936 
9937 template<typename Derived>
9938 ExprResult
9939 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9940   if (!E->isTypeDependent())
9941     return E;
9942 
9943   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9944                                             E->getIdentKind());
9945 }
9946 
9947 template<typename Derived>
9948 ExprResult
9949 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9950   NestedNameSpecifierLoc QualifierLoc;
9951   if (E->getQualifierLoc()) {
9952     QualifierLoc
9953       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9954     if (!QualifierLoc)
9955       return ExprError();
9956   }
9957 
9958   ValueDecl *ND
9959     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9960                                                          E->getDecl()));
9961   if (!ND)
9962     return ExprError();
9963 
9964   NamedDecl *Found = ND;
9965   if (E->getFoundDecl() != E->getDecl()) {
9966     Found = cast_or_null<NamedDecl>(
9967         getDerived().TransformDecl(E->getLocation(), E->getFoundDecl()));
9968     if (!Found)
9969       return ExprError();
9970   }
9971 
9972   DeclarationNameInfo NameInfo = E->getNameInfo();
9973   if (NameInfo.getName()) {
9974     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9975     if (!NameInfo.getName())
9976       return ExprError();
9977   }
9978 
9979   if (!getDerived().AlwaysRebuild() &&
9980       QualifierLoc == E->getQualifierLoc() &&
9981       ND == E->getDecl() &&
9982       Found == E->getFoundDecl() &&
9983       NameInfo.getName() == E->getDecl()->getDeclName() &&
9984       !E->hasExplicitTemplateArgs()) {
9985 
9986     // Mark it referenced in the new context regardless.
9987     // FIXME: this is a bit instantiation-specific.
9988     SemaRef.MarkDeclRefReferenced(E);
9989 
9990     return E;
9991   }
9992 
9993   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9994   if (E->hasExplicitTemplateArgs()) {
9995     TemplateArgs = &TransArgs;
9996     TransArgs.setLAngleLoc(E->getLAngleLoc());
9997     TransArgs.setRAngleLoc(E->getRAngleLoc());
9998     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9999                                                 E->getNumTemplateArgs(),
10000                                                 TransArgs))
10001       return ExprError();
10002   }
10003 
10004   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
10005                                          Found, TemplateArgs);
10006 }
10007 
10008 template<typename Derived>
10009 ExprResult
10010 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
10011   return E;
10012 }
10013 
10014 template <typename Derived>
10015 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
10016     FixedPointLiteral *E) {
10017   return E;
10018 }
10019 
10020 template<typename Derived>
10021 ExprResult
10022 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
10023   return E;
10024 }
10025 
10026 template<typename Derived>
10027 ExprResult
10028 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
10029   return E;
10030 }
10031 
10032 template<typename Derived>
10033 ExprResult
10034 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
10035   return E;
10036 }
10037 
10038 template<typename Derived>
10039 ExprResult
10040 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
10041   return E;
10042 }
10043 
10044 template<typename Derived>
10045 ExprResult
10046 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
10047   if (FunctionDecl *FD = E->getDirectCallee())
10048     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
10049   return SemaRef.MaybeBindToTemporary(E);
10050 }
10051 
10052 template<typename Derived>
10053 ExprResult
10054 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
10055   ExprResult ControllingExpr =
10056     getDerived().TransformExpr(E->getControllingExpr());
10057   if (ControllingExpr.isInvalid())
10058     return ExprError();
10059 
10060   SmallVector<Expr *, 4> AssocExprs;
10061   SmallVector<TypeSourceInfo *, 4> AssocTypes;
10062   for (const GenericSelectionExpr::Association Assoc : E->associations()) {
10063     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
10064     if (TSI) {
10065       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
10066       if (!AssocType)
10067         return ExprError();
10068       AssocTypes.push_back(AssocType);
10069     } else {
10070       AssocTypes.push_back(nullptr);
10071     }
10072 
10073     ExprResult AssocExpr =
10074         getDerived().TransformExpr(Assoc.getAssociationExpr());
10075     if (AssocExpr.isInvalid())
10076       return ExprError();
10077     AssocExprs.push_back(AssocExpr.get());
10078   }
10079 
10080   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
10081                                                   E->getDefaultLoc(),
10082                                                   E->getRParenLoc(),
10083                                                   ControllingExpr.get(),
10084                                                   AssocTypes,
10085                                                   AssocExprs);
10086 }
10087 
10088 template<typename Derived>
10089 ExprResult
10090 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
10091   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10092   if (SubExpr.isInvalid())
10093     return ExprError();
10094 
10095   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10096     return E;
10097 
10098   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
10099                                        E->getRParen());
10100 }
10101 
10102 /// The operand of a unary address-of operator has special rules: it's
10103 /// allowed to refer to a non-static member of a class even if there's no 'this'
10104 /// object available.
10105 template<typename Derived>
10106 ExprResult
10107 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
10108   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
10109     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
10110   else
10111     return getDerived().TransformExpr(E);
10112 }
10113 
10114 template<typename Derived>
10115 ExprResult
10116 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
10117   ExprResult SubExpr;
10118   if (E->getOpcode() == UO_AddrOf)
10119     SubExpr = TransformAddressOfOperand(E->getSubExpr());
10120   else
10121     SubExpr = TransformExpr(E->getSubExpr());
10122   if (SubExpr.isInvalid())
10123     return ExprError();
10124 
10125   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
10126     return E;
10127 
10128   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
10129                                            E->getOpcode(),
10130                                            SubExpr.get());
10131 }
10132 
10133 template<typename Derived>
10134 ExprResult
10135 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
10136   // Transform the type.
10137   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
10138   if (!Type)
10139     return ExprError();
10140 
10141   // Transform all of the components into components similar to what the
10142   // parser uses.
10143   // FIXME: It would be slightly more efficient in the non-dependent case to
10144   // just map FieldDecls, rather than requiring the rebuilder to look for
10145   // the fields again. However, __builtin_offsetof is rare enough in
10146   // template code that we don't care.
10147   bool ExprChanged = false;
10148   typedef Sema::OffsetOfComponent Component;
10149   SmallVector<Component, 4> Components;
10150   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
10151     const OffsetOfNode &ON = E->getComponent(I);
10152     Component Comp;
10153     Comp.isBrackets = true;
10154     Comp.LocStart = ON.getSourceRange().getBegin();
10155     Comp.LocEnd = ON.getSourceRange().getEnd();
10156     switch (ON.getKind()) {
10157     case OffsetOfNode::Array: {
10158       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
10159       ExprResult Index = getDerived().TransformExpr(FromIndex);
10160       if (Index.isInvalid())
10161         return ExprError();
10162 
10163       ExprChanged = ExprChanged || Index.get() != FromIndex;
10164       Comp.isBrackets = true;
10165       Comp.U.E = Index.get();
10166       break;
10167     }
10168 
10169     case OffsetOfNode::Field:
10170     case OffsetOfNode::Identifier:
10171       Comp.isBrackets = false;
10172       Comp.U.IdentInfo = ON.getFieldName();
10173       if (!Comp.U.IdentInfo)
10174         continue;
10175 
10176       break;
10177 
10178     case OffsetOfNode::Base:
10179       // Will be recomputed during the rebuild.
10180       continue;
10181     }
10182 
10183     Components.push_back(Comp);
10184   }
10185 
10186   // If nothing changed, retain the existing expression.
10187   if (!getDerived().AlwaysRebuild() &&
10188       Type == E->getTypeSourceInfo() &&
10189       !ExprChanged)
10190     return E;
10191 
10192   // Build a new offsetof expression.
10193   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
10194                                           Components, E->getRParenLoc());
10195 }
10196 
10197 template<typename Derived>
10198 ExprResult
10199 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
10200   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
10201          "opaque value expression requires transformation");
10202   return E;
10203 }
10204 
10205 template<typename Derived>
10206 ExprResult
10207 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
10208   return E;
10209 }
10210 
10211 template <typename Derived>
10212 ExprResult TreeTransform<Derived>::TransformRecoveryExpr(RecoveryExpr *E) {
10213   llvm::SmallVector<Expr *, 8> Children;
10214   bool Changed = false;
10215   for (Expr *C : E->subExpressions()) {
10216     ExprResult NewC = getDerived().TransformExpr(C);
10217     if (NewC.isInvalid())
10218       return ExprError();
10219     Children.push_back(NewC.get());
10220 
10221     Changed |= NewC.get() != C;
10222   }
10223   if (!getDerived().AlwaysRebuild() && !Changed)
10224     return E;
10225   return getDerived().RebuildRecoveryExpr(E->getBeginLoc(), E->getEndLoc(),
10226                                           Children, E->getType());
10227 }
10228 
10229 template<typename Derived>
10230 ExprResult
10231 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
10232   // Rebuild the syntactic form.  The original syntactic form has
10233   // opaque-value expressions in it, so strip those away and rebuild
10234   // the result.  This is a really awful way of doing this, but the
10235   // better solution (rebuilding the semantic expressions and
10236   // rebinding OVEs as necessary) doesn't work; we'd need
10237   // TreeTransform to not strip away implicit conversions.
10238   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
10239   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
10240   if (result.isInvalid()) return ExprError();
10241 
10242   // If that gives us a pseudo-object result back, the pseudo-object
10243   // expression must have been an lvalue-to-rvalue conversion which we
10244   // should reapply.
10245   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
10246     result = SemaRef.checkPseudoObjectRValue(result.get());
10247 
10248   return result;
10249 }
10250 
10251 template<typename Derived>
10252 ExprResult
10253 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
10254                                                 UnaryExprOrTypeTraitExpr *E) {
10255   if (E->isArgumentType()) {
10256     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
10257 
10258     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10259     if (!NewT)
10260       return ExprError();
10261 
10262     if (!getDerived().AlwaysRebuild() && OldT == NewT)
10263       return E;
10264 
10265     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
10266                                                     E->getKind(),
10267                                                     E->getSourceRange());
10268   }
10269 
10270   // C++0x [expr.sizeof]p1:
10271   //   The operand is either an expression, which is an unevaluated operand
10272   //   [...]
10273   EnterExpressionEvaluationContext Unevaluated(
10274       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10275       Sema::ReuseLambdaContextDecl);
10276 
10277   // Try to recover if we have something like sizeof(T::X) where X is a type.
10278   // Notably, there must be *exactly* one set of parens if X is a type.
10279   TypeSourceInfo *RecoveryTSI = nullptr;
10280   ExprResult SubExpr;
10281   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
10282   if (auto *DRE =
10283           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
10284     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
10285         PE, DRE, false, &RecoveryTSI);
10286   else
10287     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
10288 
10289   if (RecoveryTSI) {
10290     return getDerived().RebuildUnaryExprOrTypeTrait(
10291         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
10292   } else if (SubExpr.isInvalid())
10293     return ExprError();
10294 
10295   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
10296     return E;
10297 
10298   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
10299                                                   E->getOperatorLoc(),
10300                                                   E->getKind(),
10301                                                   E->getSourceRange());
10302 }
10303 
10304 template<typename Derived>
10305 ExprResult
10306 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
10307   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10308   if (LHS.isInvalid())
10309     return ExprError();
10310 
10311   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10312   if (RHS.isInvalid())
10313     return ExprError();
10314 
10315 
10316   if (!getDerived().AlwaysRebuild() &&
10317       LHS.get() == E->getLHS() &&
10318       RHS.get() == E->getRHS())
10319     return E;
10320 
10321   return getDerived().RebuildArraySubscriptExpr(
10322       LHS.get(),
10323       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
10324 }
10325 
10326 template <typename Derived>
10327 ExprResult
10328 TreeTransform<Derived>::TransformMatrixSubscriptExpr(MatrixSubscriptExpr *E) {
10329   ExprResult Base = getDerived().TransformExpr(E->getBase());
10330   if (Base.isInvalid())
10331     return ExprError();
10332 
10333   ExprResult RowIdx = getDerived().TransformExpr(E->getRowIdx());
10334   if (RowIdx.isInvalid())
10335     return ExprError();
10336 
10337   ExprResult ColumnIdx = getDerived().TransformExpr(E->getColumnIdx());
10338   if (ColumnIdx.isInvalid())
10339     return ExprError();
10340 
10341   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10342       RowIdx.get() == E->getRowIdx() && ColumnIdx.get() == E->getColumnIdx())
10343     return E;
10344 
10345   return getDerived().RebuildMatrixSubscriptExpr(
10346       Base.get(), RowIdx.get(), ColumnIdx.get(), E->getRBracketLoc());
10347 }
10348 
10349 template <typename Derived>
10350 ExprResult
10351 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
10352   ExprResult Base = getDerived().TransformExpr(E->getBase());
10353   if (Base.isInvalid())
10354     return ExprError();
10355 
10356   ExprResult LowerBound;
10357   if (E->getLowerBound()) {
10358     LowerBound = getDerived().TransformExpr(E->getLowerBound());
10359     if (LowerBound.isInvalid())
10360       return ExprError();
10361   }
10362 
10363   ExprResult Length;
10364   if (E->getLength()) {
10365     Length = getDerived().TransformExpr(E->getLength());
10366     if (Length.isInvalid())
10367       return ExprError();
10368   }
10369 
10370   ExprResult Stride;
10371   if (Expr *Str = E->getStride()) {
10372     Stride = getDerived().TransformExpr(Str);
10373     if (Stride.isInvalid())
10374       return ExprError();
10375   }
10376 
10377   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
10378       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
10379     return E;
10380 
10381   return getDerived().RebuildOMPArraySectionExpr(
10382       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(),
10383       E->getColonLocFirst(), E->getColonLocSecond(), Length.get(), Stride.get(),
10384       E->getRBracketLoc());
10385 }
10386 
10387 template <typename Derived>
10388 ExprResult
10389 TreeTransform<Derived>::TransformOMPArrayShapingExpr(OMPArrayShapingExpr *E) {
10390   ExprResult Base = getDerived().TransformExpr(E->getBase());
10391   if (Base.isInvalid())
10392     return ExprError();
10393 
10394   SmallVector<Expr *, 4> Dims;
10395   bool ErrorFound = false;
10396   for (Expr *Dim : E->getDimensions()) {
10397     ExprResult DimRes = getDerived().TransformExpr(Dim);
10398     if (DimRes.isInvalid()) {
10399       ErrorFound = true;
10400       continue;
10401     }
10402     Dims.push_back(DimRes.get());
10403   }
10404 
10405   if (ErrorFound)
10406     return ExprError();
10407   return getDerived().RebuildOMPArrayShapingExpr(Base.get(), E->getLParenLoc(),
10408                                                  E->getRParenLoc(), Dims,
10409                                                  E->getBracketsRanges());
10410 }
10411 
10412 template <typename Derived>
10413 ExprResult
10414 TreeTransform<Derived>::TransformOMPIteratorExpr(OMPIteratorExpr *E) {
10415   unsigned NumIterators = E->numOfIterators();
10416   SmallVector<Sema::OMPIteratorData, 4> Data(NumIterators);
10417 
10418   bool ErrorFound = false;
10419   bool NeedToRebuild = getDerived().AlwaysRebuild();
10420   for (unsigned I = 0; I < NumIterators; ++I) {
10421     auto *D = cast<VarDecl>(E->getIteratorDecl(I));
10422     Data[I].DeclIdent = D->getIdentifier();
10423     Data[I].DeclIdentLoc = D->getLocation();
10424     if (D->getLocation() == D->getBeginLoc()) {
10425       assert(SemaRef.Context.hasSameType(D->getType(), SemaRef.Context.IntTy) &&
10426              "Implicit type must be int.");
10427     } else {
10428       TypeSourceInfo *TSI = getDerived().TransformType(D->getTypeSourceInfo());
10429       QualType DeclTy = getDerived().TransformType(D->getType());
10430       Data[I].Type = SemaRef.CreateParsedType(DeclTy, TSI);
10431     }
10432     OMPIteratorExpr::IteratorRange Range = E->getIteratorRange(I);
10433     ExprResult Begin = getDerived().TransformExpr(Range.Begin);
10434     ExprResult End = getDerived().TransformExpr(Range.End);
10435     ExprResult Step = getDerived().TransformExpr(Range.Step);
10436     ErrorFound = ErrorFound ||
10437                  !(!D->getTypeSourceInfo() || (Data[I].Type.getAsOpaquePtr() &&
10438                                                !Data[I].Type.get().isNull())) ||
10439                  Begin.isInvalid() || End.isInvalid() || Step.isInvalid();
10440     if (ErrorFound)
10441       continue;
10442     Data[I].Range.Begin = Begin.get();
10443     Data[I].Range.End = End.get();
10444     Data[I].Range.Step = Step.get();
10445     Data[I].AssignLoc = E->getAssignLoc(I);
10446     Data[I].ColonLoc = E->getColonLoc(I);
10447     Data[I].SecColonLoc = E->getSecondColonLoc(I);
10448     NeedToRebuild =
10449         NeedToRebuild ||
10450         (D->getTypeSourceInfo() && Data[I].Type.get().getTypePtrOrNull() !=
10451                                        D->getType().getTypePtrOrNull()) ||
10452         Range.Begin != Data[I].Range.Begin || Range.End != Data[I].Range.End ||
10453         Range.Step != Data[I].Range.Step;
10454   }
10455   if (ErrorFound)
10456     return ExprError();
10457   if (!NeedToRebuild)
10458     return E;
10459 
10460   ExprResult Res = getDerived().RebuildOMPIteratorExpr(
10461       E->getIteratorKwLoc(), E->getLParenLoc(), E->getRParenLoc(), Data);
10462   if (!Res.isUsable())
10463     return Res;
10464   auto *IE = cast<OMPIteratorExpr>(Res.get());
10465   for (unsigned I = 0; I < NumIterators; ++I)
10466     getDerived().transformedLocalDecl(E->getIteratorDecl(I),
10467                                       IE->getIteratorDecl(I));
10468   return Res;
10469 }
10470 
10471 template<typename Derived>
10472 ExprResult
10473 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
10474   // Transform the callee.
10475   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10476   if (Callee.isInvalid())
10477     return ExprError();
10478 
10479   // Transform arguments.
10480   bool ArgChanged = false;
10481   SmallVector<Expr*, 8> Args;
10482   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10483                                   &ArgChanged))
10484     return ExprError();
10485 
10486   if (!getDerived().AlwaysRebuild() &&
10487       Callee.get() == E->getCallee() &&
10488       !ArgChanged)
10489     return SemaRef.MaybeBindToTemporary(E);
10490 
10491   // FIXME: Wrong source location information for the '('.
10492   SourceLocation FakeLParenLoc
10493     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10494 
10495   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10496   if (E->hasStoredFPFeatures()) {
10497     FPOptionsOverride NewOverrides = E->getFPFeatures();
10498     getSema().CurFPFeatures =
10499         NewOverrides.applyOverrides(getSema().getLangOpts());
10500     getSema().FpPragmaStack.CurrentValue = NewOverrides;
10501   }
10502 
10503   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10504                                       Args,
10505                                       E->getRParenLoc());
10506 }
10507 
10508 template<typename Derived>
10509 ExprResult
10510 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
10511   ExprResult Base = getDerived().TransformExpr(E->getBase());
10512   if (Base.isInvalid())
10513     return ExprError();
10514 
10515   NestedNameSpecifierLoc QualifierLoc;
10516   if (E->hasQualifier()) {
10517     QualifierLoc
10518       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10519 
10520     if (!QualifierLoc)
10521       return ExprError();
10522   }
10523   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10524 
10525   ValueDecl *Member
10526     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
10527                                                          E->getMemberDecl()));
10528   if (!Member)
10529     return ExprError();
10530 
10531   NamedDecl *FoundDecl = E->getFoundDecl();
10532   if (FoundDecl == E->getMemberDecl()) {
10533     FoundDecl = Member;
10534   } else {
10535     FoundDecl = cast_or_null<NamedDecl>(
10536                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
10537     if (!FoundDecl)
10538       return ExprError();
10539   }
10540 
10541   if (!getDerived().AlwaysRebuild() &&
10542       Base.get() == E->getBase() &&
10543       QualifierLoc == E->getQualifierLoc() &&
10544       Member == E->getMemberDecl() &&
10545       FoundDecl == E->getFoundDecl() &&
10546       !E->hasExplicitTemplateArgs()) {
10547 
10548     // Mark it referenced in the new context regardless.
10549     // FIXME: this is a bit instantiation-specific.
10550     SemaRef.MarkMemberReferenced(E);
10551 
10552     return E;
10553   }
10554 
10555   TemplateArgumentListInfo TransArgs;
10556   if (E->hasExplicitTemplateArgs()) {
10557     TransArgs.setLAngleLoc(E->getLAngleLoc());
10558     TransArgs.setRAngleLoc(E->getRAngleLoc());
10559     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10560                                                 E->getNumTemplateArgs(),
10561                                                 TransArgs))
10562       return ExprError();
10563   }
10564 
10565   // FIXME: Bogus source location for the operator
10566   SourceLocation FakeOperatorLoc =
10567       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
10568 
10569   // FIXME: to do this check properly, we will need to preserve the
10570   // first-qualifier-in-scope here, just in case we had a dependent
10571   // base (and therefore couldn't do the check) and a
10572   // nested-name-qualifier (and therefore could do the lookup).
10573   NamedDecl *FirstQualifierInScope = nullptr;
10574   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
10575   if (MemberNameInfo.getName()) {
10576     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
10577     if (!MemberNameInfo.getName())
10578       return ExprError();
10579   }
10580 
10581   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
10582                                         E->isArrow(),
10583                                         QualifierLoc,
10584                                         TemplateKWLoc,
10585                                         MemberNameInfo,
10586                                         Member,
10587                                         FoundDecl,
10588                                         (E->hasExplicitTemplateArgs()
10589                                            ? &TransArgs : nullptr),
10590                                         FirstQualifierInScope);
10591 }
10592 
10593 template<typename Derived>
10594 ExprResult
10595 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
10596   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10597   if (LHS.isInvalid())
10598     return ExprError();
10599 
10600   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10601   if (RHS.isInvalid())
10602     return ExprError();
10603 
10604   if (!getDerived().AlwaysRebuild() &&
10605       LHS.get() == E->getLHS() &&
10606       RHS.get() == E->getRHS())
10607     return E;
10608 
10609   if (E->isCompoundAssignmentOp())
10610     // FPFeatures has already been established from trailing storage
10611     return getDerived().RebuildBinaryOperator(
10612         E->getOperatorLoc(), E->getOpcode(), LHS.get(), RHS.get());
10613   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10614   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10615   getSema().CurFPFeatures =
10616       NewOverrides.applyOverrides(getSema().getLangOpts());
10617   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10618   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
10619                                             LHS.get(), RHS.get());
10620 }
10621 
10622 template <typename Derived>
10623 ExprResult TreeTransform<Derived>::TransformCXXRewrittenBinaryOperator(
10624     CXXRewrittenBinaryOperator *E) {
10625   CXXRewrittenBinaryOperator::DecomposedForm Decomp = E->getDecomposedForm();
10626 
10627   ExprResult LHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.LHS));
10628   if (LHS.isInvalid())
10629     return ExprError();
10630 
10631   ExprResult RHS = getDerived().TransformExpr(const_cast<Expr*>(Decomp.RHS));
10632   if (RHS.isInvalid())
10633     return ExprError();
10634 
10635   if (!getDerived().AlwaysRebuild() &&
10636       LHS.get() == Decomp.LHS &&
10637       RHS.get() == Decomp.RHS)
10638     return E;
10639 
10640   // Extract the already-resolved callee declarations so that we can restrict
10641   // ourselves to using them as the unqualified lookup results when rebuilding.
10642   UnresolvedSet<2> UnqualLookups;
10643   Expr *PossibleBinOps[] = {E->getSemanticForm(),
10644                             const_cast<Expr *>(Decomp.InnerBinOp)};
10645   for (Expr *PossibleBinOp : PossibleBinOps) {
10646     auto *Op = dyn_cast<CXXOperatorCallExpr>(PossibleBinOp->IgnoreImplicit());
10647     if (!Op)
10648       continue;
10649     auto *Callee = dyn_cast<DeclRefExpr>(Op->getCallee()->IgnoreImplicit());
10650     if (!Callee || isa<CXXMethodDecl>(Callee->getDecl()))
10651       continue;
10652 
10653     // Transform the callee in case we built a call to a local extern
10654     // declaration.
10655     NamedDecl *Found = cast_or_null<NamedDecl>(getDerived().TransformDecl(
10656         E->getOperatorLoc(), Callee->getFoundDecl()));
10657     if (!Found)
10658       return ExprError();
10659     UnqualLookups.addDecl(Found);
10660   }
10661 
10662   return getDerived().RebuildCXXRewrittenBinaryOperator(
10663       E->getOperatorLoc(), Decomp.Opcode, UnqualLookups, LHS.get(), RHS.get());
10664 }
10665 
10666 template<typename Derived>
10667 ExprResult
10668 TreeTransform<Derived>::TransformCompoundAssignOperator(
10669                                                       CompoundAssignOperator *E) {
10670   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
10671   FPOptionsOverride NewOverrides(E->getFPFeatures(getSema().getLangOpts()));
10672   getSema().CurFPFeatures =
10673       NewOverrides.applyOverrides(getSema().getLangOpts());
10674   getSema().FpPragmaStack.CurrentValue = NewOverrides;
10675   return getDerived().TransformBinaryOperator(E);
10676 }
10677 
10678 template<typename Derived>
10679 ExprResult TreeTransform<Derived>::
10680 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
10681   // Just rebuild the common and RHS expressions and see whether we
10682   // get any changes.
10683 
10684   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
10685   if (commonExpr.isInvalid())
10686     return ExprError();
10687 
10688   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
10689   if (rhs.isInvalid())
10690     return ExprError();
10691 
10692   if (!getDerived().AlwaysRebuild() &&
10693       commonExpr.get() == e->getCommon() &&
10694       rhs.get() == e->getFalseExpr())
10695     return e;
10696 
10697   return getDerived().RebuildConditionalOperator(commonExpr.get(),
10698                                                  e->getQuestionLoc(),
10699                                                  nullptr,
10700                                                  e->getColonLoc(),
10701                                                  rhs.get());
10702 }
10703 
10704 template<typename Derived>
10705 ExprResult
10706 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
10707   ExprResult Cond = getDerived().TransformExpr(E->getCond());
10708   if (Cond.isInvalid())
10709     return ExprError();
10710 
10711   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
10712   if (LHS.isInvalid())
10713     return ExprError();
10714 
10715   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
10716   if (RHS.isInvalid())
10717     return ExprError();
10718 
10719   if (!getDerived().AlwaysRebuild() &&
10720       Cond.get() == E->getCond() &&
10721       LHS.get() == E->getLHS() &&
10722       RHS.get() == E->getRHS())
10723     return E;
10724 
10725   return getDerived().RebuildConditionalOperator(Cond.get(),
10726                                                  E->getQuestionLoc(),
10727                                                  LHS.get(),
10728                                                  E->getColonLoc(),
10729                                                  RHS.get());
10730 }
10731 
10732 template<typename Derived>
10733 ExprResult
10734 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
10735   // Implicit casts are eliminated during transformation, since they
10736   // will be recomputed by semantic analysis after transformation.
10737   return getDerived().TransformExpr(E->getSubExprAsWritten());
10738 }
10739 
10740 template<typename Derived>
10741 ExprResult
10742 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
10743   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10744   if (!Type)
10745     return ExprError();
10746 
10747   ExprResult SubExpr
10748     = getDerived().TransformExpr(E->getSubExprAsWritten());
10749   if (SubExpr.isInvalid())
10750     return ExprError();
10751 
10752   if (!getDerived().AlwaysRebuild() &&
10753       Type == E->getTypeInfoAsWritten() &&
10754       SubExpr.get() == E->getSubExpr())
10755     return E;
10756 
10757   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
10758                                             Type,
10759                                             E->getRParenLoc(),
10760                                             SubExpr.get());
10761 }
10762 
10763 template<typename Derived>
10764 ExprResult
10765 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
10766   TypeSourceInfo *OldT = E->getTypeSourceInfo();
10767   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
10768   if (!NewT)
10769     return ExprError();
10770 
10771   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
10772   if (Init.isInvalid())
10773     return ExprError();
10774 
10775   if (!getDerived().AlwaysRebuild() &&
10776       OldT == NewT &&
10777       Init.get() == E->getInitializer())
10778     return SemaRef.MaybeBindToTemporary(E);
10779 
10780   // Note: the expression type doesn't necessarily match the
10781   // type-as-written, but that's okay, because it should always be
10782   // derivable from the initializer.
10783 
10784   return getDerived().RebuildCompoundLiteralExpr(
10785       E->getLParenLoc(), NewT,
10786       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
10787 }
10788 
10789 template<typename Derived>
10790 ExprResult
10791 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
10792   ExprResult Base = getDerived().TransformExpr(E->getBase());
10793   if (Base.isInvalid())
10794     return ExprError();
10795 
10796   if (!getDerived().AlwaysRebuild() &&
10797       Base.get() == E->getBase())
10798     return E;
10799 
10800   // FIXME: Bad source location
10801   SourceLocation FakeOperatorLoc =
10802       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
10803   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
10804                                                   E->getAccessorLoc(),
10805                                                   E->getAccessor());
10806 }
10807 
10808 template<typename Derived>
10809 ExprResult
10810 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
10811   if (InitListExpr *Syntactic = E->getSyntacticForm())
10812     E = Syntactic;
10813 
10814   bool InitChanged = false;
10815 
10816   EnterExpressionEvaluationContext Context(
10817       getSema(), EnterExpressionEvaluationContext::InitList);
10818 
10819   SmallVector<Expr*, 4> Inits;
10820   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
10821                                   Inits, &InitChanged))
10822     return ExprError();
10823 
10824   if (!getDerived().AlwaysRebuild() && !InitChanged) {
10825     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
10826     // in some cases. We can't reuse it in general, because the syntactic and
10827     // semantic forms are linked, and we can't know that semantic form will
10828     // match even if the syntactic form does.
10829   }
10830 
10831   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
10832                                       E->getRBraceLoc());
10833 }
10834 
10835 template<typename Derived>
10836 ExprResult
10837 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
10838   Designation Desig;
10839 
10840   // transform the initializer value
10841   ExprResult Init = getDerived().TransformExpr(E->getInit());
10842   if (Init.isInvalid())
10843     return ExprError();
10844 
10845   // transform the designators.
10846   SmallVector<Expr*, 4> ArrayExprs;
10847   bool ExprChanged = false;
10848   for (const DesignatedInitExpr::Designator &D : E->designators()) {
10849     if (D.isFieldDesignator()) {
10850       Desig.AddDesignator(Designator::getField(D.getFieldName(),
10851                                                D.getDotLoc(),
10852                                                D.getFieldLoc()));
10853       if (D.getField()) {
10854         FieldDecl *Field = cast_or_null<FieldDecl>(
10855             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
10856         if (Field != D.getField())
10857           // Rebuild the expression when the transformed FieldDecl is
10858           // different to the already assigned FieldDecl.
10859           ExprChanged = true;
10860       } else {
10861         // Ensure that the designator expression is rebuilt when there isn't
10862         // a resolved FieldDecl in the designator as we don't want to assign
10863         // a FieldDecl to a pattern designator that will be instantiated again.
10864         ExprChanged = true;
10865       }
10866       continue;
10867     }
10868 
10869     if (D.isArrayDesignator()) {
10870       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
10871       if (Index.isInvalid())
10872         return ExprError();
10873 
10874       Desig.AddDesignator(
10875           Designator::getArray(Index.get(), D.getLBracketLoc()));
10876 
10877       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
10878       ArrayExprs.push_back(Index.get());
10879       continue;
10880     }
10881 
10882     assert(D.isArrayRangeDesignator() && "New kind of designator?");
10883     ExprResult Start
10884       = getDerived().TransformExpr(E->getArrayRangeStart(D));
10885     if (Start.isInvalid())
10886       return ExprError();
10887 
10888     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
10889     if (End.isInvalid())
10890       return ExprError();
10891 
10892     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
10893                                                   End.get(),
10894                                                   D.getLBracketLoc(),
10895                                                   D.getEllipsisLoc()));
10896 
10897     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
10898                   End.get() != E->getArrayRangeEnd(D);
10899 
10900     ArrayExprs.push_back(Start.get());
10901     ArrayExprs.push_back(End.get());
10902   }
10903 
10904   if (!getDerived().AlwaysRebuild() &&
10905       Init.get() == E->getInit() &&
10906       !ExprChanged)
10907     return E;
10908 
10909   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
10910                                                 E->getEqualOrColonLoc(),
10911                                                 E->usesGNUSyntax(), Init.get());
10912 }
10913 
10914 // Seems that if TransformInitListExpr() only works on the syntactic form of an
10915 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
10916 template<typename Derived>
10917 ExprResult
10918 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
10919     DesignatedInitUpdateExpr *E) {
10920   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
10921                    "initializer");
10922   return ExprError();
10923 }
10924 
10925 template<typename Derived>
10926 ExprResult
10927 TreeTransform<Derived>::TransformNoInitExpr(
10928     NoInitExpr *E) {
10929   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
10930   return ExprError();
10931 }
10932 
10933 template<typename Derived>
10934 ExprResult
10935 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
10936   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
10937   return ExprError();
10938 }
10939 
10940 template<typename Derived>
10941 ExprResult
10942 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
10943   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
10944   return ExprError();
10945 }
10946 
10947 template<typename Derived>
10948 ExprResult
10949 TreeTransform<Derived>::TransformImplicitValueInitExpr(
10950                                                      ImplicitValueInitExpr *E) {
10951   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
10952 
10953   // FIXME: Will we ever have proper type location here? Will we actually
10954   // need to transform the type?
10955   QualType T = getDerived().TransformType(E->getType());
10956   if (T.isNull())
10957     return ExprError();
10958 
10959   if (!getDerived().AlwaysRebuild() &&
10960       T == E->getType())
10961     return E;
10962 
10963   return getDerived().RebuildImplicitValueInitExpr(T);
10964 }
10965 
10966 template<typename Derived>
10967 ExprResult
10968 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
10969   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
10970   if (!TInfo)
10971     return ExprError();
10972 
10973   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10974   if (SubExpr.isInvalid())
10975     return ExprError();
10976 
10977   if (!getDerived().AlwaysRebuild() &&
10978       TInfo == E->getWrittenTypeInfo() &&
10979       SubExpr.get() == E->getSubExpr())
10980     return E;
10981 
10982   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
10983                                        TInfo, E->getRParenLoc());
10984 }
10985 
10986 template<typename Derived>
10987 ExprResult
10988 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
10989   bool ArgumentChanged = false;
10990   SmallVector<Expr*, 4> Inits;
10991   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
10992                      &ArgumentChanged))
10993     return ExprError();
10994 
10995   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
10996                                            Inits,
10997                                            E->getRParenLoc());
10998 }
10999 
11000 /// Transform an address-of-label expression.
11001 ///
11002 /// By default, the transformation of an address-of-label expression always
11003 /// rebuilds the expression, so that the label identifier can be resolved to
11004 /// the corresponding label statement by semantic analysis.
11005 template<typename Derived>
11006 ExprResult
11007 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
11008   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
11009                                         E->getLabel());
11010   if (!LD)
11011     return ExprError();
11012 
11013   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
11014                                            cast<LabelDecl>(LD));
11015 }
11016 
11017 template<typename Derived>
11018 ExprResult
11019 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
11020   SemaRef.ActOnStartStmtExpr();
11021   StmtResult SubStmt
11022     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
11023   if (SubStmt.isInvalid()) {
11024     SemaRef.ActOnStmtExprError();
11025     return ExprError();
11026   }
11027 
11028   unsigned OldDepth = E->getTemplateDepth();
11029   unsigned NewDepth = getDerived().TransformTemplateDepth(OldDepth);
11030 
11031   if (!getDerived().AlwaysRebuild() && OldDepth == NewDepth &&
11032       SubStmt.get() == E->getSubStmt()) {
11033     // Calling this an 'error' is unintuitive, but it does the right thing.
11034     SemaRef.ActOnStmtExprError();
11035     return SemaRef.MaybeBindToTemporary(E);
11036   }
11037 
11038   return getDerived().RebuildStmtExpr(E->getLParenLoc(), SubStmt.get(),
11039                                       E->getRParenLoc(), NewDepth);
11040 }
11041 
11042 template<typename Derived>
11043 ExprResult
11044 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
11045   ExprResult Cond = getDerived().TransformExpr(E->getCond());
11046   if (Cond.isInvalid())
11047     return ExprError();
11048 
11049   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
11050   if (LHS.isInvalid())
11051     return ExprError();
11052 
11053   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
11054   if (RHS.isInvalid())
11055     return ExprError();
11056 
11057   if (!getDerived().AlwaysRebuild() &&
11058       Cond.get() == E->getCond() &&
11059       LHS.get() == E->getLHS() &&
11060       RHS.get() == E->getRHS())
11061     return E;
11062 
11063   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
11064                                         Cond.get(), LHS.get(), RHS.get(),
11065                                         E->getRParenLoc());
11066 }
11067 
11068 template<typename Derived>
11069 ExprResult
11070 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
11071   return E;
11072 }
11073 
11074 template<typename Derived>
11075 ExprResult
11076 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
11077   switch (E->getOperator()) {
11078   case OO_New:
11079   case OO_Delete:
11080   case OO_Array_New:
11081   case OO_Array_Delete:
11082     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
11083 
11084   case OO_Call: {
11085     // This is a call to an object's operator().
11086     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
11087 
11088     // Transform the object itself.
11089     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
11090     if (Object.isInvalid())
11091       return ExprError();
11092 
11093     // FIXME: Poor location information
11094     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
11095         static_cast<Expr *>(Object.get())->getEndLoc());
11096 
11097     // Transform the call arguments.
11098     SmallVector<Expr*, 8> Args;
11099     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
11100                                     Args))
11101       return ExprError();
11102 
11103     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
11104                                         E->getEndLoc());
11105   }
11106 
11107 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
11108   case OO_##Name:
11109 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
11110 #include "clang/Basic/OperatorKinds.def"
11111   case OO_Subscript:
11112     // Handled below.
11113     break;
11114 
11115   case OO_Conditional:
11116     llvm_unreachable("conditional operator is not actually overloadable");
11117 
11118   case OO_None:
11119   case NUM_OVERLOADED_OPERATORS:
11120     llvm_unreachable("not an overloaded operator?");
11121   }
11122 
11123   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11124   if (Callee.isInvalid())
11125     return ExprError();
11126 
11127   ExprResult First;
11128   if (E->getOperator() == OO_Amp)
11129     First = getDerived().TransformAddressOfOperand(E->getArg(0));
11130   else
11131     First = getDerived().TransformExpr(E->getArg(0));
11132   if (First.isInvalid())
11133     return ExprError();
11134 
11135   ExprResult Second;
11136   if (E->getNumArgs() == 2) {
11137     Second = getDerived().TransformExpr(E->getArg(1));
11138     if (Second.isInvalid())
11139       return ExprError();
11140   }
11141 
11142   if (!getDerived().AlwaysRebuild() &&
11143       Callee.get() == E->getCallee() &&
11144       First.get() == E->getArg(0) &&
11145       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
11146     return SemaRef.MaybeBindToTemporary(E);
11147 
11148   Sema::FPFeaturesStateRAII FPFeaturesState(getSema());
11149   FPOptionsOverride NewOverrides(E->getFPFeatures());
11150   getSema().CurFPFeatures =
11151       NewOverrides.applyOverrides(getSema().getLangOpts());
11152   getSema().FpPragmaStack.CurrentValue = NewOverrides;
11153 
11154   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
11155                                                  E->getOperatorLoc(),
11156                                                  Callee.get(),
11157                                                  First.get(),
11158                                                  Second.get());
11159 }
11160 
11161 template<typename Derived>
11162 ExprResult
11163 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
11164   return getDerived().TransformCallExpr(E);
11165 }
11166 
11167 template <typename Derived>
11168 ExprResult TreeTransform<Derived>::TransformSourceLocExpr(SourceLocExpr *E) {
11169   bool NeedRebuildFunc = E->getIdentKind() == SourceLocExpr::Function &&
11170                          getSema().CurContext != E->getParentContext();
11171 
11172   if (!getDerived().AlwaysRebuild() && !NeedRebuildFunc)
11173     return E;
11174 
11175   return getDerived().RebuildSourceLocExpr(E->getIdentKind(), E->getBeginLoc(),
11176                                            E->getEndLoc(),
11177                                            getSema().CurContext);
11178 }
11179 
11180 template<typename Derived>
11181 ExprResult
11182 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
11183   // Transform the callee.
11184   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
11185   if (Callee.isInvalid())
11186     return ExprError();
11187 
11188   // Transform exec config.
11189   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
11190   if (EC.isInvalid())
11191     return ExprError();
11192 
11193   // Transform arguments.
11194   bool ArgChanged = false;
11195   SmallVector<Expr*, 8> Args;
11196   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11197                                   &ArgChanged))
11198     return ExprError();
11199 
11200   if (!getDerived().AlwaysRebuild() &&
11201       Callee.get() == E->getCallee() &&
11202       !ArgChanged)
11203     return SemaRef.MaybeBindToTemporary(E);
11204 
11205   // FIXME: Wrong source location information for the '('.
11206   SourceLocation FakeLParenLoc
11207     = ((Expr *)Callee.get())->getSourceRange().getBegin();
11208   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
11209                                       Args,
11210                                       E->getRParenLoc(), EC.get());
11211 }
11212 
11213 template<typename Derived>
11214 ExprResult
11215 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
11216   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
11217   if (!Type)
11218     return ExprError();
11219 
11220   ExprResult SubExpr
11221     = getDerived().TransformExpr(E->getSubExprAsWritten());
11222   if (SubExpr.isInvalid())
11223     return ExprError();
11224 
11225   if (!getDerived().AlwaysRebuild() &&
11226       Type == E->getTypeInfoAsWritten() &&
11227       SubExpr.get() == E->getSubExpr())
11228     return E;
11229   return getDerived().RebuildCXXNamedCastExpr(
11230       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
11231       Type, E->getAngleBrackets().getEnd(),
11232       // FIXME. this should be '(' location
11233       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
11234 }
11235 
11236 template<typename Derived>
11237 ExprResult
11238 TreeTransform<Derived>::TransformBuiltinBitCastExpr(BuiltinBitCastExpr *BCE) {
11239   TypeSourceInfo *TSI =
11240       getDerived().TransformType(BCE->getTypeInfoAsWritten());
11241   if (!TSI)
11242     return ExprError();
11243 
11244   ExprResult Sub = getDerived().TransformExpr(BCE->getSubExpr());
11245   if (Sub.isInvalid())
11246     return ExprError();
11247 
11248   return getDerived().RebuildBuiltinBitCastExpr(BCE->getBeginLoc(), TSI,
11249                                                 Sub.get(), BCE->getEndLoc());
11250 }
11251 
11252 template<typename Derived>
11253 ExprResult
11254 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
11255   return getDerived().TransformCXXNamedCastExpr(E);
11256 }
11257 
11258 template<typename Derived>
11259 ExprResult
11260 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
11261   return getDerived().TransformCXXNamedCastExpr(E);
11262 }
11263 
11264 template<typename Derived>
11265 ExprResult
11266 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
11267                                                       CXXReinterpretCastExpr *E) {
11268   return getDerived().TransformCXXNamedCastExpr(E);
11269 }
11270 
11271 template<typename Derived>
11272 ExprResult
11273 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
11274   return getDerived().TransformCXXNamedCastExpr(E);
11275 }
11276 
11277 template<typename Derived>
11278 ExprResult
11279 TreeTransform<Derived>::TransformCXXAddrspaceCastExpr(CXXAddrspaceCastExpr *E) {
11280   return getDerived().TransformCXXNamedCastExpr(E);
11281 }
11282 
11283 template<typename Derived>
11284 ExprResult
11285 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
11286                                                      CXXFunctionalCastExpr *E) {
11287   TypeSourceInfo *Type =
11288       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
11289   if (!Type)
11290     return ExprError();
11291 
11292   ExprResult SubExpr
11293     = getDerived().TransformExpr(E->getSubExprAsWritten());
11294   if (SubExpr.isInvalid())
11295     return ExprError();
11296 
11297   if (!getDerived().AlwaysRebuild() &&
11298       Type == E->getTypeInfoAsWritten() &&
11299       SubExpr.get() == E->getSubExpr())
11300     return E;
11301 
11302   return getDerived().RebuildCXXFunctionalCastExpr(Type,
11303                                                    E->getLParenLoc(),
11304                                                    SubExpr.get(),
11305                                                    E->getRParenLoc(),
11306                                                    E->isListInitialization());
11307 }
11308 
11309 template<typename Derived>
11310 ExprResult
11311 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
11312   if (E->isTypeOperand()) {
11313     TypeSourceInfo *TInfo
11314       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11315     if (!TInfo)
11316       return ExprError();
11317 
11318     if (!getDerived().AlwaysRebuild() &&
11319         TInfo == E->getTypeOperandSourceInfo())
11320       return E;
11321 
11322     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11323                                              TInfo, E->getEndLoc());
11324   }
11325 
11326   // We don't know whether the subexpression is potentially evaluated until
11327   // after we perform semantic analysis.  We speculatively assume it is
11328   // unevaluated; it will get fixed later if the subexpression is in fact
11329   // potentially evaluated.
11330   EnterExpressionEvaluationContext Unevaluated(
11331       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
11332       Sema::ReuseLambdaContextDecl);
11333 
11334   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11335   if (SubExpr.isInvalid())
11336     return ExprError();
11337 
11338   if (!getDerived().AlwaysRebuild() &&
11339       SubExpr.get() == E->getExprOperand())
11340     return E;
11341 
11342   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
11343                                            SubExpr.get(), E->getEndLoc());
11344 }
11345 
11346 template<typename Derived>
11347 ExprResult
11348 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
11349   if (E->isTypeOperand()) {
11350     TypeSourceInfo *TInfo
11351       = getDerived().TransformType(E->getTypeOperandSourceInfo());
11352     if (!TInfo)
11353       return ExprError();
11354 
11355     if (!getDerived().AlwaysRebuild() &&
11356         TInfo == E->getTypeOperandSourceInfo())
11357       return E;
11358 
11359     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11360                                              TInfo, E->getEndLoc());
11361   }
11362 
11363   EnterExpressionEvaluationContext Unevaluated(
11364       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11365 
11366   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
11367   if (SubExpr.isInvalid())
11368     return ExprError();
11369 
11370   if (!getDerived().AlwaysRebuild() &&
11371       SubExpr.get() == E->getExprOperand())
11372     return E;
11373 
11374   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
11375                                            SubExpr.get(), E->getEndLoc());
11376 }
11377 
11378 template<typename Derived>
11379 ExprResult
11380 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
11381   return E;
11382 }
11383 
11384 template<typename Derived>
11385 ExprResult
11386 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
11387                                                      CXXNullPtrLiteralExpr *E) {
11388   return E;
11389 }
11390 
11391 template<typename Derived>
11392 ExprResult
11393 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
11394   QualType T = getSema().getCurrentThisType();
11395 
11396   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
11397     // Mark it referenced in the new context regardless.
11398     // FIXME: this is a bit instantiation-specific.
11399     getSema().MarkThisReferenced(E);
11400     return E;
11401   }
11402 
11403   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
11404 }
11405 
11406 template<typename Derived>
11407 ExprResult
11408 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
11409   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11410   if (SubExpr.isInvalid())
11411     return ExprError();
11412 
11413   if (!getDerived().AlwaysRebuild() &&
11414       SubExpr.get() == E->getSubExpr())
11415     return E;
11416 
11417   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
11418                                           E->isThrownVariableInScope());
11419 }
11420 
11421 template<typename Derived>
11422 ExprResult
11423 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
11424   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
11425       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
11426   if (!Param)
11427     return ExprError();
11428 
11429   if (!getDerived().AlwaysRebuild() && Param == E->getParam() &&
11430       E->getUsedContext() == SemaRef.CurContext)
11431     return E;
11432 
11433   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
11434 }
11435 
11436 template<typename Derived>
11437 ExprResult
11438 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
11439   FieldDecl *Field = cast_or_null<FieldDecl>(
11440       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
11441   if (!Field)
11442     return ExprError();
11443 
11444   if (!getDerived().AlwaysRebuild() && Field == E->getField() &&
11445       E->getUsedContext() == SemaRef.CurContext)
11446     return E;
11447 
11448   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
11449 }
11450 
11451 template<typename Derived>
11452 ExprResult
11453 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
11454                                                     CXXScalarValueInitExpr *E) {
11455   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
11456   if (!T)
11457     return ExprError();
11458 
11459   if (!getDerived().AlwaysRebuild() &&
11460       T == E->getTypeSourceInfo())
11461     return E;
11462 
11463   return getDerived().RebuildCXXScalarValueInitExpr(T,
11464                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
11465                                                     E->getRParenLoc());
11466 }
11467 
11468 template<typename Derived>
11469 ExprResult
11470 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
11471   // Transform the type that we're allocating
11472   TypeSourceInfo *AllocTypeInfo =
11473       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
11474   if (!AllocTypeInfo)
11475     return ExprError();
11476 
11477   // Transform the size of the array we're allocating (if any).
11478   Optional<Expr *> ArraySize;
11479   if (Optional<Expr *> OldArraySize = E->getArraySize()) {
11480     ExprResult NewArraySize;
11481     if (*OldArraySize) {
11482       NewArraySize = getDerived().TransformExpr(*OldArraySize);
11483       if (NewArraySize.isInvalid())
11484         return ExprError();
11485     }
11486     ArraySize = NewArraySize.get();
11487   }
11488 
11489   // Transform the placement arguments (if any).
11490   bool ArgumentChanged = false;
11491   SmallVector<Expr*, 8> PlacementArgs;
11492   if (getDerived().TransformExprs(E->getPlacementArgs(),
11493                                   E->getNumPlacementArgs(), true,
11494                                   PlacementArgs, &ArgumentChanged))
11495     return ExprError();
11496 
11497   // Transform the initializer (if any).
11498   Expr *OldInit = E->getInitializer();
11499   ExprResult NewInit;
11500   if (OldInit)
11501     NewInit = getDerived().TransformInitializer(OldInit, true);
11502   if (NewInit.isInvalid())
11503     return ExprError();
11504 
11505   // Transform new operator and delete operator.
11506   FunctionDecl *OperatorNew = nullptr;
11507   if (E->getOperatorNew()) {
11508     OperatorNew = cast_or_null<FunctionDecl>(
11509         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
11510     if (!OperatorNew)
11511       return ExprError();
11512   }
11513 
11514   FunctionDecl *OperatorDelete = nullptr;
11515   if (E->getOperatorDelete()) {
11516     OperatorDelete = cast_or_null<FunctionDecl>(
11517         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11518     if (!OperatorDelete)
11519       return ExprError();
11520   }
11521 
11522   if (!getDerived().AlwaysRebuild() &&
11523       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
11524       ArraySize == E->getArraySize() &&
11525       NewInit.get() == OldInit &&
11526       OperatorNew == E->getOperatorNew() &&
11527       OperatorDelete == E->getOperatorDelete() &&
11528       !ArgumentChanged) {
11529     // Mark any declarations we need as referenced.
11530     // FIXME: instantiation-specific.
11531     if (OperatorNew)
11532       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
11533     if (OperatorDelete)
11534       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11535 
11536     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
11537       QualType ElementType
11538         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
11539       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
11540         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
11541         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
11542           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
11543         }
11544       }
11545     }
11546 
11547     return E;
11548   }
11549 
11550   QualType AllocType = AllocTypeInfo->getType();
11551   if (!ArraySize) {
11552     // If no array size was specified, but the new expression was
11553     // instantiated with an array type (e.g., "new T" where T is
11554     // instantiated with "int[4]"), extract the outer bound from the
11555     // array type as our array size. We do this with constant and
11556     // dependently-sized array types.
11557     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
11558     if (!ArrayT) {
11559       // Do nothing
11560     } else if (const ConstantArrayType *ConsArrayT
11561                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
11562       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
11563                                          SemaRef.Context.getSizeType(),
11564                                          /*FIXME:*/ E->getBeginLoc());
11565       AllocType = ConsArrayT->getElementType();
11566     } else if (const DependentSizedArrayType *DepArrayT
11567                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
11568       if (DepArrayT->getSizeExpr()) {
11569         ArraySize = DepArrayT->getSizeExpr();
11570         AllocType = DepArrayT->getElementType();
11571       }
11572     }
11573   }
11574 
11575   return getDerived().RebuildCXXNewExpr(
11576       E->getBeginLoc(), E->isGlobalNew(),
11577       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
11578       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
11579       AllocTypeInfo, ArraySize, E->getDirectInitRange(), NewInit.get());
11580 }
11581 
11582 template<typename Derived>
11583 ExprResult
11584 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
11585   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
11586   if (Operand.isInvalid())
11587     return ExprError();
11588 
11589   // Transform the delete operator, if known.
11590   FunctionDecl *OperatorDelete = nullptr;
11591   if (E->getOperatorDelete()) {
11592     OperatorDelete = cast_or_null<FunctionDecl>(
11593         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
11594     if (!OperatorDelete)
11595       return ExprError();
11596   }
11597 
11598   if (!getDerived().AlwaysRebuild() &&
11599       Operand.get() == E->getArgument() &&
11600       OperatorDelete == E->getOperatorDelete()) {
11601     // Mark any declarations we need as referenced.
11602     // FIXME: instantiation-specific.
11603     if (OperatorDelete)
11604       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
11605 
11606     if (!E->getArgument()->isTypeDependent()) {
11607       QualType Destroyed = SemaRef.Context.getBaseElementType(
11608                                                          E->getDestroyedType());
11609       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
11610         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
11611         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
11612                                        SemaRef.LookupDestructor(Record));
11613       }
11614     }
11615 
11616     return E;
11617   }
11618 
11619   return getDerived().RebuildCXXDeleteExpr(
11620       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
11621 }
11622 
11623 template<typename Derived>
11624 ExprResult
11625 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
11626                                                      CXXPseudoDestructorExpr *E) {
11627   ExprResult Base = getDerived().TransformExpr(E->getBase());
11628   if (Base.isInvalid())
11629     return ExprError();
11630 
11631   ParsedType ObjectTypePtr;
11632   bool MayBePseudoDestructor = false;
11633   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11634                                               E->getOperatorLoc(),
11635                                         E->isArrow()? tok::arrow : tok::period,
11636                                               ObjectTypePtr,
11637                                               MayBePseudoDestructor);
11638   if (Base.isInvalid())
11639     return ExprError();
11640 
11641   QualType ObjectType = ObjectTypePtr.get();
11642   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
11643   if (QualifierLoc) {
11644     QualifierLoc
11645       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
11646     if (!QualifierLoc)
11647       return ExprError();
11648   }
11649   CXXScopeSpec SS;
11650   SS.Adopt(QualifierLoc);
11651 
11652   PseudoDestructorTypeStorage Destroyed;
11653   if (E->getDestroyedTypeInfo()) {
11654     TypeSourceInfo *DestroyedTypeInfo
11655       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
11656                                                 ObjectType, nullptr, SS);
11657     if (!DestroyedTypeInfo)
11658       return ExprError();
11659     Destroyed = DestroyedTypeInfo;
11660   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
11661     // We aren't likely to be able to resolve the identifier down to a type
11662     // now anyway, so just retain the identifier.
11663     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
11664                                             E->getDestroyedTypeLoc());
11665   } else {
11666     // Look for a destructor known with the given name.
11667     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
11668                                               *E->getDestroyedTypeIdentifier(),
11669                                                 E->getDestroyedTypeLoc(),
11670                                                 /*Scope=*/nullptr,
11671                                                 SS, ObjectTypePtr,
11672                                                 false);
11673     if (!T)
11674       return ExprError();
11675 
11676     Destroyed
11677       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
11678                                                  E->getDestroyedTypeLoc());
11679   }
11680 
11681   TypeSourceInfo *ScopeTypeInfo = nullptr;
11682   if (E->getScopeTypeInfo()) {
11683     CXXScopeSpec EmptySS;
11684     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
11685                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
11686     if (!ScopeTypeInfo)
11687       return ExprError();
11688   }
11689 
11690   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
11691                                                      E->getOperatorLoc(),
11692                                                      E->isArrow(),
11693                                                      SS,
11694                                                      ScopeTypeInfo,
11695                                                      E->getColonColonLoc(),
11696                                                      E->getTildeLoc(),
11697                                                      Destroyed);
11698 }
11699 
11700 template <typename Derived>
11701 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
11702                                                         bool RequiresADL,
11703                                                         LookupResult &R) {
11704   // Transform all the decls.
11705   bool AllEmptyPacks = true;
11706   for (auto *OldD : Old->decls()) {
11707     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
11708     if (!InstD) {
11709       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
11710       // This can happen because of dependent hiding.
11711       if (isa<UsingShadowDecl>(OldD))
11712         continue;
11713       else {
11714         R.clear();
11715         return true;
11716       }
11717     }
11718 
11719     // Expand using pack declarations.
11720     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
11721     ArrayRef<NamedDecl*> Decls = SingleDecl;
11722     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
11723       Decls = UPD->expansions();
11724 
11725     // Expand using declarations.
11726     for (auto *D : Decls) {
11727       if (auto *UD = dyn_cast<UsingDecl>(D)) {
11728         for (auto *SD : UD->shadows())
11729           R.addDecl(SD);
11730       } else {
11731         R.addDecl(D);
11732       }
11733     }
11734 
11735     AllEmptyPacks &= Decls.empty();
11736   };
11737 
11738   // C++ [temp.res]/8.4.2:
11739   //   The program is ill-formed, no diagnostic required, if [...] lookup for
11740   //   a name in the template definition found a using-declaration, but the
11741   //   lookup in the corresponding scope in the instantiation odoes not find
11742   //   any declarations because the using-declaration was a pack expansion and
11743   //   the corresponding pack is empty
11744   if (AllEmptyPacks && !RequiresADL) {
11745     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
11746         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
11747     return true;
11748   }
11749 
11750   // Resolve a kind, but don't do any further analysis.  If it's
11751   // ambiguous, the callee needs to deal with it.
11752   R.resolveKind();
11753   return false;
11754 }
11755 
11756 template<typename Derived>
11757 ExprResult
11758 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
11759                                                   UnresolvedLookupExpr *Old) {
11760   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
11761                  Sema::LookupOrdinaryName);
11762 
11763   // Transform the declaration set.
11764   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
11765     return ExprError();
11766 
11767   // Rebuild the nested-name qualifier, if present.
11768   CXXScopeSpec SS;
11769   if (Old->getQualifierLoc()) {
11770     NestedNameSpecifierLoc QualifierLoc
11771       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11772     if (!QualifierLoc)
11773       return ExprError();
11774 
11775     SS.Adopt(QualifierLoc);
11776   }
11777 
11778   if (Old->getNamingClass()) {
11779     CXXRecordDecl *NamingClass
11780       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11781                                                             Old->getNameLoc(),
11782                                                         Old->getNamingClass()));
11783     if (!NamingClass) {
11784       R.clear();
11785       return ExprError();
11786     }
11787 
11788     R.setNamingClass(NamingClass);
11789   }
11790 
11791   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11792 
11793   // If we have neither explicit template arguments, nor the template keyword,
11794   // it's a normal declaration name or member reference.
11795   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
11796     NamedDecl *D = R.getAsSingle<NamedDecl>();
11797     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
11798     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
11799     // give a good diagnostic.
11800     if (D && D->isCXXInstanceMember()) {
11801       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
11802                                                      /*TemplateArgs=*/nullptr,
11803                                                      /*Scope=*/nullptr);
11804     }
11805 
11806     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
11807   }
11808 
11809   // If we have template arguments, rebuild them, then rebuild the
11810   // templateid expression.
11811   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
11812   if (Old->hasExplicitTemplateArgs() &&
11813       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11814                                               Old->getNumTemplateArgs(),
11815                                               TransArgs)) {
11816     R.clear();
11817     return ExprError();
11818   }
11819 
11820   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
11821                                             Old->requiresADL(), &TransArgs);
11822 }
11823 
11824 template<typename Derived>
11825 ExprResult
11826 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
11827   bool ArgChanged = false;
11828   SmallVector<TypeSourceInfo *, 4> Args;
11829   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
11830     TypeSourceInfo *From = E->getArg(I);
11831     TypeLoc FromTL = From->getTypeLoc();
11832     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
11833       TypeLocBuilder TLB;
11834       TLB.reserve(FromTL.getFullDataSize());
11835       QualType To = getDerived().TransformType(TLB, FromTL);
11836       if (To.isNull())
11837         return ExprError();
11838 
11839       if (To == From->getType())
11840         Args.push_back(From);
11841       else {
11842         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11843         ArgChanged = true;
11844       }
11845       continue;
11846     }
11847 
11848     ArgChanged = true;
11849 
11850     // We have a pack expansion. Instantiate it.
11851     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
11852     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
11853     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11854     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
11855 
11856     // Determine whether the set of unexpanded parameter packs can and should
11857     // be expanded.
11858     bool Expand = true;
11859     bool RetainExpansion = false;
11860     Optional<unsigned> OrigNumExpansions =
11861         ExpansionTL.getTypePtr()->getNumExpansions();
11862     Optional<unsigned> NumExpansions = OrigNumExpansions;
11863     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
11864                                              PatternTL.getSourceRange(),
11865                                              Unexpanded,
11866                                              Expand, RetainExpansion,
11867                                              NumExpansions))
11868       return ExprError();
11869 
11870     if (!Expand) {
11871       // The transform has determined that we should perform a simple
11872       // transformation on the pack expansion, producing another pack
11873       // expansion.
11874       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11875 
11876       TypeLocBuilder TLB;
11877       TLB.reserve(From->getTypeLoc().getFullDataSize());
11878 
11879       QualType To = getDerived().TransformType(TLB, PatternTL);
11880       if (To.isNull())
11881         return ExprError();
11882 
11883       To = getDerived().RebuildPackExpansionType(To,
11884                                                  PatternTL.getSourceRange(),
11885                                                  ExpansionTL.getEllipsisLoc(),
11886                                                  NumExpansions);
11887       if (To.isNull())
11888         return ExprError();
11889 
11890       PackExpansionTypeLoc ToExpansionTL
11891         = TLB.push<PackExpansionTypeLoc>(To);
11892       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11893       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11894       continue;
11895     }
11896 
11897     // Expand the pack expansion by substituting for each argument in the
11898     // pack(s).
11899     for (unsigned I = 0; I != *NumExpansions; ++I) {
11900       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
11901       TypeLocBuilder TLB;
11902       TLB.reserve(PatternTL.getFullDataSize());
11903       QualType To = getDerived().TransformType(TLB, PatternTL);
11904       if (To.isNull())
11905         return ExprError();
11906 
11907       if (To->containsUnexpandedParameterPack()) {
11908         To = getDerived().RebuildPackExpansionType(To,
11909                                                    PatternTL.getSourceRange(),
11910                                                    ExpansionTL.getEllipsisLoc(),
11911                                                    NumExpansions);
11912         if (To.isNull())
11913           return ExprError();
11914 
11915         PackExpansionTypeLoc ToExpansionTL
11916           = TLB.push<PackExpansionTypeLoc>(To);
11917         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11918       }
11919 
11920       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11921     }
11922 
11923     if (!RetainExpansion)
11924       continue;
11925 
11926     // If we're supposed to retain a pack expansion, do so by temporarily
11927     // forgetting the partially-substituted parameter pack.
11928     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11929 
11930     TypeLocBuilder TLB;
11931     TLB.reserve(From->getTypeLoc().getFullDataSize());
11932 
11933     QualType To = getDerived().TransformType(TLB, PatternTL);
11934     if (To.isNull())
11935       return ExprError();
11936 
11937     To = getDerived().RebuildPackExpansionType(To,
11938                                                PatternTL.getSourceRange(),
11939                                                ExpansionTL.getEllipsisLoc(),
11940                                                NumExpansions);
11941     if (To.isNull())
11942       return ExprError();
11943 
11944     PackExpansionTypeLoc ToExpansionTL
11945       = TLB.push<PackExpansionTypeLoc>(To);
11946     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
11947     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
11948   }
11949 
11950   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11951     return E;
11952 
11953   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
11954                                        E->getEndLoc());
11955 }
11956 
11957 template<typename Derived>
11958 ExprResult
11959 TreeTransform<Derived>::TransformConceptSpecializationExpr(
11960                                                  ConceptSpecializationExpr *E) {
11961   const ASTTemplateArgumentListInfo *Old = E->getTemplateArgsAsWritten();
11962   TemplateArgumentListInfo TransArgs(Old->LAngleLoc, Old->RAngleLoc);
11963   if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11964                                               Old->NumTemplateArgs, TransArgs))
11965     return ExprError();
11966 
11967   return getDerived().RebuildConceptSpecializationExpr(
11968       E->getNestedNameSpecifierLoc(), E->getTemplateKWLoc(),
11969       E->getConceptNameInfo(), E->getFoundDecl(), E->getNamedConcept(),
11970       &TransArgs);
11971 }
11972 
11973 template<typename Derived>
11974 ExprResult
11975 TreeTransform<Derived>::TransformRequiresExpr(RequiresExpr *E) {
11976   SmallVector<ParmVarDecl*, 4> TransParams;
11977   SmallVector<QualType, 4> TransParamTypes;
11978   Sema::ExtParameterInfoBuilder ExtParamInfos;
11979 
11980   // C++2a [expr.prim.req]p2
11981   // Expressions appearing within a requirement-body are unevaluated operands.
11982   EnterExpressionEvaluationContext Ctx(
11983       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11984 
11985   RequiresExprBodyDecl *Body = RequiresExprBodyDecl::Create(
11986       getSema().Context, getSema().CurContext,
11987       E->getBody()->getBeginLoc());
11988 
11989   Sema::ContextRAII SavedContext(getSema(), Body, /*NewThisContext*/false);
11990 
11991   if (getDerived().TransformFunctionTypeParams(E->getRequiresKWLoc(),
11992                                                E->getLocalParameters(),
11993                                                /*ParamTypes=*/nullptr,
11994                                                /*ParamInfos=*/nullptr,
11995                                                TransParamTypes, &TransParams,
11996                                                ExtParamInfos))
11997     return ExprError();
11998 
11999   for (ParmVarDecl *Param : TransParams)
12000     Param->setDeclContext(Body);
12001 
12002   SmallVector<concepts::Requirement *, 4> TransReqs;
12003   if (getDerived().TransformRequiresExprRequirements(E->getRequirements(),
12004                                                      TransReqs))
12005     return ExprError();
12006 
12007   for (concepts::Requirement *Req : TransReqs) {
12008     if (auto *ER = dyn_cast<concepts::ExprRequirement>(Req)) {
12009       if (ER->getReturnTypeRequirement().isTypeConstraint()) {
12010         ER->getReturnTypeRequirement()
12011                 .getTypeConstraintTemplateParameterList()->getParam(0)
12012                 ->setDeclContext(Body);
12013       }
12014     }
12015   }
12016 
12017   return getDerived().RebuildRequiresExpr(E->getRequiresKWLoc(), Body,
12018                                           TransParams, TransReqs,
12019                                           E->getRBraceLoc());
12020 }
12021 
12022 template<typename Derived>
12023 bool TreeTransform<Derived>::TransformRequiresExprRequirements(
12024     ArrayRef<concepts::Requirement *> Reqs,
12025     SmallVectorImpl<concepts::Requirement *> &Transformed) {
12026   for (concepts::Requirement *Req : Reqs) {
12027     concepts::Requirement *TransReq = nullptr;
12028     if (auto *TypeReq = dyn_cast<concepts::TypeRequirement>(Req))
12029       TransReq = getDerived().TransformTypeRequirement(TypeReq);
12030     else if (auto *ExprReq = dyn_cast<concepts::ExprRequirement>(Req))
12031       TransReq = getDerived().TransformExprRequirement(ExprReq);
12032     else
12033       TransReq = getDerived().TransformNestedRequirement(
12034                      cast<concepts::NestedRequirement>(Req));
12035     if (!TransReq)
12036       return true;
12037     Transformed.push_back(TransReq);
12038   }
12039   return false;
12040 }
12041 
12042 template<typename Derived>
12043 concepts::TypeRequirement *
12044 TreeTransform<Derived>::TransformTypeRequirement(
12045     concepts::TypeRequirement *Req) {
12046   if (Req->isSubstitutionFailure()) {
12047     if (getDerived().AlwaysRebuild())
12048       return getDerived().RebuildTypeRequirement(
12049               Req->getSubstitutionDiagnostic());
12050     return Req;
12051   }
12052   TypeSourceInfo *TransType = getDerived().TransformType(Req->getType());
12053   if (!TransType)
12054     return nullptr;
12055   return getDerived().RebuildTypeRequirement(TransType);
12056 }
12057 
12058 template<typename Derived>
12059 concepts::ExprRequirement *
12060 TreeTransform<Derived>::TransformExprRequirement(concepts::ExprRequirement *Req) {
12061   llvm::PointerUnion<Expr *, concepts::Requirement::SubstitutionDiagnostic *> TransExpr;
12062   if (Req->isExprSubstitutionFailure())
12063     TransExpr = Req->getExprSubstitutionDiagnostic();
12064   else {
12065     ExprResult TransExprRes = getDerived().TransformExpr(Req->getExpr());
12066     if (TransExprRes.isInvalid())
12067       return nullptr;
12068     TransExpr = TransExprRes.get();
12069   }
12070 
12071   llvm::Optional<concepts::ExprRequirement::ReturnTypeRequirement> TransRetReq;
12072   const auto &RetReq = Req->getReturnTypeRequirement();
12073   if (RetReq.isEmpty())
12074     TransRetReq.emplace();
12075   else if (RetReq.isSubstitutionFailure())
12076     TransRetReq.emplace(RetReq.getSubstitutionDiagnostic());
12077   else if (RetReq.isTypeConstraint()) {
12078     TemplateParameterList *OrigTPL =
12079         RetReq.getTypeConstraintTemplateParameterList();
12080     TemplateParameterList *TPL =
12081         getDerived().TransformTemplateParameterList(OrigTPL);
12082     if (!TPL)
12083       return nullptr;
12084     TransRetReq.emplace(TPL);
12085   }
12086   assert(TransRetReq.hasValue() &&
12087          "All code paths leading here must set TransRetReq");
12088   if (Expr *E = TransExpr.dyn_cast<Expr *>())
12089     return getDerived().RebuildExprRequirement(E, Req->isSimple(),
12090                                                Req->getNoexceptLoc(),
12091                                                std::move(*TransRetReq));
12092   return getDerived().RebuildExprRequirement(
12093       TransExpr.get<concepts::Requirement::SubstitutionDiagnostic *>(),
12094       Req->isSimple(), Req->getNoexceptLoc(), std::move(*TransRetReq));
12095 }
12096 
12097 template<typename Derived>
12098 concepts::NestedRequirement *
12099 TreeTransform<Derived>::TransformNestedRequirement(
12100     concepts::NestedRequirement *Req) {
12101   if (Req->isSubstitutionFailure()) {
12102     if (getDerived().AlwaysRebuild())
12103       return getDerived().RebuildNestedRequirement(
12104           Req->getSubstitutionDiagnostic());
12105     return Req;
12106   }
12107   ExprResult TransConstraint =
12108       getDerived().TransformExpr(Req->getConstraintExpr());
12109   if (TransConstraint.isInvalid())
12110     return nullptr;
12111   return getDerived().RebuildNestedRequirement(TransConstraint.get());
12112 }
12113 
12114 template<typename Derived>
12115 ExprResult
12116 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
12117   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
12118   if (!T)
12119     return ExprError();
12120 
12121   if (!getDerived().AlwaysRebuild() &&
12122       T == E->getQueriedTypeSourceInfo())
12123     return E;
12124 
12125   ExprResult SubExpr;
12126   {
12127     EnterExpressionEvaluationContext Unevaluated(
12128         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12129     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
12130     if (SubExpr.isInvalid())
12131       return ExprError();
12132 
12133     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
12134       return E;
12135   }
12136 
12137   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
12138                                             SubExpr.get(), E->getEndLoc());
12139 }
12140 
12141 template<typename Derived>
12142 ExprResult
12143 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
12144   ExprResult SubExpr;
12145   {
12146     EnterExpressionEvaluationContext Unevaluated(
12147         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12148     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
12149     if (SubExpr.isInvalid())
12150       return ExprError();
12151 
12152     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
12153       return E;
12154   }
12155 
12156   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
12157                                              SubExpr.get(), E->getEndLoc());
12158 }
12159 
12160 template <typename Derived>
12161 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
12162     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
12163     TypeSourceInfo **RecoveryTSI) {
12164   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
12165       DRE, AddrTaken, RecoveryTSI);
12166 
12167   // Propagate both errors and recovered types, which return ExprEmpty.
12168   if (!NewDRE.isUsable())
12169     return NewDRE;
12170 
12171   // We got an expr, wrap it up in parens.
12172   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
12173     return PE;
12174   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
12175                                        PE->getRParen());
12176 }
12177 
12178 template <typename Derived>
12179 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12180     DependentScopeDeclRefExpr *E) {
12181   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
12182                                             nullptr);
12183 }
12184 
12185 template<typename Derived>
12186 ExprResult
12187 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
12188                                                DependentScopeDeclRefExpr *E,
12189                                                bool IsAddressOfOperand,
12190                                                TypeSourceInfo **RecoveryTSI) {
12191   assert(E->getQualifierLoc());
12192   NestedNameSpecifierLoc QualifierLoc
12193   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
12194   if (!QualifierLoc)
12195     return ExprError();
12196   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12197 
12198   // TODO: If this is a conversion-function-id, verify that the
12199   // destination type name (if present) resolves the same way after
12200   // instantiation as it did in the local scope.
12201 
12202   DeclarationNameInfo NameInfo
12203     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
12204   if (!NameInfo.getName())
12205     return ExprError();
12206 
12207   if (!E->hasExplicitTemplateArgs()) {
12208     if (!getDerived().AlwaysRebuild() &&
12209         QualifierLoc == E->getQualifierLoc() &&
12210         // Note: it is sufficient to compare the Name component of NameInfo:
12211         // if name has not changed, DNLoc has not changed either.
12212         NameInfo.getName() == E->getDeclName())
12213       return E;
12214 
12215     return getDerived().RebuildDependentScopeDeclRefExpr(
12216         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
12217         IsAddressOfOperand, RecoveryTSI);
12218   }
12219 
12220   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12221   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12222                                               E->getNumTemplateArgs(),
12223                                               TransArgs))
12224     return ExprError();
12225 
12226   return getDerived().RebuildDependentScopeDeclRefExpr(
12227       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
12228       RecoveryTSI);
12229 }
12230 
12231 template<typename Derived>
12232 ExprResult
12233 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
12234   // CXXConstructExprs other than for list-initialization and
12235   // CXXTemporaryObjectExpr are always implicit, so when we have
12236   // a 1-argument construction we just transform that argument.
12237   if (getDerived().AllowSkippingCXXConstructExpr() &&
12238       ((E->getNumArgs() == 1 ||
12239         (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
12240        (!getDerived().DropCallArgument(E->getArg(0))) &&
12241        !E->isListInitialization()))
12242     return getDerived().TransformExpr(E->getArg(0));
12243 
12244   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
12245 
12246   QualType T = getDerived().TransformType(E->getType());
12247   if (T.isNull())
12248     return ExprError();
12249 
12250   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12251       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12252   if (!Constructor)
12253     return ExprError();
12254 
12255   bool ArgumentChanged = false;
12256   SmallVector<Expr*, 8> Args;
12257   {
12258     EnterExpressionEvaluationContext Context(
12259         getSema(), EnterExpressionEvaluationContext::InitList,
12260         E->isListInitialization());
12261     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12262                                     &ArgumentChanged))
12263       return ExprError();
12264   }
12265 
12266   if (!getDerived().AlwaysRebuild() &&
12267       T == E->getType() &&
12268       Constructor == E->getConstructor() &&
12269       !ArgumentChanged) {
12270     // Mark the constructor as referenced.
12271     // FIXME: Instantiation-specific
12272     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12273     return E;
12274   }
12275 
12276   return getDerived().RebuildCXXConstructExpr(
12277       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
12278       E->hadMultipleCandidates(), E->isListInitialization(),
12279       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
12280       E->getConstructionKind(), E->getParenOrBraceRange());
12281 }
12282 
12283 template<typename Derived>
12284 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
12285     CXXInheritedCtorInitExpr *E) {
12286   QualType T = getDerived().TransformType(E->getType());
12287   if (T.isNull())
12288     return ExprError();
12289 
12290   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12291       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12292   if (!Constructor)
12293     return ExprError();
12294 
12295   if (!getDerived().AlwaysRebuild() &&
12296       T == E->getType() &&
12297       Constructor == E->getConstructor()) {
12298     // Mark the constructor as referenced.
12299     // FIXME: Instantiation-specific
12300     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12301     return E;
12302   }
12303 
12304   return getDerived().RebuildCXXInheritedCtorInitExpr(
12305       T, E->getLocation(), Constructor,
12306       E->constructsVBase(), E->inheritedFromVBase());
12307 }
12308 
12309 /// Transform a C++ temporary-binding expression.
12310 ///
12311 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
12312 /// transform the subexpression and return that.
12313 template<typename Derived>
12314 ExprResult
12315 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
12316   return getDerived().TransformExpr(E->getSubExpr());
12317 }
12318 
12319 /// Transform a C++ expression that contains cleanups that should
12320 /// be run after the expression is evaluated.
12321 ///
12322 /// Since ExprWithCleanups nodes are implicitly generated, we
12323 /// just transform the subexpression and return that.
12324 template<typename Derived>
12325 ExprResult
12326 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
12327   return getDerived().TransformExpr(E->getSubExpr());
12328 }
12329 
12330 template<typename Derived>
12331 ExprResult
12332 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
12333                                                     CXXTemporaryObjectExpr *E) {
12334   TypeSourceInfo *T =
12335       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12336   if (!T)
12337     return ExprError();
12338 
12339   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
12340       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
12341   if (!Constructor)
12342     return ExprError();
12343 
12344   bool ArgumentChanged = false;
12345   SmallVector<Expr*, 8> Args;
12346   Args.reserve(E->getNumArgs());
12347   {
12348     EnterExpressionEvaluationContext Context(
12349         getSema(), EnterExpressionEvaluationContext::InitList,
12350         E->isListInitialization());
12351     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
12352                        &ArgumentChanged))
12353       return ExprError();
12354   }
12355 
12356   if (!getDerived().AlwaysRebuild() &&
12357       T == E->getTypeSourceInfo() &&
12358       Constructor == E->getConstructor() &&
12359       !ArgumentChanged) {
12360     // FIXME: Instantiation-specific
12361     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
12362     return SemaRef.MaybeBindToTemporary(E);
12363   }
12364 
12365   // FIXME: We should just pass E->isListInitialization(), but we're not
12366   // prepared to handle list-initialization without a child InitListExpr.
12367   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
12368   return getDerived().RebuildCXXTemporaryObjectExpr(
12369       T, LParenLoc, Args, E->getEndLoc(),
12370       /*ListInitialization=*/LParenLoc.isInvalid());
12371 }
12372 
12373 template<typename Derived>
12374 ExprResult
12375 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
12376   // Transform any init-capture expressions before entering the scope of the
12377   // lambda body, because they are not semantically within that scope.
12378   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
12379   struct TransformedInitCapture {
12380     // The location of the ... if the result is retaining a pack expansion.
12381     SourceLocation EllipsisLoc;
12382     // Zero or more expansions of the init-capture.
12383     SmallVector<InitCaptureInfoTy, 4> Expansions;
12384   };
12385   SmallVector<TransformedInitCapture, 4> InitCaptures;
12386   InitCaptures.resize(E->explicit_capture_end() - E->explicit_capture_begin());
12387   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12388                                     CEnd = E->capture_end();
12389        C != CEnd; ++C) {
12390     if (!E->isInitCapture(C))
12391       continue;
12392 
12393     TransformedInitCapture &Result = InitCaptures[C - E->capture_begin()];
12394     VarDecl *OldVD = C->getCapturedVar();
12395 
12396     auto SubstInitCapture = [&](SourceLocation EllipsisLoc,
12397                                 Optional<unsigned> NumExpansions) {
12398       ExprResult NewExprInitResult = getDerived().TransformInitializer(
12399           OldVD->getInit(), OldVD->getInitStyle() == VarDecl::CallInit);
12400 
12401       if (NewExprInitResult.isInvalid()) {
12402         Result.Expansions.push_back(InitCaptureInfoTy(ExprError(), QualType()));
12403         return;
12404       }
12405       Expr *NewExprInit = NewExprInitResult.get();
12406 
12407       QualType NewInitCaptureType =
12408           getSema().buildLambdaInitCaptureInitialization(
12409               C->getLocation(), OldVD->getType()->isReferenceType(),
12410               EllipsisLoc, NumExpansions, OldVD->getIdentifier(),
12411               C->getCapturedVar()->getInitStyle() != VarDecl::CInit,
12412               NewExprInit);
12413       Result.Expansions.push_back(
12414           InitCaptureInfoTy(NewExprInit, NewInitCaptureType));
12415     };
12416 
12417     // If this is an init-capture pack, consider expanding the pack now.
12418     if (OldVD->isParameterPack()) {
12419       PackExpansionTypeLoc ExpansionTL = OldVD->getTypeSourceInfo()
12420                                              ->getTypeLoc()
12421                                              .castAs<PackExpansionTypeLoc>();
12422       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
12423       SemaRef.collectUnexpandedParameterPacks(OldVD->getInit(), Unexpanded);
12424 
12425       // Determine whether the set of unexpanded parameter packs can and should
12426       // be expanded.
12427       bool Expand = true;
12428       bool RetainExpansion = false;
12429       Optional<unsigned> OrigNumExpansions =
12430           ExpansionTL.getTypePtr()->getNumExpansions();
12431       Optional<unsigned> NumExpansions = OrigNumExpansions;
12432       if (getDerived().TryExpandParameterPacks(
12433               ExpansionTL.getEllipsisLoc(),
12434               OldVD->getInit()->getSourceRange(), Unexpanded, Expand,
12435               RetainExpansion, NumExpansions))
12436         return ExprError();
12437       if (Expand) {
12438         for (unsigned I = 0; I != *NumExpansions; ++I) {
12439           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12440           SubstInitCapture(SourceLocation(), None);
12441         }
12442       }
12443       if (!Expand || RetainExpansion) {
12444         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
12445         SubstInitCapture(ExpansionTL.getEllipsisLoc(), NumExpansions);
12446         Result.EllipsisLoc = ExpansionTL.getEllipsisLoc();
12447       }
12448     } else {
12449       SubstInitCapture(SourceLocation(), None);
12450     }
12451   }
12452 
12453   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
12454   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
12455 
12456   // Transform the template parameters, and add them to the current
12457   // instantiation scope. The null case is handled correctly.
12458   auto TPL = getDerived().TransformTemplateParameterList(
12459       E->getTemplateParameterList());
12460   LSI->GLTemplateParameterList = TPL;
12461 
12462   // Transform the type of the original lambda's call operator.
12463   // The transformation MUST be done in the CurrentInstantiationScope since
12464   // it introduces a mapping of the original to the newly created
12465   // transformed parameters.
12466   TypeSourceInfo *NewCallOpTSI = nullptr;
12467   {
12468     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
12469     FunctionProtoTypeLoc OldCallOpFPTL =
12470         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
12471 
12472     TypeLocBuilder NewCallOpTLBuilder;
12473     SmallVector<QualType, 4> ExceptionStorage;
12474     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
12475     QualType NewCallOpType = TransformFunctionProtoType(
12476         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
12477         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
12478           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
12479                                               ExceptionStorage, Changed);
12480         });
12481     if (NewCallOpType.isNull())
12482       return ExprError();
12483     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
12484                                                         NewCallOpType);
12485   }
12486 
12487   // Transform the trailing requires clause
12488   ExprResult NewTrailingRequiresClause;
12489   if (Expr *TRC = E->getCallOperator()->getTrailingRequiresClause())
12490     // FIXME: Concepts: Substitution into requires clause should only happen
12491     //                  when checking satisfaction.
12492     NewTrailingRequiresClause = getDerived().TransformExpr(TRC);
12493 
12494   // Create the local class that will describe the lambda.
12495   // FIXME: KnownDependent below is wrong when substituting inside a templated
12496   // context that isn't a DeclContext (such as a variable template).
12497   CXXRecordDecl *OldClass = E->getLambdaClass();
12498   CXXRecordDecl *Class
12499     = getSema().createLambdaClosureType(E->getIntroducerRange(),
12500                                         NewCallOpTSI,
12501                                         /*KnownDependent=*/false,
12502                                         E->getCaptureDefault());
12503   getDerived().transformedLocalDecl(OldClass, {Class});
12504 
12505   Optional<std::tuple<unsigned, bool, Decl *>> Mangling;
12506   if (getDerived().ReplacingOriginal())
12507     Mangling = std::make_tuple(OldClass->getLambdaManglingNumber(),
12508                                OldClass->hasKnownLambdaInternalLinkage(),
12509                                OldClass->getLambdaContextDecl());
12510 
12511   // Build the call operator.
12512   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
12513       Class, E->getIntroducerRange(), NewCallOpTSI,
12514       E->getCallOperator()->getEndLoc(),
12515       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
12516       E->getCallOperator()->getConstexprKind(),
12517       NewTrailingRequiresClause.get());
12518 
12519   LSI->CallOperator = NewCallOperator;
12520 
12521   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
12522   getDerived().transformedLocalDecl(E->getCallOperator(), {NewCallOperator});
12523 
12524   // Number the lambda for linkage purposes if necessary.
12525   getSema().handleLambdaNumbering(Class, NewCallOperator, Mangling);
12526 
12527   // Introduce the context of the call operator.
12528   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
12529                                  /*NewThisContext*/false);
12530 
12531   // Enter the scope of the lambda.
12532   getSema().buildLambdaScope(LSI, NewCallOperator,
12533                              E->getIntroducerRange(),
12534                              E->getCaptureDefault(),
12535                              E->getCaptureDefaultLoc(),
12536                              E->hasExplicitParameters(),
12537                              E->hasExplicitResultType(),
12538                              E->isMutable());
12539 
12540   bool Invalid = false;
12541 
12542   // Transform captures.
12543   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12544                                  CEnd = E->capture_end();
12545        C != CEnd; ++C) {
12546     // When we hit the first implicit capture, tell Sema that we've finished
12547     // the list of explicit captures.
12548     if (C->isImplicit())
12549       break;
12550 
12551     // Capturing 'this' is trivial.
12552     if (C->capturesThis()) {
12553       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12554                                     /*BuildAndDiagnose*/ true, nullptr,
12555                                     C->getCaptureKind() == LCK_StarThis);
12556       continue;
12557     }
12558     // Captured expression will be recaptured during captured variables
12559     // rebuilding.
12560     if (C->capturesVLAType())
12561       continue;
12562 
12563     // Rebuild init-captures, including the implied field declaration.
12564     if (E->isInitCapture(C)) {
12565       TransformedInitCapture &NewC = InitCaptures[C - E->capture_begin()];
12566 
12567       VarDecl *OldVD = C->getCapturedVar();
12568       llvm::SmallVector<Decl*, 4> NewVDs;
12569 
12570       for (InitCaptureInfoTy &Info : NewC.Expansions) {
12571         ExprResult Init = Info.first;
12572         QualType InitQualType = Info.second;
12573         if (Init.isInvalid() || InitQualType.isNull()) {
12574           Invalid = true;
12575           break;
12576         }
12577         VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
12578             OldVD->getLocation(), InitQualType, NewC.EllipsisLoc,
12579             OldVD->getIdentifier(), OldVD->getInitStyle(), Init.get());
12580         if (!NewVD) {
12581           Invalid = true;
12582           break;
12583         }
12584         NewVDs.push_back(NewVD);
12585         getSema().addInitCapture(LSI, NewVD);
12586       }
12587 
12588       if (Invalid)
12589         break;
12590 
12591       getDerived().transformedLocalDecl(OldVD, NewVDs);
12592       continue;
12593     }
12594 
12595     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12596 
12597     // Determine the capture kind for Sema.
12598     Sema::TryCaptureKind Kind
12599       = C->isImplicit()? Sema::TryCapture_Implicit
12600                        : C->getCaptureKind() == LCK_ByCopy
12601                            ? Sema::TryCapture_ExplicitByVal
12602                            : Sema::TryCapture_ExplicitByRef;
12603     SourceLocation EllipsisLoc;
12604     if (C->isPackExpansion()) {
12605       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
12606       bool ShouldExpand = false;
12607       bool RetainExpansion = false;
12608       Optional<unsigned> NumExpansions;
12609       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
12610                                                C->getLocation(),
12611                                                Unexpanded,
12612                                                ShouldExpand, RetainExpansion,
12613                                                NumExpansions)) {
12614         Invalid = true;
12615         continue;
12616       }
12617 
12618       if (ShouldExpand) {
12619         // The transform has determined that we should perform an expansion;
12620         // transform and capture each of the arguments.
12621         // expansion of the pattern. Do so.
12622         VarDecl *Pack = C->getCapturedVar();
12623         for (unsigned I = 0; I != *NumExpansions; ++I) {
12624           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
12625           VarDecl *CapturedVar
12626             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12627                                                                Pack));
12628           if (!CapturedVar) {
12629             Invalid = true;
12630             continue;
12631           }
12632 
12633           // Capture the transformed variable.
12634           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
12635         }
12636 
12637         // FIXME: Retain a pack expansion if RetainExpansion is true.
12638 
12639         continue;
12640       }
12641 
12642       EllipsisLoc = C->getEllipsisLoc();
12643     }
12644 
12645     // Transform the captured variable.
12646     VarDecl *CapturedVar
12647       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
12648                                                          C->getCapturedVar()));
12649     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
12650       Invalid = true;
12651       continue;
12652     }
12653 
12654     // Capture the transformed variable.
12655     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
12656                                  EllipsisLoc);
12657   }
12658   getSema().finishLambdaExplicitCaptures(LSI);
12659 
12660   // FIXME: Sema's lambda-building mechanism expects us to push an expression
12661   // evaluation context even if we're not transforming the function body.
12662   getSema().PushExpressionEvaluationContext(
12663       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
12664 
12665   // Instantiate the body of the lambda expression.
12666   StmtResult Body =
12667       Invalid ? StmtError() : getDerived().TransformLambdaBody(E, E->getBody());
12668 
12669   // ActOnLambda* will pop the function scope for us.
12670   FuncScopeCleanup.disable();
12671 
12672   if (Body.isInvalid()) {
12673     SavedContext.pop();
12674     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
12675                                /*IsInstantiation=*/true);
12676     return ExprError();
12677   }
12678 
12679   // Copy the LSI before ActOnFinishFunctionBody removes it.
12680   // FIXME: This is dumb. Store the lambda information somewhere that outlives
12681   // the call operator.
12682   auto LSICopy = *LSI;
12683   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
12684                                     /*IsInstantiation*/ true);
12685   SavedContext.pop();
12686 
12687   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
12688                                    &LSICopy);
12689 }
12690 
12691 template<typename Derived>
12692 StmtResult
12693 TreeTransform<Derived>::TransformLambdaBody(LambdaExpr *E, Stmt *S) {
12694   return TransformStmt(S);
12695 }
12696 
12697 template<typename Derived>
12698 StmtResult
12699 TreeTransform<Derived>::SkipLambdaBody(LambdaExpr *E, Stmt *S) {
12700   // Transform captures.
12701   for (LambdaExpr::capture_iterator C = E->capture_begin(),
12702                                  CEnd = E->capture_end();
12703        C != CEnd; ++C) {
12704     // When we hit the first implicit capture, tell Sema that we've finished
12705     // the list of explicit captures.
12706     if (!C->isImplicit())
12707       continue;
12708 
12709     // Capturing 'this' is trivial.
12710     if (C->capturesThis()) {
12711       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
12712                                     /*BuildAndDiagnose*/ true, nullptr,
12713                                     C->getCaptureKind() == LCK_StarThis);
12714       continue;
12715     }
12716     // Captured expression will be recaptured during captured variables
12717     // rebuilding.
12718     if (C->capturesVLAType())
12719       continue;
12720 
12721     assert(C->capturesVariable() && "unexpected kind of lambda capture");
12722     assert(!E->isInitCapture(C) && "implicit init-capture?");
12723 
12724     // Transform the captured variable.
12725     VarDecl *CapturedVar = cast_or_null<VarDecl>(
12726         getDerived().TransformDecl(C->getLocation(), C->getCapturedVar()));
12727     if (!CapturedVar || CapturedVar->isInvalidDecl())
12728       return StmtError();
12729 
12730     // Capture the transformed variable.
12731     getSema().tryCaptureVariable(CapturedVar, C->getLocation());
12732   }
12733 
12734   return S;
12735 }
12736 
12737 template<typename Derived>
12738 ExprResult
12739 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
12740                                                   CXXUnresolvedConstructExpr *E) {
12741   TypeSourceInfo *T =
12742       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
12743   if (!T)
12744     return ExprError();
12745 
12746   bool ArgumentChanged = false;
12747   SmallVector<Expr*, 8> Args;
12748   Args.reserve(E->arg_size());
12749   {
12750     EnterExpressionEvaluationContext Context(
12751         getSema(), EnterExpressionEvaluationContext::InitList,
12752         E->isListInitialization());
12753     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
12754                                     &ArgumentChanged))
12755       return ExprError();
12756   }
12757 
12758   if (!getDerived().AlwaysRebuild() &&
12759       T == E->getTypeSourceInfo() &&
12760       !ArgumentChanged)
12761     return E;
12762 
12763   // FIXME: we're faking the locations of the commas
12764   return getDerived().RebuildCXXUnresolvedConstructExpr(
12765       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
12766 }
12767 
12768 template<typename Derived>
12769 ExprResult
12770 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
12771                                              CXXDependentScopeMemberExpr *E) {
12772   // Transform the base of the expression.
12773   ExprResult Base((Expr*) nullptr);
12774   Expr *OldBase;
12775   QualType BaseType;
12776   QualType ObjectType;
12777   if (!E->isImplicitAccess()) {
12778     OldBase = E->getBase();
12779     Base = getDerived().TransformExpr(OldBase);
12780     if (Base.isInvalid())
12781       return ExprError();
12782 
12783     // Start the member reference and compute the object's type.
12784     ParsedType ObjectTy;
12785     bool MayBePseudoDestructor = false;
12786     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
12787                                                 E->getOperatorLoc(),
12788                                       E->isArrow()? tok::arrow : tok::period,
12789                                                 ObjectTy,
12790                                                 MayBePseudoDestructor);
12791     if (Base.isInvalid())
12792       return ExprError();
12793 
12794     ObjectType = ObjectTy.get();
12795     BaseType = ((Expr*) Base.get())->getType();
12796   } else {
12797     OldBase = nullptr;
12798     BaseType = getDerived().TransformType(E->getBaseType());
12799     ObjectType = BaseType->castAs<PointerType>()->getPointeeType();
12800   }
12801 
12802   // Transform the first part of the nested-name-specifier that qualifies
12803   // the member name.
12804   NamedDecl *FirstQualifierInScope
12805     = getDerived().TransformFirstQualifierInScope(
12806                                             E->getFirstQualifierFoundInScope(),
12807                                             E->getQualifierLoc().getBeginLoc());
12808 
12809   NestedNameSpecifierLoc QualifierLoc;
12810   if (E->getQualifier()) {
12811     QualifierLoc
12812       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
12813                                                      ObjectType,
12814                                                      FirstQualifierInScope);
12815     if (!QualifierLoc)
12816       return ExprError();
12817   }
12818 
12819   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
12820 
12821   // TODO: If this is a conversion-function-id, verify that the
12822   // destination type name (if present) resolves the same way after
12823   // instantiation as it did in the local scope.
12824 
12825   DeclarationNameInfo NameInfo
12826     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
12827   if (!NameInfo.getName())
12828     return ExprError();
12829 
12830   if (!E->hasExplicitTemplateArgs()) {
12831     // This is a reference to a member without an explicitly-specified
12832     // template argument list. Optimize for this common case.
12833     if (!getDerived().AlwaysRebuild() &&
12834         Base.get() == OldBase &&
12835         BaseType == E->getBaseType() &&
12836         QualifierLoc == E->getQualifierLoc() &&
12837         NameInfo.getName() == E->getMember() &&
12838         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
12839       return E;
12840 
12841     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12842                                                        BaseType,
12843                                                        E->isArrow(),
12844                                                        E->getOperatorLoc(),
12845                                                        QualifierLoc,
12846                                                        TemplateKWLoc,
12847                                                        FirstQualifierInScope,
12848                                                        NameInfo,
12849                                                        /*TemplateArgs*/nullptr);
12850   }
12851 
12852   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
12853   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
12854                                               E->getNumTemplateArgs(),
12855                                               TransArgs))
12856     return ExprError();
12857 
12858   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
12859                                                      BaseType,
12860                                                      E->isArrow(),
12861                                                      E->getOperatorLoc(),
12862                                                      QualifierLoc,
12863                                                      TemplateKWLoc,
12864                                                      FirstQualifierInScope,
12865                                                      NameInfo,
12866                                                      &TransArgs);
12867 }
12868 
12869 template<typename Derived>
12870 ExprResult
12871 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
12872   // Transform the base of the expression.
12873   ExprResult Base((Expr*) nullptr);
12874   QualType BaseType;
12875   if (!Old->isImplicitAccess()) {
12876     Base = getDerived().TransformExpr(Old->getBase());
12877     if (Base.isInvalid())
12878       return ExprError();
12879     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
12880                                                      Old->isArrow());
12881     if (Base.isInvalid())
12882       return ExprError();
12883     BaseType = Base.get()->getType();
12884   } else {
12885     BaseType = getDerived().TransformType(Old->getBaseType());
12886   }
12887 
12888   NestedNameSpecifierLoc QualifierLoc;
12889   if (Old->getQualifierLoc()) {
12890     QualifierLoc
12891     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
12892     if (!QualifierLoc)
12893       return ExprError();
12894   }
12895 
12896   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
12897 
12898   LookupResult R(SemaRef, Old->getMemberNameInfo(),
12899                  Sema::LookupOrdinaryName);
12900 
12901   // Transform the declaration set.
12902   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
12903     return ExprError();
12904 
12905   // Determine the naming class.
12906   if (Old->getNamingClass()) {
12907     CXXRecordDecl *NamingClass
12908       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
12909                                                           Old->getMemberLoc(),
12910                                                         Old->getNamingClass()));
12911     if (!NamingClass)
12912       return ExprError();
12913 
12914     R.setNamingClass(NamingClass);
12915   }
12916 
12917   TemplateArgumentListInfo TransArgs;
12918   if (Old->hasExplicitTemplateArgs()) {
12919     TransArgs.setLAngleLoc(Old->getLAngleLoc());
12920     TransArgs.setRAngleLoc(Old->getRAngleLoc());
12921     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
12922                                                 Old->getNumTemplateArgs(),
12923                                                 TransArgs))
12924       return ExprError();
12925   }
12926 
12927   // FIXME: to do this check properly, we will need to preserve the
12928   // first-qualifier-in-scope here, just in case we had a dependent
12929   // base (and therefore couldn't do the check) and a
12930   // nested-name-qualifier (and therefore could do the lookup).
12931   NamedDecl *FirstQualifierInScope = nullptr;
12932 
12933   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
12934                                                   BaseType,
12935                                                   Old->getOperatorLoc(),
12936                                                   Old->isArrow(),
12937                                                   QualifierLoc,
12938                                                   TemplateKWLoc,
12939                                                   FirstQualifierInScope,
12940                                                   R,
12941                                               (Old->hasExplicitTemplateArgs()
12942                                                   ? &TransArgs : nullptr));
12943 }
12944 
12945 template<typename Derived>
12946 ExprResult
12947 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
12948   EnterExpressionEvaluationContext Unevaluated(
12949       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
12950   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
12951   if (SubExpr.isInvalid())
12952     return ExprError();
12953 
12954   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
12955     return E;
12956 
12957   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
12958 }
12959 
12960 template<typename Derived>
12961 ExprResult
12962 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
12963   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
12964   if (Pattern.isInvalid())
12965     return ExprError();
12966 
12967   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
12968     return E;
12969 
12970   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
12971                                            E->getNumExpansions());
12972 }
12973 
12974 template<typename Derived>
12975 ExprResult
12976 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
12977   // If E is not value-dependent, then nothing will change when we transform it.
12978   // Note: This is an instantiation-centric view.
12979   if (!E->isValueDependent())
12980     return E;
12981 
12982   EnterExpressionEvaluationContext Unevaluated(
12983       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
12984 
12985   ArrayRef<TemplateArgument> PackArgs;
12986   TemplateArgument ArgStorage;
12987 
12988   // Find the argument list to transform.
12989   if (E->isPartiallySubstituted()) {
12990     PackArgs = E->getPartialArguments();
12991   } else if (E->isValueDependent()) {
12992     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
12993     bool ShouldExpand = false;
12994     bool RetainExpansion = false;
12995     Optional<unsigned> NumExpansions;
12996     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
12997                                              Unexpanded,
12998                                              ShouldExpand, RetainExpansion,
12999                                              NumExpansions))
13000       return ExprError();
13001 
13002     // If we need to expand the pack, build a template argument from it and
13003     // expand that.
13004     if (ShouldExpand) {
13005       auto *Pack = E->getPack();
13006       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
13007         ArgStorage = getSema().Context.getPackExpansionType(
13008             getSema().Context.getTypeDeclType(TTPD), None);
13009       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
13010         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
13011       } else {
13012         auto *VD = cast<ValueDecl>(Pack);
13013         ExprResult DRE = getSema().BuildDeclRefExpr(
13014             VD, VD->getType().getNonLValueExprType(getSema().Context),
13015             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
13016             E->getPackLoc());
13017         if (DRE.isInvalid())
13018           return ExprError();
13019         ArgStorage = new (getSema().Context) PackExpansionExpr(
13020             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
13021       }
13022       PackArgs = ArgStorage;
13023     }
13024   }
13025 
13026   // If we're not expanding the pack, just transform the decl.
13027   if (!PackArgs.size()) {
13028     auto *Pack = cast_or_null<NamedDecl>(
13029         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
13030     if (!Pack)
13031       return ExprError();
13032     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
13033                                               E->getPackLoc(),
13034                                               E->getRParenLoc(), None, None);
13035   }
13036 
13037   // Try to compute the result without performing a partial substitution.
13038   Optional<unsigned> Result = 0;
13039   for (const TemplateArgument &Arg : PackArgs) {
13040     if (!Arg.isPackExpansion()) {
13041       Result = *Result + 1;
13042       continue;
13043     }
13044 
13045     TemplateArgumentLoc ArgLoc;
13046     InventTemplateArgumentLoc(Arg, ArgLoc);
13047 
13048     // Find the pattern of the pack expansion.
13049     SourceLocation Ellipsis;
13050     Optional<unsigned> OrigNumExpansions;
13051     TemplateArgumentLoc Pattern =
13052         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
13053                                                           OrigNumExpansions);
13054 
13055     // Substitute under the pack expansion. Do not expand the pack (yet).
13056     TemplateArgumentLoc OutPattern;
13057     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13058     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
13059                                                /*Uneval*/ true))
13060       return true;
13061 
13062     // See if we can determine the number of arguments from the result.
13063     Optional<unsigned> NumExpansions =
13064         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
13065     if (!NumExpansions) {
13066       // No: we must be in an alias template expansion, and we're going to need
13067       // to actually expand the packs.
13068       Result = None;
13069       break;
13070     }
13071 
13072     Result = *Result + *NumExpansions;
13073   }
13074 
13075   // Common case: we could determine the number of expansions without
13076   // substituting.
13077   if (Result)
13078     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13079                                               E->getPackLoc(),
13080                                               E->getRParenLoc(), *Result, None);
13081 
13082   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
13083                                                E->getPackLoc());
13084   {
13085     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
13086     typedef TemplateArgumentLocInventIterator<
13087         Derived, const TemplateArgument*> PackLocIterator;
13088     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
13089                                    PackLocIterator(*this, PackArgs.end()),
13090                                    TransformedPackArgs, /*Uneval*/true))
13091       return ExprError();
13092   }
13093 
13094   // Check whether we managed to fully-expand the pack.
13095   // FIXME: Is it possible for us to do so and not hit the early exit path?
13096   SmallVector<TemplateArgument, 8> Args;
13097   bool PartialSubstitution = false;
13098   for (auto &Loc : TransformedPackArgs.arguments()) {
13099     Args.push_back(Loc.getArgument());
13100     if (Loc.getArgument().isPackExpansion())
13101       PartialSubstitution = true;
13102   }
13103 
13104   if (PartialSubstitution)
13105     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13106                                               E->getPackLoc(),
13107                                               E->getRParenLoc(), None, Args);
13108 
13109   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
13110                                             E->getPackLoc(), E->getRParenLoc(),
13111                                             Args.size(), None);
13112 }
13113 
13114 template<typename Derived>
13115 ExprResult
13116 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
13117                                           SubstNonTypeTemplateParmPackExpr *E) {
13118   // Default behavior is to do nothing with this transformation.
13119   return E;
13120 }
13121 
13122 template<typename Derived>
13123 ExprResult
13124 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
13125                                           SubstNonTypeTemplateParmExpr *E) {
13126   // Default behavior is to do nothing with this transformation.
13127   return E;
13128 }
13129 
13130 template<typename Derived>
13131 ExprResult
13132 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
13133   // Default behavior is to do nothing with this transformation.
13134   return E;
13135 }
13136 
13137 template<typename Derived>
13138 ExprResult
13139 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
13140                                                   MaterializeTemporaryExpr *E) {
13141   return getDerived().TransformExpr(E->getSubExpr());
13142 }
13143 
13144 template<typename Derived>
13145 ExprResult
13146 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
13147   UnresolvedLookupExpr *Callee = nullptr;
13148   if (Expr *OldCallee = E->getCallee()) {
13149     ExprResult CalleeResult = getDerived().TransformExpr(OldCallee);
13150     if (CalleeResult.isInvalid())
13151       return ExprError();
13152     Callee = cast<UnresolvedLookupExpr>(CalleeResult.get());
13153   }
13154 
13155   Expr *Pattern = E->getPattern();
13156 
13157   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13158   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
13159   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13160 
13161   // Determine whether the set of unexpanded parameter packs can and should
13162   // be expanded.
13163   bool Expand = true;
13164   bool RetainExpansion = false;
13165   Optional<unsigned> OrigNumExpansions = E->getNumExpansions(),
13166                      NumExpansions = OrigNumExpansions;
13167   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
13168                                            Pattern->getSourceRange(),
13169                                            Unexpanded,
13170                                            Expand, RetainExpansion,
13171                                            NumExpansions))
13172     return true;
13173 
13174   if (!Expand) {
13175     // Do not expand any packs here, just transform and rebuild a fold
13176     // expression.
13177     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13178 
13179     ExprResult LHS =
13180         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
13181     if (LHS.isInvalid())
13182       return true;
13183 
13184     ExprResult RHS =
13185         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
13186     if (RHS.isInvalid())
13187       return true;
13188 
13189     if (!getDerived().AlwaysRebuild() &&
13190         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
13191       return E;
13192 
13193     return getDerived().RebuildCXXFoldExpr(
13194         Callee, E->getBeginLoc(), LHS.get(), E->getOperator(),
13195         E->getEllipsisLoc(), RHS.get(), E->getEndLoc(), NumExpansions);
13196   }
13197 
13198   // Formally a fold expression expands to nested parenthesized expressions.
13199   // Enforce this limit to avoid creating trees so deep we can't safely traverse
13200   // them.
13201   if (NumExpansions && SemaRef.getLangOpts().BracketDepth < NumExpansions) {
13202     SemaRef.Diag(E->getEllipsisLoc(),
13203                  clang::diag::err_fold_expression_limit_exceeded)
13204         << *NumExpansions << SemaRef.getLangOpts().BracketDepth
13205         << E->getSourceRange();
13206     SemaRef.Diag(E->getEllipsisLoc(), diag::note_bracket_depth);
13207     return ExprError();
13208   }
13209 
13210   // The transform has determined that we should perform an elementwise
13211   // expansion of the pattern. Do so.
13212   ExprResult Result = getDerived().TransformExpr(E->getInit());
13213   if (Result.isInvalid())
13214     return true;
13215   bool LeftFold = E->isLeftFold();
13216 
13217   // If we're retaining an expansion for a right fold, it is the innermost
13218   // component and takes the init (if any).
13219   if (!LeftFold && RetainExpansion) {
13220     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13221 
13222     ExprResult Out = getDerived().TransformExpr(Pattern);
13223     if (Out.isInvalid())
13224       return true;
13225 
13226     Result = getDerived().RebuildCXXFoldExpr(
13227         Callee, E->getBeginLoc(), Out.get(), E->getOperator(),
13228         E->getEllipsisLoc(), Result.get(), E->getEndLoc(), OrigNumExpansions);
13229     if (Result.isInvalid())
13230       return true;
13231   }
13232 
13233   for (unsigned I = 0; I != *NumExpansions; ++I) {
13234     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
13235         getSema(), LeftFold ? I : *NumExpansions - I - 1);
13236     ExprResult Out = getDerived().TransformExpr(Pattern);
13237     if (Out.isInvalid())
13238       return true;
13239 
13240     if (Out.get()->containsUnexpandedParameterPack()) {
13241       // We still have a pack; retain a pack expansion for this slice.
13242       Result = getDerived().RebuildCXXFoldExpr(
13243           Callee, E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
13244           E->getOperator(), E->getEllipsisLoc(),
13245           LeftFold ? Out.get() : Result.get(), E->getEndLoc(),
13246           OrigNumExpansions);
13247     } else if (Result.isUsable()) {
13248       // We've got down to a single element; build a binary operator.
13249       Expr *LHS = LeftFold ? Result.get() : Out.get();
13250       Expr *RHS = LeftFold ? Out.get() : Result.get();
13251       if (Callee)
13252         Result = getDerived().RebuildCXXOperatorCallExpr(
13253             BinaryOperator::getOverloadedOperator(E->getOperator()),
13254             E->getEllipsisLoc(), Callee, LHS, RHS);
13255       else
13256         Result = getDerived().RebuildBinaryOperator(E->getEllipsisLoc(),
13257                                                     E->getOperator(), LHS, RHS);
13258     } else
13259       Result = Out;
13260 
13261     if (Result.isInvalid())
13262       return true;
13263   }
13264 
13265   // If we're retaining an expansion for a left fold, it is the outermost
13266   // component and takes the complete expansion so far as its init (if any).
13267   if (LeftFold && RetainExpansion) {
13268     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
13269 
13270     ExprResult Out = getDerived().TransformExpr(Pattern);
13271     if (Out.isInvalid())
13272       return true;
13273 
13274     Result = getDerived().RebuildCXXFoldExpr(
13275         Callee, E->getBeginLoc(), Result.get(), E->getOperator(),
13276         E->getEllipsisLoc(), Out.get(), E->getEndLoc(), OrigNumExpansions);
13277     if (Result.isInvalid())
13278       return true;
13279   }
13280 
13281   // If we had no init and an empty pack, and we're not retaining an expansion,
13282   // then produce a fallback value or error.
13283   if (Result.isUnset())
13284     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
13285                                                 E->getOperator());
13286 
13287   return Result;
13288 }
13289 
13290 template<typename Derived>
13291 ExprResult
13292 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
13293     CXXStdInitializerListExpr *E) {
13294   return getDerived().TransformExpr(E->getSubExpr());
13295 }
13296 
13297 template<typename Derived>
13298 ExprResult
13299 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
13300   return SemaRef.MaybeBindToTemporary(E);
13301 }
13302 
13303 template<typename Derived>
13304 ExprResult
13305 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
13306   return E;
13307 }
13308 
13309 template<typename Derived>
13310 ExprResult
13311 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
13312   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
13313   if (SubExpr.isInvalid())
13314     return ExprError();
13315 
13316   if (!getDerived().AlwaysRebuild() &&
13317       SubExpr.get() == E->getSubExpr())
13318     return E;
13319 
13320   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
13321 }
13322 
13323 template<typename Derived>
13324 ExprResult
13325 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
13326   // Transform each of the elements.
13327   SmallVector<Expr *, 8> Elements;
13328   bool ArgChanged = false;
13329   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
13330                                   /*IsCall=*/false, Elements, &ArgChanged))
13331     return ExprError();
13332 
13333   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13334     return SemaRef.MaybeBindToTemporary(E);
13335 
13336   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
13337                                               Elements.data(),
13338                                               Elements.size());
13339 }
13340 
13341 template<typename Derived>
13342 ExprResult
13343 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
13344                                                     ObjCDictionaryLiteral *E) {
13345   // Transform each of the elements.
13346   SmallVector<ObjCDictionaryElement, 8> Elements;
13347   bool ArgChanged = false;
13348   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
13349     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
13350 
13351     if (OrigElement.isPackExpansion()) {
13352       // This key/value element is a pack expansion.
13353       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
13354       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
13355       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
13356       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
13357 
13358       // Determine whether the set of unexpanded parameter packs can
13359       // and should be expanded.
13360       bool Expand = true;
13361       bool RetainExpansion = false;
13362       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
13363       Optional<unsigned> NumExpansions = OrigNumExpansions;
13364       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
13365                                OrigElement.Value->getEndLoc());
13366       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
13367                                                PatternRange, Unexpanded, Expand,
13368                                                RetainExpansion, NumExpansions))
13369         return ExprError();
13370 
13371       if (!Expand) {
13372         // The transform has determined that we should perform a simple
13373         // transformation on the pack expansion, producing another pack
13374         // expansion.
13375         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
13376         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13377         if (Key.isInvalid())
13378           return ExprError();
13379 
13380         if (Key.get() != OrigElement.Key)
13381           ArgChanged = true;
13382 
13383         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13384         if (Value.isInvalid())
13385           return ExprError();
13386 
13387         if (Value.get() != OrigElement.Value)
13388           ArgChanged = true;
13389 
13390         ObjCDictionaryElement Expansion = {
13391           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
13392         };
13393         Elements.push_back(Expansion);
13394         continue;
13395       }
13396 
13397       // Record right away that the argument was changed.  This needs
13398       // to happen even if the array expands to nothing.
13399       ArgChanged = true;
13400 
13401       // The transform has determined that we should perform an elementwise
13402       // expansion of the pattern. Do so.
13403       for (unsigned I = 0; I != *NumExpansions; ++I) {
13404         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
13405         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13406         if (Key.isInvalid())
13407           return ExprError();
13408 
13409         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
13410         if (Value.isInvalid())
13411           return ExprError();
13412 
13413         ObjCDictionaryElement Element = {
13414           Key.get(), Value.get(), SourceLocation(), NumExpansions
13415         };
13416 
13417         // If any unexpanded parameter packs remain, we still have a
13418         // pack expansion.
13419         // FIXME: Can this really happen?
13420         if (Key.get()->containsUnexpandedParameterPack() ||
13421             Value.get()->containsUnexpandedParameterPack())
13422           Element.EllipsisLoc = OrigElement.EllipsisLoc;
13423 
13424         Elements.push_back(Element);
13425       }
13426 
13427       // FIXME: Retain a pack expansion if RetainExpansion is true.
13428 
13429       // We've finished with this pack expansion.
13430       continue;
13431     }
13432 
13433     // Transform and check key.
13434     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
13435     if (Key.isInvalid())
13436       return ExprError();
13437 
13438     if (Key.get() != OrigElement.Key)
13439       ArgChanged = true;
13440 
13441     // Transform and check value.
13442     ExprResult Value
13443       = getDerived().TransformExpr(OrigElement.Value);
13444     if (Value.isInvalid())
13445       return ExprError();
13446 
13447     if (Value.get() != OrigElement.Value)
13448       ArgChanged = true;
13449 
13450     ObjCDictionaryElement Element = {
13451       Key.get(), Value.get(), SourceLocation(), None
13452     };
13453     Elements.push_back(Element);
13454   }
13455 
13456   if (!getDerived().AlwaysRebuild() && !ArgChanged)
13457     return SemaRef.MaybeBindToTemporary(E);
13458 
13459   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
13460                                                    Elements);
13461 }
13462 
13463 template<typename Derived>
13464 ExprResult
13465 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
13466   TypeSourceInfo *EncodedTypeInfo
13467     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
13468   if (!EncodedTypeInfo)
13469     return ExprError();
13470 
13471   if (!getDerived().AlwaysRebuild() &&
13472       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
13473     return E;
13474 
13475   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
13476                                             EncodedTypeInfo,
13477                                             E->getRParenLoc());
13478 }
13479 
13480 template<typename Derived>
13481 ExprResult TreeTransform<Derived>::
13482 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
13483   // This is a kind of implicit conversion, and it needs to get dropped
13484   // and recomputed for the same general reasons that ImplicitCastExprs
13485   // do, as well a more specific one: this expression is only valid when
13486   // it appears *immediately* as an argument expression.
13487   return getDerived().TransformExpr(E->getSubExpr());
13488 }
13489 
13490 template<typename Derived>
13491 ExprResult TreeTransform<Derived>::
13492 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
13493   TypeSourceInfo *TSInfo
13494     = getDerived().TransformType(E->getTypeInfoAsWritten());
13495   if (!TSInfo)
13496     return ExprError();
13497 
13498   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
13499   if (Result.isInvalid())
13500     return ExprError();
13501 
13502   if (!getDerived().AlwaysRebuild() &&
13503       TSInfo == E->getTypeInfoAsWritten() &&
13504       Result.get() == E->getSubExpr())
13505     return E;
13506 
13507   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
13508                                       E->getBridgeKeywordLoc(), TSInfo,
13509                                       Result.get());
13510 }
13511 
13512 template <typename Derived>
13513 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
13514     ObjCAvailabilityCheckExpr *E) {
13515   return E;
13516 }
13517 
13518 template<typename Derived>
13519 ExprResult
13520 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
13521   // Transform arguments.
13522   bool ArgChanged = false;
13523   SmallVector<Expr*, 8> Args;
13524   Args.reserve(E->getNumArgs());
13525   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
13526                                   &ArgChanged))
13527     return ExprError();
13528 
13529   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
13530     // Class message: transform the receiver type.
13531     TypeSourceInfo *ReceiverTypeInfo
13532       = getDerived().TransformType(E->getClassReceiverTypeInfo());
13533     if (!ReceiverTypeInfo)
13534       return ExprError();
13535 
13536     // If nothing changed, just retain the existing message send.
13537     if (!getDerived().AlwaysRebuild() &&
13538         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
13539       return SemaRef.MaybeBindToTemporary(E);
13540 
13541     // Build a new class message send.
13542     SmallVector<SourceLocation, 16> SelLocs;
13543     E->getSelectorLocs(SelLocs);
13544     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
13545                                                E->getSelector(),
13546                                                SelLocs,
13547                                                E->getMethodDecl(),
13548                                                E->getLeftLoc(),
13549                                                Args,
13550                                                E->getRightLoc());
13551   }
13552   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
13553            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
13554     if (!E->getMethodDecl())
13555       return ExprError();
13556 
13557     // Build a new class message send to 'super'.
13558     SmallVector<SourceLocation, 16> SelLocs;
13559     E->getSelectorLocs(SelLocs);
13560     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
13561                                                E->getSelector(),
13562                                                SelLocs,
13563                                                E->getReceiverType(),
13564                                                E->getMethodDecl(),
13565                                                E->getLeftLoc(),
13566                                                Args,
13567                                                E->getRightLoc());
13568   }
13569 
13570   // Instance message: transform the receiver
13571   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
13572          "Only class and instance messages may be instantiated");
13573   ExprResult Receiver
13574     = getDerived().TransformExpr(E->getInstanceReceiver());
13575   if (Receiver.isInvalid())
13576     return ExprError();
13577 
13578   // If nothing changed, just retain the existing message send.
13579   if (!getDerived().AlwaysRebuild() &&
13580       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
13581     return SemaRef.MaybeBindToTemporary(E);
13582 
13583   // Build a new instance message send.
13584   SmallVector<SourceLocation, 16> SelLocs;
13585   E->getSelectorLocs(SelLocs);
13586   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
13587                                              E->getSelector(),
13588                                              SelLocs,
13589                                              E->getMethodDecl(),
13590                                              E->getLeftLoc(),
13591                                              Args,
13592                                              E->getRightLoc());
13593 }
13594 
13595 template<typename Derived>
13596 ExprResult
13597 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
13598   return E;
13599 }
13600 
13601 template<typename Derived>
13602 ExprResult
13603 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
13604   return E;
13605 }
13606 
13607 template<typename Derived>
13608 ExprResult
13609 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
13610   // Transform the base expression.
13611   ExprResult Base = getDerived().TransformExpr(E->getBase());
13612   if (Base.isInvalid())
13613     return ExprError();
13614 
13615   // We don't need to transform the ivar; it will never change.
13616 
13617   // If nothing changed, just retain the existing expression.
13618   if (!getDerived().AlwaysRebuild() &&
13619       Base.get() == E->getBase())
13620     return E;
13621 
13622   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
13623                                              E->getLocation(),
13624                                              E->isArrow(), E->isFreeIvar());
13625 }
13626 
13627 template<typename Derived>
13628 ExprResult
13629 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
13630   // 'super' and types never change. Property never changes. Just
13631   // retain the existing expression.
13632   if (!E->isObjectReceiver())
13633     return E;
13634 
13635   // Transform the base expression.
13636   ExprResult Base = getDerived().TransformExpr(E->getBase());
13637   if (Base.isInvalid())
13638     return ExprError();
13639 
13640   // We don't need to transform the property; it will never change.
13641 
13642   // If nothing changed, just retain the existing expression.
13643   if (!getDerived().AlwaysRebuild() &&
13644       Base.get() == E->getBase())
13645     return E;
13646 
13647   if (E->isExplicitProperty())
13648     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13649                                                    E->getExplicitProperty(),
13650                                                    E->getLocation());
13651 
13652   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
13653                                                  SemaRef.Context.PseudoObjectTy,
13654                                                  E->getImplicitPropertyGetter(),
13655                                                  E->getImplicitPropertySetter(),
13656                                                  E->getLocation());
13657 }
13658 
13659 template<typename Derived>
13660 ExprResult
13661 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
13662   // Transform the base expression.
13663   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
13664   if (Base.isInvalid())
13665     return ExprError();
13666 
13667   // Transform the key expression.
13668   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
13669   if (Key.isInvalid())
13670     return ExprError();
13671 
13672   // If nothing changed, just retain the existing expression.
13673   if (!getDerived().AlwaysRebuild() &&
13674       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
13675     return E;
13676 
13677   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
13678                                                   Base.get(), Key.get(),
13679                                                   E->getAtIndexMethodDecl(),
13680                                                   E->setAtIndexMethodDecl());
13681 }
13682 
13683 template<typename Derived>
13684 ExprResult
13685 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
13686   // Transform the base expression.
13687   ExprResult Base = getDerived().TransformExpr(E->getBase());
13688   if (Base.isInvalid())
13689     return ExprError();
13690 
13691   // If nothing changed, just retain the existing expression.
13692   if (!getDerived().AlwaysRebuild() &&
13693       Base.get() == E->getBase())
13694     return E;
13695 
13696   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
13697                                          E->getOpLoc(),
13698                                          E->isArrow());
13699 }
13700 
13701 template<typename Derived>
13702 ExprResult
13703 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
13704   bool ArgumentChanged = false;
13705   SmallVector<Expr*, 8> SubExprs;
13706   SubExprs.reserve(E->getNumSubExprs());
13707   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13708                                   SubExprs, &ArgumentChanged))
13709     return ExprError();
13710 
13711   if (!getDerived().AlwaysRebuild() &&
13712       !ArgumentChanged)
13713     return E;
13714 
13715   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
13716                                                SubExprs,
13717                                                E->getRParenLoc());
13718 }
13719 
13720 template<typename Derived>
13721 ExprResult
13722 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
13723   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
13724   if (SrcExpr.isInvalid())
13725     return ExprError();
13726 
13727   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
13728   if (!Type)
13729     return ExprError();
13730 
13731   if (!getDerived().AlwaysRebuild() &&
13732       Type == E->getTypeSourceInfo() &&
13733       SrcExpr.get() == E->getSrcExpr())
13734     return E;
13735 
13736   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
13737                                                SrcExpr.get(), Type,
13738                                                E->getRParenLoc());
13739 }
13740 
13741 template<typename Derived>
13742 ExprResult
13743 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
13744   BlockDecl *oldBlock = E->getBlockDecl();
13745 
13746   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
13747   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
13748 
13749   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
13750   blockScope->TheDecl->setBlockMissingReturnType(
13751                          oldBlock->blockMissingReturnType());
13752 
13753   SmallVector<ParmVarDecl*, 4> params;
13754   SmallVector<QualType, 4> paramTypes;
13755 
13756   const FunctionProtoType *exprFunctionType = E->getFunctionType();
13757 
13758   // Parameter substitution.
13759   Sema::ExtParameterInfoBuilder extParamInfos;
13760   if (getDerived().TransformFunctionTypeParams(
13761           E->getCaretLocation(), oldBlock->parameters(), nullptr,
13762           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
13763           extParamInfos)) {
13764     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13765     return ExprError();
13766   }
13767 
13768   QualType exprResultType =
13769       getDerived().TransformType(exprFunctionType->getReturnType());
13770 
13771   auto epi = exprFunctionType->getExtProtoInfo();
13772   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
13773 
13774   QualType functionType =
13775     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
13776   blockScope->FunctionType = functionType;
13777 
13778   // Set the parameters on the block decl.
13779   if (!params.empty())
13780     blockScope->TheDecl->setParams(params);
13781 
13782   if (!oldBlock->blockMissingReturnType()) {
13783     blockScope->HasImplicitReturnType = false;
13784     blockScope->ReturnType = exprResultType;
13785   }
13786 
13787   // Transform the body
13788   StmtResult body = getDerived().TransformStmt(E->getBody());
13789   if (body.isInvalid()) {
13790     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
13791     return ExprError();
13792   }
13793 
13794 #ifndef NDEBUG
13795   // In builds with assertions, make sure that we captured everything we
13796   // captured before.
13797   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
13798     for (const auto &I : oldBlock->captures()) {
13799       VarDecl *oldCapture = I.getVariable();
13800 
13801       // Ignore parameter packs.
13802       if (oldCapture->isParameterPack())
13803         continue;
13804 
13805       VarDecl *newCapture =
13806         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
13807                                                  oldCapture));
13808       assert(blockScope->CaptureMap.count(newCapture));
13809     }
13810     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
13811   }
13812 #endif
13813 
13814   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
13815                                     /*Scope=*/nullptr);
13816 }
13817 
13818 template<typename Derived>
13819 ExprResult
13820 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
13821   llvm_unreachable("Cannot transform asType expressions yet");
13822 }
13823 
13824 template<typename Derived>
13825 ExprResult
13826 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
13827   bool ArgumentChanged = false;
13828   SmallVector<Expr*, 8> SubExprs;
13829   SubExprs.reserve(E->getNumSubExprs());
13830   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
13831                                   SubExprs, &ArgumentChanged))
13832     return ExprError();
13833 
13834   if (!getDerived().AlwaysRebuild() &&
13835       !ArgumentChanged)
13836     return E;
13837 
13838   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
13839                                         E->getOp(), E->getRParenLoc());
13840 }
13841 
13842 //===----------------------------------------------------------------------===//
13843 // Type reconstruction
13844 //===----------------------------------------------------------------------===//
13845 
13846 template<typename Derived>
13847 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
13848                                                     SourceLocation Star) {
13849   return SemaRef.BuildPointerType(PointeeType, Star,
13850                                   getDerived().getBaseEntity());
13851 }
13852 
13853 template<typename Derived>
13854 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
13855                                                          SourceLocation Star) {
13856   return SemaRef.BuildBlockPointerType(PointeeType, Star,
13857                                        getDerived().getBaseEntity());
13858 }
13859 
13860 template<typename Derived>
13861 QualType
13862 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
13863                                              bool WrittenAsLValue,
13864                                              SourceLocation Sigil) {
13865   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
13866                                     Sigil, getDerived().getBaseEntity());
13867 }
13868 
13869 template<typename Derived>
13870 QualType
13871 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
13872                                                  QualType ClassType,
13873                                                  SourceLocation Sigil) {
13874   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
13875                                         getDerived().getBaseEntity());
13876 }
13877 
13878 template<typename Derived>
13879 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
13880            const ObjCTypeParamDecl *Decl,
13881            SourceLocation ProtocolLAngleLoc,
13882            ArrayRef<ObjCProtocolDecl *> Protocols,
13883            ArrayRef<SourceLocation> ProtocolLocs,
13884            SourceLocation ProtocolRAngleLoc) {
13885   return SemaRef.BuildObjCTypeParamType(Decl,
13886                                         ProtocolLAngleLoc, Protocols,
13887                                         ProtocolLocs, ProtocolRAngleLoc,
13888                                         /*FailOnError=*/true);
13889 }
13890 
13891 template<typename Derived>
13892 QualType TreeTransform<Derived>::RebuildObjCObjectType(
13893            QualType BaseType,
13894            SourceLocation Loc,
13895            SourceLocation TypeArgsLAngleLoc,
13896            ArrayRef<TypeSourceInfo *> TypeArgs,
13897            SourceLocation TypeArgsRAngleLoc,
13898            SourceLocation ProtocolLAngleLoc,
13899            ArrayRef<ObjCProtocolDecl *> Protocols,
13900            ArrayRef<SourceLocation> ProtocolLocs,
13901            SourceLocation ProtocolRAngleLoc) {
13902   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
13903                                      TypeArgs, TypeArgsRAngleLoc,
13904                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
13905                                      ProtocolRAngleLoc,
13906                                      /*FailOnError=*/true);
13907 }
13908 
13909 template<typename Derived>
13910 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
13911            QualType PointeeType,
13912            SourceLocation Star) {
13913   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
13914 }
13915 
13916 template<typename Derived>
13917 QualType
13918 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
13919                                          ArrayType::ArraySizeModifier SizeMod,
13920                                          const llvm::APInt *Size,
13921                                          Expr *SizeExpr,
13922                                          unsigned IndexTypeQuals,
13923                                          SourceRange BracketsRange) {
13924   if (SizeExpr || !Size)
13925     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
13926                                   IndexTypeQuals, BracketsRange,
13927                                   getDerived().getBaseEntity());
13928 
13929   QualType Types[] = {
13930     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
13931     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
13932     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
13933   };
13934   const unsigned NumTypes = llvm::array_lengthof(Types);
13935   QualType SizeType;
13936   for (unsigned I = 0; I != NumTypes; ++I)
13937     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
13938       SizeType = Types[I];
13939       break;
13940     }
13941 
13942   // Note that we can return a VariableArrayType here in the case where
13943   // the element type was a dependent VariableArrayType.
13944   IntegerLiteral *ArraySize
13945       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
13946                                /*FIXME*/BracketsRange.getBegin());
13947   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
13948                                 IndexTypeQuals, BracketsRange,
13949                                 getDerived().getBaseEntity());
13950 }
13951 
13952 template<typename Derived>
13953 QualType
13954 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
13955                                                  ArrayType::ArraySizeModifier SizeMod,
13956                                                  const llvm::APInt &Size,
13957                                                  Expr *SizeExpr,
13958                                                  unsigned IndexTypeQuals,
13959                                                  SourceRange BracketsRange) {
13960   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, SizeExpr,
13961                                         IndexTypeQuals, BracketsRange);
13962 }
13963 
13964 template<typename Derived>
13965 QualType
13966 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
13967                                           ArrayType::ArraySizeModifier SizeMod,
13968                                                  unsigned IndexTypeQuals,
13969                                                    SourceRange BracketsRange) {
13970   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
13971                                        IndexTypeQuals, BracketsRange);
13972 }
13973 
13974 template<typename Derived>
13975 QualType
13976 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
13977                                           ArrayType::ArraySizeModifier SizeMod,
13978                                                  Expr *SizeExpr,
13979                                                  unsigned IndexTypeQuals,
13980                                                  SourceRange BracketsRange) {
13981   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13982                                        SizeExpr,
13983                                        IndexTypeQuals, BracketsRange);
13984 }
13985 
13986 template<typename Derived>
13987 QualType
13988 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
13989                                           ArrayType::ArraySizeModifier SizeMod,
13990                                                        Expr *SizeExpr,
13991                                                        unsigned IndexTypeQuals,
13992                                                    SourceRange BracketsRange) {
13993   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
13994                                        SizeExpr,
13995                                        IndexTypeQuals, BracketsRange);
13996 }
13997 
13998 template <typename Derived>
13999 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
14000     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
14001   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
14002                                           AttributeLoc);
14003 }
14004 
14005 template <typename Derived>
14006 QualType
14007 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
14008                                           unsigned NumElements,
14009                                           VectorType::VectorKind VecKind) {
14010   // FIXME: semantic checking!
14011   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
14012 }
14013 
14014 template <typename Derived>
14015 QualType TreeTransform<Derived>::RebuildDependentVectorType(
14016     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
14017     VectorType::VectorKind VecKind) {
14018   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
14019 }
14020 
14021 template<typename Derived>
14022 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
14023                                                       unsigned NumElements,
14024                                                  SourceLocation AttributeLoc) {
14025   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14026                           NumElements, true);
14027   IntegerLiteral *VectorSize
14028     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
14029                              AttributeLoc);
14030   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
14031 }
14032 
14033 template<typename Derived>
14034 QualType
14035 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
14036                                                            Expr *SizeExpr,
14037                                                   SourceLocation AttributeLoc) {
14038   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
14039 }
14040 
14041 template <typename Derived>
14042 QualType TreeTransform<Derived>::RebuildConstantMatrixType(
14043     QualType ElementType, unsigned NumRows, unsigned NumColumns) {
14044   return SemaRef.Context.getConstantMatrixType(ElementType, NumRows,
14045                                                NumColumns);
14046 }
14047 
14048 template <typename Derived>
14049 QualType TreeTransform<Derived>::RebuildDependentSizedMatrixType(
14050     QualType ElementType, Expr *RowExpr, Expr *ColumnExpr,
14051     SourceLocation AttributeLoc) {
14052   return SemaRef.BuildMatrixType(ElementType, RowExpr, ColumnExpr,
14053                                  AttributeLoc);
14054 }
14055 
14056 template<typename Derived>
14057 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
14058     QualType T,
14059     MutableArrayRef<QualType> ParamTypes,
14060     const FunctionProtoType::ExtProtoInfo &EPI) {
14061   return SemaRef.BuildFunctionType(T, ParamTypes,
14062                                    getDerived().getBaseLocation(),
14063                                    getDerived().getBaseEntity(),
14064                                    EPI);
14065 }
14066 
14067 template<typename Derived>
14068 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
14069   return SemaRef.Context.getFunctionNoProtoType(T);
14070 }
14071 
14072 template<typename Derived>
14073 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
14074                                                             Decl *D) {
14075   assert(D && "no decl found");
14076   if (D->isInvalidDecl()) return QualType();
14077 
14078   // FIXME: Doesn't account for ObjCInterfaceDecl!
14079   TypeDecl *Ty;
14080   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
14081     // A valid resolved using typename pack expansion decl can have multiple
14082     // UsingDecls, but they must each have exactly one type, and it must be
14083     // the same type in every case. But we must have at least one expansion!
14084     if (UPD->expansions().empty()) {
14085       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
14086           << UPD->isCXXClassMember() << UPD;
14087       return QualType();
14088     }
14089 
14090     // We might still have some unresolved types. Try to pick a resolved type
14091     // if we can. The final instantiation will check that the remaining
14092     // unresolved types instantiate to the type we pick.
14093     QualType FallbackT;
14094     QualType T;
14095     for (auto *E : UPD->expansions()) {
14096       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
14097       if (ThisT.isNull())
14098         continue;
14099       else if (ThisT->getAs<UnresolvedUsingType>())
14100         FallbackT = ThisT;
14101       else if (T.isNull())
14102         T = ThisT;
14103       else
14104         assert(getSema().Context.hasSameType(ThisT, T) &&
14105                "mismatched resolved types in using pack expansion");
14106     }
14107     return T.isNull() ? FallbackT : T;
14108   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
14109     assert(Using->hasTypename() &&
14110            "UnresolvedUsingTypenameDecl transformed to non-typename using");
14111 
14112     // A valid resolved using typename decl points to exactly one type decl.
14113     assert(++Using->shadow_begin() == Using->shadow_end());
14114     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
14115   } else {
14116     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
14117            "UnresolvedUsingTypenameDecl transformed to non-using decl");
14118     Ty = cast<UnresolvedUsingTypenameDecl>(D);
14119   }
14120 
14121   return SemaRef.Context.getTypeDeclType(Ty);
14122 }
14123 
14124 template<typename Derived>
14125 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
14126                                                        SourceLocation Loc) {
14127   return SemaRef.BuildTypeofExprType(E, Loc);
14128 }
14129 
14130 template<typename Derived>
14131 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
14132   return SemaRef.Context.getTypeOfType(Underlying);
14133 }
14134 
14135 template<typename Derived>
14136 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
14137                                                      SourceLocation Loc) {
14138   return SemaRef.BuildDecltypeType(E, Loc);
14139 }
14140 
14141 template<typename Derived>
14142 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
14143                                             UnaryTransformType::UTTKind UKind,
14144                                             SourceLocation Loc) {
14145   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
14146 }
14147 
14148 template<typename Derived>
14149 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
14150                                                       TemplateName Template,
14151                                              SourceLocation TemplateNameLoc,
14152                                      TemplateArgumentListInfo &TemplateArgs) {
14153   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
14154 }
14155 
14156 template<typename Derived>
14157 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
14158                                                    SourceLocation KWLoc) {
14159   return SemaRef.BuildAtomicType(ValueType, KWLoc);
14160 }
14161 
14162 template<typename Derived>
14163 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
14164                                                  SourceLocation KWLoc,
14165                                                  bool isReadPipe) {
14166   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
14167                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
14168 }
14169 
14170 template <typename Derived>
14171 QualType TreeTransform<Derived>::RebuildExtIntType(bool IsUnsigned,
14172                                                    unsigned NumBits,
14173                                                    SourceLocation Loc) {
14174   llvm::APInt NumBitsAP(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
14175                         NumBits, true);
14176   IntegerLiteral *Bits = IntegerLiteral::Create(SemaRef.Context, NumBitsAP,
14177                                                 SemaRef.Context.IntTy, Loc);
14178   return SemaRef.BuildExtIntType(IsUnsigned, Bits, Loc);
14179 }
14180 
14181 template <typename Derived>
14182 QualType TreeTransform<Derived>::RebuildDependentExtIntType(
14183     bool IsUnsigned, Expr *NumBitsExpr, SourceLocation Loc) {
14184   return SemaRef.BuildExtIntType(IsUnsigned, NumBitsExpr, Loc);
14185 }
14186 
14187 template<typename Derived>
14188 TemplateName
14189 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14190                                             bool TemplateKW,
14191                                             TemplateDecl *Template) {
14192   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
14193                                                   Template);
14194 }
14195 
14196 template<typename Derived>
14197 TemplateName
14198 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14199                                             SourceLocation TemplateKWLoc,
14200                                             const IdentifierInfo &Name,
14201                                             SourceLocation NameLoc,
14202                                             QualType ObjectType,
14203                                             NamedDecl *FirstQualifierInScope,
14204                                             bool AllowInjectedClassName) {
14205   UnqualifiedId TemplateName;
14206   TemplateName.setIdentifier(&Name, NameLoc);
14207   Sema::TemplateTy Template;
14208   getSema().ActOnTemplateName(/*Scope=*/nullptr, SS, TemplateKWLoc,
14209                               TemplateName, ParsedType::make(ObjectType),
14210                               /*EnteringContext=*/false, Template,
14211                               AllowInjectedClassName);
14212   return Template.get();
14213 }
14214 
14215 template<typename Derived>
14216 TemplateName
14217 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
14218                                             SourceLocation TemplateKWLoc,
14219                                             OverloadedOperatorKind Operator,
14220                                             SourceLocation NameLoc,
14221                                             QualType ObjectType,
14222                                             bool AllowInjectedClassName) {
14223   UnqualifiedId Name;
14224   // FIXME: Bogus location information.
14225   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
14226   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
14227   Sema::TemplateTy Template;
14228   getSema().ActOnTemplateName(
14229       /*Scope=*/nullptr, SS, TemplateKWLoc, Name, ParsedType::make(ObjectType),
14230       /*EnteringContext=*/false, Template, AllowInjectedClassName);
14231   return Template.get();
14232 }
14233 
14234 template<typename Derived>
14235 ExprResult
14236 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
14237                                                    SourceLocation OpLoc,
14238                                                    Expr *OrigCallee,
14239                                                    Expr *First,
14240                                                    Expr *Second) {
14241   Expr *Callee = OrigCallee->IgnoreParenCasts();
14242   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
14243 
14244   if (First->getObjectKind() == OK_ObjCProperty) {
14245     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14246     if (BinaryOperator::isAssignmentOp(Opc))
14247       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
14248                                                  First, Second);
14249     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
14250     if (Result.isInvalid())
14251       return ExprError();
14252     First = Result.get();
14253   }
14254 
14255   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
14256     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
14257     if (Result.isInvalid())
14258       return ExprError();
14259     Second = Result.get();
14260   }
14261 
14262   // Determine whether this should be a builtin operation.
14263   if (Op == OO_Subscript) {
14264     if (!First->getType()->isOverloadableType() &&
14265         !Second->getType()->isOverloadableType())
14266       return getSema().CreateBuiltinArraySubscriptExpr(
14267           First, Callee->getBeginLoc(), Second, OpLoc);
14268   } else if (Op == OO_Arrow) {
14269     // -> is never a builtin operation.
14270     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
14271   } else if (Second == nullptr || isPostIncDec) {
14272     if (!First->getType()->isOverloadableType() ||
14273         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
14274       // The argument is not of overloadable type, or this is an expression
14275       // of the form &Class::member, so try to create a built-in unary
14276       // operation.
14277       UnaryOperatorKind Opc
14278         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14279 
14280       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
14281     }
14282   } else {
14283     if (!First->getType()->isOverloadableType() &&
14284         !Second->getType()->isOverloadableType()) {
14285       // Neither of the arguments is an overloadable type, so try to
14286       // create a built-in binary operation.
14287       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14288       ExprResult Result
14289         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
14290       if (Result.isInvalid())
14291         return ExprError();
14292 
14293       return Result;
14294     }
14295   }
14296 
14297   // Compute the transformed set of functions (and function templates) to be
14298   // used during overload resolution.
14299   UnresolvedSet<16> Functions;
14300   bool RequiresADL;
14301 
14302   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
14303     Functions.append(ULE->decls_begin(), ULE->decls_end());
14304     // If the overload could not be resolved in the template definition
14305     // (because we had a dependent argument), ADL is performed as part of
14306     // template instantiation.
14307     RequiresADL = ULE->requiresADL();
14308   } else {
14309     // If we've resolved this to a particular non-member function, just call
14310     // that function. If we resolved it to a member function,
14311     // CreateOverloaded* will find that function for us.
14312     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
14313     if (!isa<CXXMethodDecl>(ND))
14314       Functions.addDecl(ND);
14315     RequiresADL = false;
14316   }
14317 
14318   // Add any functions found via argument-dependent lookup.
14319   Expr *Args[2] = { First, Second };
14320   unsigned NumArgs = 1 + (Second != nullptr);
14321 
14322   // Create the overloaded operator invocation for unary operators.
14323   if (NumArgs == 1 || isPostIncDec) {
14324     UnaryOperatorKind Opc
14325       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
14326     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
14327                                            RequiresADL);
14328   }
14329 
14330   if (Op == OO_Subscript) {
14331     SourceLocation LBrace;
14332     SourceLocation RBrace;
14333 
14334     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
14335         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
14336         LBrace = SourceLocation::getFromRawEncoding(
14337                     NameLoc.CXXOperatorName.BeginOpNameLoc);
14338         RBrace = SourceLocation::getFromRawEncoding(
14339                     NameLoc.CXXOperatorName.EndOpNameLoc);
14340     } else {
14341       LBrace = Callee->getBeginLoc();
14342       RBrace = OpLoc;
14343     }
14344 
14345     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
14346                                                       First, Second);
14347   }
14348 
14349   // Create the overloaded operator invocation for binary operators.
14350   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
14351   ExprResult Result = SemaRef.CreateOverloadedBinOp(
14352       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
14353   if (Result.isInvalid())
14354     return ExprError();
14355 
14356   return Result;
14357 }
14358 
14359 template<typename Derived>
14360 ExprResult
14361 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
14362                                                      SourceLocation OperatorLoc,
14363                                                        bool isArrow,
14364                                                        CXXScopeSpec &SS,
14365                                                      TypeSourceInfo *ScopeType,
14366                                                        SourceLocation CCLoc,
14367                                                        SourceLocation TildeLoc,
14368                                         PseudoDestructorTypeStorage Destroyed) {
14369   QualType BaseType = Base->getType();
14370   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
14371       (!isArrow && !BaseType->getAs<RecordType>()) ||
14372       (isArrow && BaseType->getAs<PointerType>() &&
14373        !BaseType->castAs<PointerType>()->getPointeeType()
14374                                               ->template getAs<RecordType>())){
14375     // This pseudo-destructor expression is still a pseudo-destructor.
14376     return SemaRef.BuildPseudoDestructorExpr(
14377         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
14378         CCLoc, TildeLoc, Destroyed);
14379   }
14380 
14381   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
14382   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
14383                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
14384   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
14385   NameInfo.setNamedTypeInfo(DestroyedType);
14386 
14387   // The scope type is now known to be a valid nested name specifier
14388   // component. Tack it on to the end of the nested name specifier.
14389   if (ScopeType) {
14390     if (!ScopeType->getType()->getAs<TagType>()) {
14391       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
14392                      diag::err_expected_class_or_namespace)
14393           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
14394       return ExprError();
14395     }
14396     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
14397               CCLoc);
14398   }
14399 
14400   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
14401   return getSema().BuildMemberReferenceExpr(Base, BaseType,
14402                                             OperatorLoc, isArrow,
14403                                             SS, TemplateKWLoc,
14404                                             /*FIXME: FirstQualifier*/ nullptr,
14405                                             NameInfo,
14406                                             /*TemplateArgs*/ nullptr,
14407                                             /*S*/nullptr);
14408 }
14409 
14410 template<typename Derived>
14411 StmtResult
14412 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
14413   SourceLocation Loc = S->getBeginLoc();
14414   CapturedDecl *CD = S->getCapturedDecl();
14415   unsigned NumParams = CD->getNumParams();
14416   unsigned ContextParamPos = CD->getContextParamPosition();
14417   SmallVector<Sema::CapturedParamNameType, 4> Params;
14418   for (unsigned I = 0; I < NumParams; ++I) {
14419     if (I != ContextParamPos) {
14420       Params.push_back(
14421              std::make_pair(
14422                   CD->getParam(I)->getName(),
14423                   getDerived().TransformType(CD->getParam(I)->getType())));
14424     } else {
14425       Params.push_back(std::make_pair(StringRef(), QualType()));
14426     }
14427   }
14428   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
14429                                      S->getCapturedRegionKind(), Params);
14430   StmtResult Body;
14431   {
14432     Sema::CompoundScopeRAII CompoundScope(getSema());
14433     Body = getDerived().TransformStmt(S->getCapturedStmt());
14434   }
14435 
14436   if (Body.isInvalid()) {
14437     getSema().ActOnCapturedRegionError();
14438     return StmtError();
14439   }
14440 
14441   return getSema().ActOnCapturedRegionEnd(Body.get());
14442 }
14443 
14444 } // end namespace clang
14445 
14446 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
14447