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/ExprCXX.h"
23 #include "clang/AST/ExprObjC.h"
24 #include "clang/AST/ExprOpenMP.h"
25 #include "clang/AST/Stmt.h"
26 #include "clang/AST/StmtCXX.h"
27 #include "clang/AST/StmtObjC.h"
28 #include "clang/AST/StmtOpenMP.h"
29 #include "clang/Sema/Designator.h"
30 #include "clang/Sema/Lookup.h"
31 #include "clang/Sema/Ownership.h"
32 #include "clang/Sema/ParsedTemplate.h"
33 #include "clang/Sema/ScopeInfo.h"
34 #include "clang/Sema/SemaDiagnostic.h"
35 #include "clang/Sema/SemaInternal.h"
36 #include "llvm/ADT/ArrayRef.h"
37 #include "llvm/Support/ErrorHandling.h"
38 #include <algorithm>
39 
40 namespace clang {
41 using namespace sema;
42 
43 /// A semantic tree transformation that allows one to transform one
44 /// abstract syntax tree into another.
45 ///
46 /// A new tree transformation is defined by creating a new subclass \c X of
47 /// \c TreeTransform<X> and then overriding certain operations to provide
48 /// behavior specific to that transformation. For example, template
49 /// instantiation is implemented as a tree transformation where the
50 /// transformation of TemplateTypeParmType nodes involves substituting the
51 /// template arguments for their corresponding template parameters; a similar
52 /// transformation is performed for non-type template parameters and
53 /// template template parameters.
54 ///
55 /// This tree-transformation template uses static polymorphism to allow
56 /// subclasses to customize any of its operations. Thus, a subclass can
57 /// override any of the transformation or rebuild operators by providing an
58 /// operation with the same signature as the default implementation. The
59 /// overriding function should not be virtual.
60 ///
61 /// Semantic tree transformations are split into two stages, either of which
62 /// can be replaced by a subclass. The "transform" step transforms an AST node
63 /// or the parts of an AST node using the various transformation functions,
64 /// then passes the pieces on to the "rebuild" step, which constructs a new AST
65 /// node of the appropriate kind from the pieces. The default transformation
66 /// routines recursively transform the operands to composite AST nodes (e.g.,
67 /// the pointee type of a PointerType node) and, if any of those operand nodes
68 /// were changed by the transformation, invokes the rebuild operation to create
69 /// a new AST node.
70 ///
71 /// Subclasses can customize the transformation at various levels. The
72 /// most coarse-grained transformations involve replacing TransformType(),
73 /// TransformExpr(), TransformDecl(), TransformNestedNameSpecifierLoc(),
74 /// TransformTemplateName(), or TransformTemplateArgument() with entirely
75 /// new implementations.
76 ///
77 /// For more fine-grained transformations, subclasses can replace any of the
78 /// \c TransformXXX functions (where XXX is the name of an AST node, e.g.,
79 /// PointerType, StmtExpr) to alter the transformation. As mentioned previously,
80 /// replacing TransformTemplateTypeParmType() allows template instantiation
81 /// to substitute template arguments for their corresponding template
82 /// parameters. Additionally, subclasses can override the \c RebuildXXX
83 /// functions to control how AST nodes are rebuilt when their operands change.
84 /// By default, \c TreeTransform will invoke semantic analysis to rebuild
85 /// AST nodes. However, certain other tree transformations (e.g, cloning) may
86 /// be able to use more efficient rebuild steps.
87 ///
88 /// There are a handful of other functions that can be overridden, allowing one
89 /// to avoid traversing nodes that don't need any transformation
90 /// (\c AlreadyTransformed()), force rebuilding AST nodes even when their
91 /// operands have not changed (\c AlwaysRebuild()), and customize the
92 /// default locations and entity names used for type-checking
93 /// (\c getBaseLocation(), \c getBaseEntity()).
94 template<typename Derived>
95 class TreeTransform {
96   /// Private RAII object that helps us forget and then re-remember
97   /// the template argument corresponding to a partially-substituted parameter
98   /// pack.
99   class ForgetPartiallySubstitutedPackRAII {
100     Derived &Self;
101     TemplateArgument Old;
102 
103   public:
104     ForgetPartiallySubstitutedPackRAII(Derived &Self) : Self(Self) {
105       Old = Self.ForgetPartiallySubstitutedPack();
106     }
107 
108     ~ForgetPartiallySubstitutedPackRAII() {
109       Self.RememberPartiallySubstitutedPack(Old);
110     }
111   };
112 
113 protected:
114   Sema &SemaRef;
115 
116   /// The set of local declarations that have been transformed, for
117   /// cases where we are forced to build new declarations within the transformer
118   /// rather than in the subclass (e.g., lambda closure types).
119   llvm::DenseMap<Decl *, Decl *> TransformedLocalDecls;
120 
121 public:
122   /// Initializes a new tree transformer.
123   TreeTransform(Sema &SemaRef) : SemaRef(SemaRef) { }
124 
125   /// Retrieves a reference to the derived class.
126   Derived &getDerived() { return static_cast<Derived&>(*this); }
127 
128   /// Retrieves a reference to the derived class.
129   const Derived &getDerived() const {
130     return static_cast<const Derived&>(*this);
131   }
132 
133   static inline ExprResult Owned(Expr *E) { return E; }
134   static inline StmtResult Owned(Stmt *S) { return S; }
135 
136   /// Retrieves a reference to the semantic analysis object used for
137   /// this tree transform.
138   Sema &getSema() const { return SemaRef; }
139 
140   /// Whether the transformation should always rebuild AST nodes, even
141   /// if none of the children have changed.
142   ///
143   /// Subclasses may override this function to specify when the transformation
144   /// should rebuild all AST nodes.
145   ///
146   /// We must always rebuild all AST nodes when performing variadic template
147   /// pack expansion, in order to avoid violating the AST invariant that each
148   /// statement node appears at most once in its containing declaration.
149   bool AlwaysRebuild() { return SemaRef.ArgumentPackSubstitutionIndex != -1; }
150 
151   /// Returns the location of the entity being transformed, if that
152   /// information was not available elsewhere in the AST.
153   ///
154   /// By default, returns no source-location information. Subclasses can
155   /// provide an alternative implementation that provides better location
156   /// information.
157   SourceLocation getBaseLocation() { return SourceLocation(); }
158 
159   /// Returns the name of the entity being transformed, if that
160   /// information was not available elsewhere in the AST.
161   ///
162   /// By default, returns an empty name. Subclasses can provide an alternative
163   /// implementation with a more precise name.
164   DeclarationName getBaseEntity() { return DeclarationName(); }
165 
166   /// Sets the "base" location and entity when that
167   /// information is known based on another transformation.
168   ///
169   /// By default, the source location and entity are ignored. Subclasses can
170   /// override this function to provide a customized implementation.
171   void setBase(SourceLocation Loc, DeclarationName Entity) { }
172 
173   /// RAII object that temporarily sets the base location and entity
174   /// used for reporting diagnostics in types.
175   class TemporaryBase {
176     TreeTransform &Self;
177     SourceLocation OldLocation;
178     DeclarationName OldEntity;
179 
180   public:
181     TemporaryBase(TreeTransform &Self, SourceLocation Location,
182                   DeclarationName Entity) : Self(Self) {
183       OldLocation = Self.getDerived().getBaseLocation();
184       OldEntity = Self.getDerived().getBaseEntity();
185 
186       if (Location.isValid())
187         Self.getDerived().setBase(Location, Entity);
188     }
189 
190     ~TemporaryBase() {
191       Self.getDerived().setBase(OldLocation, OldEntity);
192     }
193   };
194 
195   /// Determine whether the given type \p T has already been
196   /// transformed.
197   ///
198   /// Subclasses can provide an alternative implementation of this routine
199   /// to short-circuit evaluation when it is known that a given type will
200   /// not change. For example, template instantiation need not traverse
201   /// non-dependent types.
202   bool AlreadyTransformed(QualType T) {
203     return T.isNull();
204   }
205 
206   /// Determine whether the given call argument should be dropped, e.g.,
207   /// because it is a default argument.
208   ///
209   /// Subclasses can provide an alternative implementation of this routine to
210   /// determine which kinds of call arguments get dropped. By default,
211   /// CXXDefaultArgument nodes are dropped (prior to transformation).
212   bool DropCallArgument(Expr *E) {
213     return E->isDefaultArgument();
214   }
215 
216   /// Determine whether we should expand a pack expansion with the
217   /// given set of parameter packs into separate arguments by repeatedly
218   /// transforming the pattern.
219   ///
220   /// By default, the transformer never tries to expand pack expansions.
221   /// Subclasses can override this routine to provide different behavior.
222   ///
223   /// \param EllipsisLoc The location of the ellipsis that identifies the
224   /// pack expansion.
225   ///
226   /// \param PatternRange The source range that covers the entire pattern of
227   /// the pack expansion.
228   ///
229   /// \param Unexpanded The set of unexpanded parameter packs within the
230   /// pattern.
231   ///
232   /// \param ShouldExpand Will be set to \c true if the transformer should
233   /// expand the corresponding pack expansions into separate arguments. When
234   /// set, \c NumExpansions must also be set.
235   ///
236   /// \param RetainExpansion Whether the caller should add an unexpanded
237   /// pack expansion after all of the expanded arguments. This is used
238   /// when extending explicitly-specified template argument packs per
239   /// C++0x [temp.arg.explicit]p9.
240   ///
241   /// \param NumExpansions The number of separate arguments that will be in
242   /// the expanded form of the corresponding pack expansion. This is both an
243   /// input and an output parameter, which can be set by the caller if the
244   /// number of expansions is known a priori (e.g., due to a prior substitution)
245   /// and will be set by the callee when the number of expansions is known.
246   /// The callee must set this value when \c ShouldExpand is \c true; it may
247   /// set this value in other cases.
248   ///
249   /// \returns true if an error occurred (e.g., because the parameter packs
250   /// are to be instantiated with arguments of different lengths), false
251   /// otherwise. If false, \c ShouldExpand (and possibly \c NumExpansions)
252   /// must be set.
253   bool TryExpandParameterPacks(SourceLocation EllipsisLoc,
254                                SourceRange PatternRange,
255                                ArrayRef<UnexpandedParameterPack> Unexpanded,
256                                bool &ShouldExpand,
257                                bool &RetainExpansion,
258                                Optional<unsigned> &NumExpansions) {
259     ShouldExpand = false;
260     return false;
261   }
262 
263   /// "Forget" about the partially-substituted pack template argument,
264   /// when performing an instantiation that must preserve the parameter pack
265   /// use.
266   ///
267   /// This routine is meant to be overridden by the template instantiator.
268   TemplateArgument ForgetPartiallySubstitutedPack() {
269     return TemplateArgument();
270   }
271 
272   /// "Remember" the partially-substituted pack template argument
273   /// after performing an instantiation that must preserve the parameter pack
274   /// use.
275   ///
276   /// This routine is meant to be overridden by the template instantiator.
277   void RememberPartiallySubstitutedPack(TemplateArgument Arg) { }
278 
279   /// Note to the derived class when a function parameter pack is
280   /// being expanded.
281   void ExpandingFunctionParameterPack(ParmVarDecl *Pack) { }
282 
283   /// Transforms the given type into another type.
284   ///
285   /// By default, this routine transforms a type by creating a
286   /// TypeSourceInfo for it and delegating to the appropriate
287   /// function.  This is expensive, but we don't mind, because
288   /// this method is deprecated anyway;  all users should be
289   /// switched to storing TypeSourceInfos.
290   ///
291   /// \returns the transformed type.
292   QualType TransformType(QualType T);
293 
294   /// Transforms the given type-with-location into a new
295   /// type-with-location.
296   ///
297   /// By default, this routine transforms a type by delegating to the
298   /// appropriate TransformXXXType to build a new type.  Subclasses
299   /// may override this function (to take over all type
300   /// transformations) or some set of the TransformXXXType functions
301   /// to alter the transformation.
302   TypeSourceInfo *TransformType(TypeSourceInfo *DI);
303 
304   /// Transform the given type-with-location into a new
305   /// type, collecting location information in the given builder
306   /// as necessary.
307   ///
308   QualType TransformType(TypeLocBuilder &TLB, TypeLoc TL);
309 
310   /// Transform a type that is permitted to produce a
311   /// DeducedTemplateSpecializationType.
312   ///
313   /// This is used in the (relatively rare) contexts where it is acceptable
314   /// for transformation to produce a class template type with deduced
315   /// template arguments.
316   /// @{
317   QualType TransformTypeWithDeducedTST(QualType T);
318   TypeSourceInfo *TransformTypeWithDeducedTST(TypeSourceInfo *DI);
319   /// @}
320 
321   /// The reason why the value of a statement is not discarded, if any.
322   enum StmtDiscardKind {
323     SDK_Discarded,
324     SDK_NotDiscarded,
325     SDK_StmtExprResult,
326   };
327 
328   /// Transform the given statement.
329   ///
330   /// By default, this routine transforms a statement by delegating to the
331   /// appropriate TransformXXXStmt function to transform a specific kind of
332   /// statement or the TransformExpr() function to transform an expression.
333   /// Subclasses may override this function to transform statements using some
334   /// other mechanism.
335   ///
336   /// \returns the transformed statement.
337   StmtResult TransformStmt(Stmt *S, StmtDiscardKind SDK = SDK_Discarded);
338 
339   /// Transform the given statement.
340   ///
341   /// By default, this routine transforms a statement by delegating to the
342   /// appropriate TransformOMPXXXClause function to transform a specific kind
343   /// of clause. Subclasses may override this function to transform statements
344   /// using some other mechanism.
345   ///
346   /// \returns the transformed OpenMP clause.
347   OMPClause *TransformOMPClause(OMPClause *S);
348 
349   /// Transform the given attribute.
350   ///
351   /// By default, this routine transforms a statement by delegating to the
352   /// appropriate TransformXXXAttr function to transform a specific kind
353   /// of attribute. Subclasses may override this function to transform
354   /// attributed statements using some other mechanism.
355   ///
356   /// \returns the transformed attribute
357   const Attr *TransformAttr(const Attr *S);
358 
359 /// Transform the specified attribute.
360 ///
361 /// Subclasses should override the transformation of attributes with a pragma
362 /// spelling to transform expressions stored within the attribute.
363 ///
364 /// \returns the transformed attribute.
365 #define ATTR(X)
366 #define PRAGMA_SPELLING_ATTR(X)                                                \
367   const X##Attr *Transform##X##Attr(const X##Attr *R) { return R; }
368 #include "clang/Basic/AttrList.inc"
369 
370   /// Transform the given expression.
371   ///
372   /// By default, this routine transforms an expression by delegating to the
373   /// appropriate TransformXXXExpr function to build a new expression.
374   /// Subclasses may override this function to transform expressions using some
375   /// other mechanism.
376   ///
377   /// \returns the transformed expression.
378   ExprResult TransformExpr(Expr *E);
379 
380   /// Transform the given initializer.
381   ///
382   /// By default, this routine transforms an initializer by stripping off the
383   /// semantic nodes added by initialization, then passing the result to
384   /// TransformExpr or TransformExprs.
385   ///
386   /// \returns the transformed initializer.
387   ExprResult TransformInitializer(Expr *Init, bool NotCopyInit);
388 
389   /// Transform the given list of expressions.
390   ///
391   /// This routine transforms a list of expressions by invoking
392   /// \c TransformExpr() for each subexpression. However, it also provides
393   /// support for variadic templates by expanding any pack expansions (if the
394   /// derived class permits such expansion) along the way. When pack expansions
395   /// are present, the number of outputs may not equal the number of inputs.
396   ///
397   /// \param Inputs The set of expressions to be transformed.
398   ///
399   /// \param NumInputs The number of expressions in \c Inputs.
400   ///
401   /// \param IsCall If \c true, then this transform is being performed on
402   /// function-call arguments, and any arguments that should be dropped, will
403   /// be.
404   ///
405   /// \param Outputs The transformed input expressions will be added to this
406   /// vector.
407   ///
408   /// \param ArgChanged If non-NULL, will be set \c true if any argument changed
409   /// due to transformation.
410   ///
411   /// \returns true if an error occurred, false otherwise.
412   bool TransformExprs(Expr *const *Inputs, unsigned NumInputs, bool IsCall,
413                       SmallVectorImpl<Expr *> &Outputs,
414                       bool *ArgChanged = nullptr);
415 
416   /// Transform the given declaration, which is referenced from a type
417   /// or expression.
418   ///
419   /// By default, acts as the identity function on declarations, unless the
420   /// transformer has had to transform the declaration itself. Subclasses
421   /// may override this function to provide alternate behavior.
422   Decl *TransformDecl(SourceLocation Loc, Decl *D) {
423     llvm::DenseMap<Decl *, Decl *>::iterator Known
424       = TransformedLocalDecls.find(D);
425     if (Known != TransformedLocalDecls.end())
426       return Known->second;
427 
428     return D;
429   }
430 
431   /// Transform the specified condition.
432   ///
433   /// By default, this transforms the variable and expression and rebuilds
434   /// the condition.
435   Sema::ConditionResult TransformCondition(SourceLocation Loc, VarDecl *Var,
436                                            Expr *Expr,
437                                            Sema::ConditionKind Kind);
438 
439   /// Transform the attributes associated with the given declaration and
440   /// place them on the new declaration.
441   ///
442   /// By default, this operation does nothing. Subclasses may override this
443   /// behavior to transform attributes.
444   void transformAttrs(Decl *Old, Decl *New) { }
445 
446   /// Note that a local declaration has been transformed by this
447   /// transformer.
448   ///
449   /// Local declarations are typically transformed via a call to
450   /// TransformDefinition. However, in some cases (e.g., lambda expressions),
451   /// the transformer itself has to transform the declarations. This routine
452   /// can be overridden by a subclass that keeps track of such mappings.
453   void transformedLocalDecl(Decl *Old, Decl *New) {
454     TransformedLocalDecls[Old] = New;
455   }
456 
457   /// Transform the definition of the given declaration.
458   ///
459   /// By default, invokes TransformDecl() to transform the declaration.
460   /// Subclasses may override this function to provide alternate behavior.
461   Decl *TransformDefinition(SourceLocation Loc, Decl *D) {
462     return getDerived().TransformDecl(Loc, D);
463   }
464 
465   /// Transform the given declaration, which was the first part of a
466   /// nested-name-specifier in a member access expression.
467   ///
468   /// This specific declaration transformation only applies to the first
469   /// identifier in a nested-name-specifier of a member access expression, e.g.,
470   /// the \c T in \c x->T::member
471   ///
472   /// By default, invokes TransformDecl() to transform the declaration.
473   /// Subclasses may override this function to provide alternate behavior.
474   NamedDecl *TransformFirstQualifierInScope(NamedDecl *D, SourceLocation Loc) {
475     return cast_or_null<NamedDecl>(getDerived().TransformDecl(Loc, D));
476   }
477 
478   /// Transform the set of declarations in an OverloadExpr.
479   bool TransformOverloadExprDecls(OverloadExpr *Old, bool RequiresADL,
480                                   LookupResult &R);
481 
482   /// Transform the given nested-name-specifier with source-location
483   /// information.
484   ///
485   /// By default, transforms all of the types and declarations within the
486   /// nested-name-specifier. Subclasses may override this function to provide
487   /// alternate behavior.
488   NestedNameSpecifierLoc
489   TransformNestedNameSpecifierLoc(NestedNameSpecifierLoc NNS,
490                                   QualType ObjectType = QualType(),
491                                   NamedDecl *FirstQualifierInScope = nullptr);
492 
493   /// Transform the given declaration name.
494   ///
495   /// By default, transforms the types of conversion function, constructor,
496   /// and destructor names and then (if needed) rebuilds the declaration name.
497   /// Identifiers and selectors are returned unmodified. Sublcasses may
498   /// override this function to provide alternate behavior.
499   DeclarationNameInfo
500   TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo);
501 
502   /// Transform the given template name.
503   ///
504   /// \param SS The nested-name-specifier that qualifies the template
505   /// name. This nested-name-specifier must already have been transformed.
506   ///
507   /// \param Name The template name to transform.
508   ///
509   /// \param NameLoc The source location of the template name.
510   ///
511   /// \param ObjectType If we're translating a template name within a member
512   /// access expression, this is the type of the object whose member template
513   /// is being referenced.
514   ///
515   /// \param FirstQualifierInScope If the first part of a nested-name-specifier
516   /// also refers to a name within the current (lexical) scope, this is the
517   /// declaration it refers to.
518   ///
519   /// By default, transforms the template name by transforming the declarations
520   /// and nested-name-specifiers that occur within the template name.
521   /// Subclasses may override this function to provide alternate behavior.
522   TemplateName
523   TransformTemplateName(CXXScopeSpec &SS, TemplateName Name,
524                         SourceLocation NameLoc,
525                         QualType ObjectType = QualType(),
526                         NamedDecl *FirstQualifierInScope = nullptr,
527                         bool AllowInjectedClassName = false);
528 
529   /// Transform the given template argument.
530   ///
531   /// By default, this operation transforms the type, expression, or
532   /// declaration stored within the template argument and constructs a
533   /// new template argument from the transformed result. Subclasses may
534   /// override this function to provide alternate behavior.
535   ///
536   /// Returns true if there was an error.
537   bool TransformTemplateArgument(const TemplateArgumentLoc &Input,
538                                  TemplateArgumentLoc &Output,
539                                  bool Uneval = false);
540 
541   /// Transform the given set of template arguments.
542   ///
543   /// By default, this operation transforms all of the template arguments
544   /// in the input set using \c TransformTemplateArgument(), and appends
545   /// the transformed arguments to the output list.
546   ///
547   /// Note that this overload of \c TransformTemplateArguments() is merely
548   /// a convenience function. Subclasses that wish to override this behavior
549   /// should override the iterator-based member template version.
550   ///
551   /// \param Inputs The set of template arguments to be transformed.
552   ///
553   /// \param NumInputs The number of template arguments in \p Inputs.
554   ///
555   /// \param Outputs The set of transformed template arguments output by this
556   /// routine.
557   ///
558   /// Returns true if an error occurred.
559   bool TransformTemplateArguments(const TemplateArgumentLoc *Inputs,
560                                   unsigned NumInputs,
561                                   TemplateArgumentListInfo &Outputs,
562                                   bool Uneval = false) {
563     return TransformTemplateArguments(Inputs, Inputs + NumInputs, Outputs,
564                                       Uneval);
565   }
566 
567   /// Transform the given set of template arguments.
568   ///
569   /// By default, this operation transforms all of the template arguments
570   /// in the input set using \c TransformTemplateArgument(), and appends
571   /// the transformed arguments to the output list.
572   ///
573   /// \param First An iterator to the first template argument.
574   ///
575   /// \param Last An iterator one step past the last template argument.
576   ///
577   /// \param Outputs The set of transformed template arguments output by this
578   /// routine.
579   ///
580   /// Returns true if an error occurred.
581   template<typename InputIterator>
582   bool TransformTemplateArguments(InputIterator First,
583                                   InputIterator Last,
584                                   TemplateArgumentListInfo &Outputs,
585                                   bool Uneval = false);
586 
587   /// Fakes up a TemplateArgumentLoc for a given TemplateArgument.
588   void InventTemplateArgumentLoc(const TemplateArgument &Arg,
589                                  TemplateArgumentLoc &ArgLoc);
590 
591   /// Fakes up a TypeSourceInfo for a type.
592   TypeSourceInfo *InventTypeSourceInfo(QualType T) {
593     return SemaRef.Context.getTrivialTypeSourceInfo(T,
594                        getDerived().getBaseLocation());
595   }
596 
597 #define ABSTRACT_TYPELOC(CLASS, PARENT)
598 #define TYPELOC(CLASS, PARENT)                                   \
599   QualType Transform##CLASS##Type(TypeLocBuilder &TLB, CLASS##TypeLoc T);
600 #include "clang/AST/TypeLocNodes.def"
601 
602   template<typename Fn>
603   QualType TransformFunctionProtoType(TypeLocBuilder &TLB,
604                                       FunctionProtoTypeLoc TL,
605                                       CXXRecordDecl *ThisContext,
606                                       Qualifiers ThisTypeQuals,
607                                       Fn TransformExceptionSpec);
608 
609   bool TransformExceptionSpec(SourceLocation Loc,
610                               FunctionProtoType::ExceptionSpecInfo &ESI,
611                               SmallVectorImpl<QualType> &Exceptions,
612                               bool &Changed);
613 
614   StmtResult TransformSEHHandler(Stmt *Handler);
615 
616   QualType
617   TransformTemplateSpecializationType(TypeLocBuilder &TLB,
618                                       TemplateSpecializationTypeLoc TL,
619                                       TemplateName Template);
620 
621   QualType
622   TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
623                                       DependentTemplateSpecializationTypeLoc TL,
624                                                TemplateName Template,
625                                                CXXScopeSpec &SS);
626 
627   QualType TransformDependentTemplateSpecializationType(
628       TypeLocBuilder &TLB, DependentTemplateSpecializationTypeLoc TL,
629       NestedNameSpecifierLoc QualifierLoc);
630 
631   /// Transforms the parameters of a function type into the
632   /// given vectors.
633   ///
634   /// The result vectors should be kept in sync; null entries in the
635   /// variables vector are acceptable.
636   ///
637   /// Return true on error.
638   bool TransformFunctionTypeParams(
639       SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
640       const QualType *ParamTypes,
641       const FunctionProtoType::ExtParameterInfo *ParamInfos,
642       SmallVectorImpl<QualType> &PTypes, SmallVectorImpl<ParmVarDecl *> *PVars,
643       Sema::ExtParameterInfoBuilder &PInfos);
644 
645   /// Transforms a single function-type parameter.  Return null
646   /// on error.
647   ///
648   /// \param indexAdjustment - A number to add to the parameter's
649   ///   scope index;  can be negative
650   ParmVarDecl *TransformFunctionTypeParam(ParmVarDecl *OldParm,
651                                           int indexAdjustment,
652                                           Optional<unsigned> NumExpansions,
653                                           bool ExpectParameterPack);
654 
655   QualType TransformReferenceType(TypeLocBuilder &TLB, ReferenceTypeLoc TL);
656 
657   StmtResult TransformCompoundStmt(CompoundStmt *S, bool IsStmtExpr);
658   ExprResult TransformCXXNamedCastExpr(CXXNamedCastExpr *E);
659 
660   TemplateParameterList *TransformTemplateParameterList(
661         TemplateParameterList *TPL) {
662     return TPL;
663   }
664 
665   ExprResult TransformAddressOfOperand(Expr *E);
666 
667   ExprResult TransformDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E,
668                                                 bool IsAddressOfOperand,
669                                                 TypeSourceInfo **RecoveryTSI);
670 
671   ExprResult TransformParenDependentScopeDeclRefExpr(
672       ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool IsAddressOfOperand,
673       TypeSourceInfo **RecoveryTSI);
674 
675   StmtResult TransformOMPExecutableDirective(OMPExecutableDirective *S);
676 
677 // FIXME: We use LLVM_ATTRIBUTE_NOINLINE because inlining causes a ridiculous
678 // amount of stack usage with clang.
679 #define STMT(Node, Parent)                        \
680   LLVM_ATTRIBUTE_NOINLINE \
681   StmtResult Transform##Node(Node *S);
682 #define VALUESTMT(Node, Parent)                   \
683   LLVM_ATTRIBUTE_NOINLINE \
684   StmtResult Transform##Node(Node *S, StmtDiscardKind SDK);
685 #define EXPR(Node, Parent)                        \
686   LLVM_ATTRIBUTE_NOINLINE \
687   ExprResult Transform##Node(Node *E);
688 #define ABSTRACT_STMT(Stmt)
689 #include "clang/AST/StmtNodes.inc"
690 
691 #define OPENMP_CLAUSE(Name, Class)                        \
692   LLVM_ATTRIBUTE_NOINLINE \
693   OMPClause *Transform ## Class(Class *S);
694 #include "clang/Basic/OpenMPKinds.def"
695 
696   /// Build a new qualified type given its unqualified type and type location.
697   ///
698   /// By default, this routine adds type qualifiers only to types that can
699   /// have qualifiers, and silently suppresses those qualifiers that are not
700   /// permitted. Subclasses may override this routine to provide different
701   /// behavior.
702   QualType RebuildQualifiedType(QualType T, QualifiedTypeLoc TL);
703 
704   /// Build a new pointer type given its pointee type.
705   ///
706   /// By default, performs semantic analysis when building the pointer type.
707   /// Subclasses may override this routine to provide different behavior.
708   QualType RebuildPointerType(QualType PointeeType, SourceLocation Sigil);
709 
710   /// Build a new block pointer type given its pointee type.
711   ///
712   /// By default, performs semantic analysis when building the block pointer
713   /// type. Subclasses may override this routine to provide different behavior.
714   QualType RebuildBlockPointerType(QualType PointeeType, SourceLocation Sigil);
715 
716   /// Build a new reference type given the type it references.
717   ///
718   /// By default, performs semantic analysis when building the
719   /// reference type. Subclasses may override this routine to provide
720   /// different behavior.
721   ///
722   /// \param LValue whether the type was written with an lvalue sigil
723   /// or an rvalue sigil.
724   QualType RebuildReferenceType(QualType ReferentType,
725                                 bool LValue,
726                                 SourceLocation Sigil);
727 
728   /// Build a new member pointer type given the pointee type and the
729   /// class type it refers into.
730   ///
731   /// By default, performs semantic analysis when building the member pointer
732   /// type. Subclasses may override this routine to provide different behavior.
733   QualType RebuildMemberPointerType(QualType PointeeType, QualType ClassType,
734                                     SourceLocation Sigil);
735 
736   QualType RebuildObjCTypeParamType(const ObjCTypeParamDecl *Decl,
737                                     SourceLocation ProtocolLAngleLoc,
738                                     ArrayRef<ObjCProtocolDecl *> Protocols,
739                                     ArrayRef<SourceLocation> ProtocolLocs,
740                                     SourceLocation ProtocolRAngleLoc);
741 
742   /// Build an Objective-C object type.
743   ///
744   /// By default, performs semantic analysis when building the object type.
745   /// Subclasses may override this routine to provide different behavior.
746   QualType RebuildObjCObjectType(QualType BaseType,
747                                  SourceLocation Loc,
748                                  SourceLocation TypeArgsLAngleLoc,
749                                  ArrayRef<TypeSourceInfo *> TypeArgs,
750                                  SourceLocation TypeArgsRAngleLoc,
751                                  SourceLocation ProtocolLAngleLoc,
752                                  ArrayRef<ObjCProtocolDecl *> Protocols,
753                                  ArrayRef<SourceLocation> ProtocolLocs,
754                                  SourceLocation ProtocolRAngleLoc);
755 
756   /// Build a new Objective-C object pointer type given the pointee type.
757   ///
758   /// By default, directly builds the pointer type, with no additional semantic
759   /// analysis.
760   QualType RebuildObjCObjectPointerType(QualType PointeeType,
761                                         SourceLocation Star);
762 
763   /// Build a new array type given the element type, size
764   /// modifier, size of the array (if known), size expression, and index type
765   /// qualifiers.
766   ///
767   /// By default, performs semantic analysis when building the array type.
768   /// Subclasses may override this routine to provide different behavior.
769   /// Also by default, all of the other Rebuild*Array
770   QualType RebuildArrayType(QualType ElementType,
771                             ArrayType::ArraySizeModifier SizeMod,
772                             const llvm::APInt *Size,
773                             Expr *SizeExpr,
774                             unsigned IndexTypeQuals,
775                             SourceRange BracketsRange);
776 
777   /// Build a new constant array type given the element type, size
778   /// modifier, (known) size of the array, and index type qualifiers.
779   ///
780   /// By default, performs semantic analysis when building the array type.
781   /// Subclasses may override this routine to provide different behavior.
782   QualType RebuildConstantArrayType(QualType ElementType,
783                                     ArrayType::ArraySizeModifier SizeMod,
784                                     const llvm::APInt &Size,
785                                     unsigned IndexTypeQuals,
786                                     SourceRange BracketsRange);
787 
788   /// Build a new incomplete array type given the element type, size
789   /// modifier, and index type qualifiers.
790   ///
791   /// By default, performs semantic analysis when building the array type.
792   /// Subclasses may override this routine to provide different behavior.
793   QualType RebuildIncompleteArrayType(QualType ElementType,
794                                       ArrayType::ArraySizeModifier SizeMod,
795                                       unsigned IndexTypeQuals,
796                                       SourceRange BracketsRange);
797 
798   /// Build a new variable-length array type given the element type,
799   /// size modifier, size expression, and index type qualifiers.
800   ///
801   /// By default, performs semantic analysis when building the array type.
802   /// Subclasses may override this routine to provide different behavior.
803   QualType RebuildVariableArrayType(QualType ElementType,
804                                     ArrayType::ArraySizeModifier SizeMod,
805                                     Expr *SizeExpr,
806                                     unsigned IndexTypeQuals,
807                                     SourceRange BracketsRange);
808 
809   /// Build a new dependent-sized array type given the element type,
810   /// size modifier, size expression, and index type qualifiers.
811   ///
812   /// By default, performs semantic analysis when building the array type.
813   /// Subclasses may override this routine to provide different behavior.
814   QualType RebuildDependentSizedArrayType(QualType ElementType,
815                                           ArrayType::ArraySizeModifier SizeMod,
816                                           Expr *SizeExpr,
817                                           unsigned IndexTypeQuals,
818                                           SourceRange BracketsRange);
819 
820   /// Build a new vector type given the element type and
821   /// number of elements.
822   ///
823   /// By default, performs semantic analysis when building the vector type.
824   /// Subclasses may override this routine to provide different behavior.
825   QualType RebuildVectorType(QualType ElementType, unsigned NumElements,
826                              VectorType::VectorKind VecKind);
827 
828   /// Build a new potentially dependently-sized extended vector type
829   /// given the element type and number of elements.
830   ///
831   /// By default, performs semantic analysis when building the vector type.
832   /// Subclasses may override this routine to provide different behavior.
833   QualType RebuildDependentVectorType(QualType ElementType, Expr *SizeExpr,
834                                            SourceLocation AttributeLoc,
835                                            VectorType::VectorKind);
836 
837   /// Build a new extended vector type given the element type and
838   /// number of elements.
839   ///
840   /// By default, performs semantic analysis when building the vector type.
841   /// Subclasses may override this routine to provide different behavior.
842   QualType RebuildExtVectorType(QualType ElementType, unsigned NumElements,
843                                 SourceLocation AttributeLoc);
844 
845   /// Build a new potentially dependently-sized extended vector type
846   /// given the element type and number of elements.
847   ///
848   /// By default, performs semantic analysis when building the vector type.
849   /// Subclasses may override this routine to provide different behavior.
850   QualType RebuildDependentSizedExtVectorType(QualType ElementType,
851                                               Expr *SizeExpr,
852                                               SourceLocation AttributeLoc);
853 
854   /// Build a new DependentAddressSpaceType or return the pointee
855   /// type variable with the correct address space (retrieved from
856   /// AddrSpaceExpr) applied to it. The former will be returned in cases
857   /// where the address space remains dependent.
858   ///
859   /// By default, performs semantic analysis when building the type with address
860   /// space applied. Subclasses may override this routine to provide different
861   /// behavior.
862   QualType RebuildDependentAddressSpaceType(QualType PointeeType,
863                                             Expr *AddrSpaceExpr,
864                                             SourceLocation AttributeLoc);
865 
866   /// Build a new function type.
867   ///
868   /// By default, performs semantic analysis when building the function type.
869   /// Subclasses may override this routine to provide different behavior.
870   QualType RebuildFunctionProtoType(QualType T,
871                                     MutableArrayRef<QualType> ParamTypes,
872                                     const FunctionProtoType::ExtProtoInfo &EPI);
873 
874   /// Build a new unprototyped function type.
875   QualType RebuildFunctionNoProtoType(QualType ResultType);
876 
877   /// Rebuild an unresolved typename type, given the decl that
878   /// the UnresolvedUsingTypenameDecl was transformed to.
879   QualType RebuildUnresolvedUsingType(SourceLocation NameLoc, Decl *D);
880 
881   /// Build a new typedef type.
882   QualType RebuildTypedefType(TypedefNameDecl *Typedef) {
883     return SemaRef.Context.getTypeDeclType(Typedef);
884   }
885 
886   /// Build a new class/struct/union type.
887   QualType RebuildRecordType(RecordDecl *Record) {
888     return SemaRef.Context.getTypeDeclType(Record);
889   }
890 
891   /// Build a new Enum type.
892   QualType RebuildEnumType(EnumDecl *Enum) {
893     return SemaRef.Context.getTypeDeclType(Enum);
894   }
895 
896   /// Build a new typeof(expr) type.
897   ///
898   /// By default, performs semantic analysis when building the typeof type.
899   /// Subclasses may override this routine to provide different behavior.
900   QualType RebuildTypeOfExprType(Expr *Underlying, SourceLocation Loc);
901 
902   /// Build a new typeof(type) type.
903   ///
904   /// By default, builds a new TypeOfType with the given underlying type.
905   QualType RebuildTypeOfType(QualType Underlying);
906 
907   /// Build a new unary transform type.
908   QualType RebuildUnaryTransformType(QualType BaseType,
909                                      UnaryTransformType::UTTKind UKind,
910                                      SourceLocation Loc);
911 
912   /// Build a new C++11 decltype type.
913   ///
914   /// By default, performs semantic analysis when building the decltype type.
915   /// Subclasses may override this routine to provide different behavior.
916   QualType RebuildDecltypeType(Expr *Underlying, SourceLocation Loc);
917 
918   /// Build a new C++11 auto type.
919   ///
920   /// By default, builds a new AutoType with the given deduced type.
921   QualType RebuildAutoType(QualType Deduced, AutoTypeKeyword Keyword) {
922     // Note, IsDependent is always false here: we implicitly convert an 'auto'
923     // which has been deduced to a dependent type into an undeduced 'auto', so
924     // that we'll retry deduction after the transformation.
925     return SemaRef.Context.getAutoType(Deduced, Keyword,
926                                        /*IsDependent*/ false);
927   }
928 
929   /// By default, builds a new DeducedTemplateSpecializationType with the given
930   /// deduced type.
931   QualType RebuildDeducedTemplateSpecializationType(TemplateName Template,
932       QualType Deduced) {
933     return SemaRef.Context.getDeducedTemplateSpecializationType(
934         Template, Deduced, /*IsDependent*/ false);
935   }
936 
937   /// Build a new template specialization type.
938   ///
939   /// By default, performs semantic analysis when building the template
940   /// specialization type. Subclasses may override this routine to provide
941   /// different behavior.
942   QualType RebuildTemplateSpecializationType(TemplateName Template,
943                                              SourceLocation TemplateLoc,
944                                              TemplateArgumentListInfo &Args);
945 
946   /// Build a new parenthesized type.
947   ///
948   /// By default, builds a new ParenType type from the inner type.
949   /// Subclasses may override this routine to provide different behavior.
950   QualType RebuildParenType(QualType InnerType) {
951     return SemaRef.BuildParenType(InnerType);
952   }
953 
954   /// Build a new qualified name type.
955   ///
956   /// By default, builds a new ElaboratedType type from the keyword,
957   /// the nested-name-specifier and the named type.
958   /// Subclasses may override this routine to provide different behavior.
959   QualType RebuildElaboratedType(SourceLocation KeywordLoc,
960                                  ElaboratedTypeKeyword Keyword,
961                                  NestedNameSpecifierLoc QualifierLoc,
962                                  QualType Named) {
963     return SemaRef.Context.getElaboratedType(Keyword,
964                                          QualifierLoc.getNestedNameSpecifier(),
965                                              Named);
966   }
967 
968   /// Build a new typename type that refers to a template-id.
969   ///
970   /// By default, builds a new DependentNameType type from the
971   /// nested-name-specifier and the given type. Subclasses may override
972   /// this routine to provide different behavior.
973   QualType RebuildDependentTemplateSpecializationType(
974                                           ElaboratedTypeKeyword Keyword,
975                                           NestedNameSpecifierLoc QualifierLoc,
976                                           SourceLocation TemplateKWLoc,
977                                           const IdentifierInfo *Name,
978                                           SourceLocation NameLoc,
979                                           TemplateArgumentListInfo &Args,
980                                           bool AllowInjectedClassName) {
981     // Rebuild the template name.
982     // TODO: avoid TemplateName abstraction
983     CXXScopeSpec SS;
984     SS.Adopt(QualifierLoc);
985     TemplateName InstName = getDerived().RebuildTemplateName(
986         SS, TemplateKWLoc, *Name, NameLoc, QualType(), nullptr,
987         AllowInjectedClassName);
988 
989     if (InstName.isNull())
990       return QualType();
991 
992     // If it's still dependent, make a dependent specialization.
993     if (InstName.getAsDependentTemplateName())
994       return SemaRef.Context.getDependentTemplateSpecializationType(Keyword,
995                                           QualifierLoc.getNestedNameSpecifier(),
996                                                                     Name,
997                                                                     Args);
998 
999     // Otherwise, make an elaborated type wrapping a non-dependent
1000     // specialization.
1001     QualType T =
1002     getDerived().RebuildTemplateSpecializationType(InstName, NameLoc, Args);
1003     if (T.isNull()) return QualType();
1004 
1005     if (Keyword == ETK_None && QualifierLoc.getNestedNameSpecifier() == nullptr)
1006       return T;
1007 
1008     return SemaRef.Context.getElaboratedType(Keyword,
1009                                        QualifierLoc.getNestedNameSpecifier(),
1010                                              T);
1011   }
1012 
1013   /// Build a new typename type that refers to an identifier.
1014   ///
1015   /// By default, performs semantic analysis when building the typename type
1016   /// (or elaborated type). Subclasses may override this routine to provide
1017   /// different behavior.
1018   QualType RebuildDependentNameType(ElaboratedTypeKeyword Keyword,
1019                                     SourceLocation KeywordLoc,
1020                                     NestedNameSpecifierLoc QualifierLoc,
1021                                     const IdentifierInfo *Id,
1022                                     SourceLocation IdLoc,
1023                                     bool DeducedTSTContext) {
1024     CXXScopeSpec SS;
1025     SS.Adopt(QualifierLoc);
1026 
1027     if (QualifierLoc.getNestedNameSpecifier()->isDependent()) {
1028       // If the name is still dependent, just build a new dependent name type.
1029       if (!SemaRef.computeDeclContext(SS))
1030         return SemaRef.Context.getDependentNameType(Keyword,
1031                                           QualifierLoc.getNestedNameSpecifier(),
1032                                                     Id);
1033     }
1034 
1035     if (Keyword == ETK_None || Keyword == ETK_Typename) {
1036       QualType T = SemaRef.CheckTypenameType(Keyword, KeywordLoc, QualifierLoc,
1037                                              *Id, IdLoc);
1038       // If a dependent name resolves to a deduced template specialization type,
1039       // check that we're in one of the syntactic contexts permitting it.
1040       if (!DeducedTSTContext) {
1041         if (auto *Deduced = dyn_cast_or_null<DeducedTemplateSpecializationType>(
1042                 T.isNull() ? nullptr : T->getContainedDeducedType())) {
1043           SemaRef.Diag(IdLoc, diag::err_dependent_deduced_tst)
1044             << (int)SemaRef.getTemplateNameKindForDiagnostics(
1045                    Deduced->getTemplateName())
1046             << QualType(QualifierLoc.getNestedNameSpecifier()->getAsType(), 0);
1047           if (auto *TD = Deduced->getTemplateName().getAsTemplateDecl())
1048             SemaRef.Diag(TD->getLocation(), diag::note_template_decl_here);
1049           return QualType();
1050         }
1051       }
1052       return T;
1053     }
1054 
1055     TagTypeKind Kind = TypeWithKeyword::getTagTypeKindForKeyword(Keyword);
1056 
1057     // We had a dependent elaborated-type-specifier that has been transformed
1058     // into a non-dependent elaborated-type-specifier. Find the tag we're
1059     // referring to.
1060     LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1061     DeclContext *DC = SemaRef.computeDeclContext(SS, false);
1062     if (!DC)
1063       return QualType();
1064 
1065     if (SemaRef.RequireCompleteDeclContext(SS, DC))
1066       return QualType();
1067 
1068     TagDecl *Tag = nullptr;
1069     SemaRef.LookupQualifiedName(Result, DC);
1070     switch (Result.getResultKind()) {
1071       case LookupResult::NotFound:
1072       case LookupResult::NotFoundInCurrentInstantiation:
1073         break;
1074 
1075       case LookupResult::Found:
1076         Tag = Result.getAsSingle<TagDecl>();
1077         break;
1078 
1079       case LookupResult::FoundOverloaded:
1080       case LookupResult::FoundUnresolvedValue:
1081         llvm_unreachable("Tag lookup cannot find non-tags");
1082 
1083       case LookupResult::Ambiguous:
1084         // Let the LookupResult structure handle ambiguities.
1085         return QualType();
1086     }
1087 
1088     if (!Tag) {
1089       // Check where the name exists but isn't a tag type and use that to emit
1090       // better diagnostics.
1091       LookupResult Result(SemaRef, Id, IdLoc, Sema::LookupTagName);
1092       SemaRef.LookupQualifiedName(Result, DC);
1093       switch (Result.getResultKind()) {
1094         case LookupResult::Found:
1095         case LookupResult::FoundOverloaded:
1096         case LookupResult::FoundUnresolvedValue: {
1097           NamedDecl *SomeDecl = Result.getRepresentativeDecl();
1098           Sema::NonTagKind NTK = SemaRef.getNonTagTypeDeclKind(SomeDecl, Kind);
1099           SemaRef.Diag(IdLoc, diag::err_tag_reference_non_tag) << SomeDecl
1100                                                                << NTK << Kind;
1101           SemaRef.Diag(SomeDecl->getLocation(), diag::note_declared_at);
1102           break;
1103         }
1104         default:
1105           SemaRef.Diag(IdLoc, diag::err_not_tag_in_scope)
1106               << Kind << Id << DC << QualifierLoc.getSourceRange();
1107           break;
1108       }
1109       return QualType();
1110     }
1111 
1112     if (!SemaRef.isAcceptableTagRedeclaration(Tag, Kind, /*isDefinition*/false,
1113                                               IdLoc, Id)) {
1114       SemaRef.Diag(KeywordLoc, diag::err_use_with_wrong_tag) << Id;
1115       SemaRef.Diag(Tag->getLocation(), diag::note_previous_use);
1116       return QualType();
1117     }
1118 
1119     // Build the elaborated-type-specifier type.
1120     QualType T = SemaRef.Context.getTypeDeclType(Tag);
1121     return SemaRef.Context.getElaboratedType(Keyword,
1122                                          QualifierLoc.getNestedNameSpecifier(),
1123                                              T);
1124   }
1125 
1126   /// Build a new pack expansion type.
1127   ///
1128   /// By default, builds a new PackExpansionType type from the given pattern.
1129   /// Subclasses may override this routine to provide different behavior.
1130   QualType RebuildPackExpansionType(QualType Pattern,
1131                                     SourceRange PatternRange,
1132                                     SourceLocation EllipsisLoc,
1133                                     Optional<unsigned> NumExpansions) {
1134     return getSema().CheckPackExpansion(Pattern, PatternRange, EllipsisLoc,
1135                                         NumExpansions);
1136   }
1137 
1138   /// Build a new atomic type given its value type.
1139   ///
1140   /// By default, performs semantic analysis when building the atomic type.
1141   /// Subclasses may override this routine to provide different behavior.
1142   QualType RebuildAtomicType(QualType ValueType, SourceLocation KWLoc);
1143 
1144   /// Build a new pipe type given its value type.
1145   QualType RebuildPipeType(QualType ValueType, SourceLocation KWLoc,
1146                            bool isReadPipe);
1147 
1148   /// Build a new template name given a nested name specifier, a flag
1149   /// indicating whether the "template" keyword was provided, and the template
1150   /// that the template name refers to.
1151   ///
1152   /// By default, builds the new template name directly. Subclasses may override
1153   /// this routine to provide different behavior.
1154   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1155                                    bool TemplateKW,
1156                                    TemplateDecl *Template);
1157 
1158   /// Build a new template name given a nested name specifier and the
1159   /// name that is referred to as a template.
1160   ///
1161   /// By default, performs semantic analysis to determine whether the name can
1162   /// be resolved to a specific template, then builds the appropriate kind of
1163   /// template name. Subclasses may override this routine to provide different
1164   /// behavior.
1165   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1166                                    SourceLocation TemplateKWLoc,
1167                                    const IdentifierInfo &Name,
1168                                    SourceLocation NameLoc, QualType ObjectType,
1169                                    NamedDecl *FirstQualifierInScope,
1170                                    bool AllowInjectedClassName);
1171 
1172   /// Build a new template name given a nested name specifier and the
1173   /// overloaded operator name that is referred to as a template.
1174   ///
1175   /// By default, performs semantic analysis to determine whether the name can
1176   /// be resolved to a specific template, then builds the appropriate kind of
1177   /// template name. Subclasses may override this routine to provide different
1178   /// behavior.
1179   TemplateName RebuildTemplateName(CXXScopeSpec &SS,
1180                                    SourceLocation TemplateKWLoc,
1181                                    OverloadedOperatorKind Operator,
1182                                    SourceLocation NameLoc, QualType ObjectType,
1183                                    bool AllowInjectedClassName);
1184 
1185   /// Build a new template name given a template template parameter pack
1186   /// and the
1187   ///
1188   /// By default, performs semantic analysis to determine whether the name can
1189   /// be resolved to a specific template, then builds the appropriate kind of
1190   /// template name. Subclasses may override this routine to provide different
1191   /// behavior.
1192   TemplateName RebuildTemplateName(TemplateTemplateParmDecl *Param,
1193                                    const TemplateArgument &ArgPack) {
1194     return getSema().Context.getSubstTemplateTemplateParmPack(Param, ArgPack);
1195   }
1196 
1197   /// Build a new compound statement.
1198   ///
1199   /// By default, performs semantic analysis to build the new statement.
1200   /// Subclasses may override this routine to provide different behavior.
1201   StmtResult RebuildCompoundStmt(SourceLocation LBraceLoc,
1202                                        MultiStmtArg Statements,
1203                                        SourceLocation RBraceLoc,
1204                                        bool IsStmtExpr) {
1205     return getSema().ActOnCompoundStmt(LBraceLoc, RBraceLoc, Statements,
1206                                        IsStmtExpr);
1207   }
1208 
1209   /// Build a new case statement.
1210   ///
1211   /// By default, performs semantic analysis to build the new statement.
1212   /// Subclasses may override this routine to provide different behavior.
1213   StmtResult RebuildCaseStmt(SourceLocation CaseLoc,
1214                                    Expr *LHS,
1215                                    SourceLocation EllipsisLoc,
1216                                    Expr *RHS,
1217                                    SourceLocation ColonLoc) {
1218     return getSema().ActOnCaseStmt(CaseLoc, LHS, EllipsisLoc, RHS,
1219                                    ColonLoc);
1220   }
1221 
1222   /// Attach the body to a new case statement.
1223   ///
1224   /// By default, performs semantic analysis to build the new statement.
1225   /// Subclasses may override this routine to provide different behavior.
1226   StmtResult RebuildCaseStmtBody(Stmt *S, Stmt *Body) {
1227     getSema().ActOnCaseStmtBody(S, Body);
1228     return S;
1229   }
1230 
1231   /// Build a new default statement.
1232   ///
1233   /// By default, performs semantic analysis to build the new statement.
1234   /// Subclasses may override this routine to provide different behavior.
1235   StmtResult RebuildDefaultStmt(SourceLocation DefaultLoc,
1236                                       SourceLocation ColonLoc,
1237                                       Stmt *SubStmt) {
1238     return getSema().ActOnDefaultStmt(DefaultLoc, ColonLoc, SubStmt,
1239                                       /*CurScope=*/nullptr);
1240   }
1241 
1242   /// Build a new label statement.
1243   ///
1244   /// By default, performs semantic analysis to build the new statement.
1245   /// Subclasses may override this routine to provide different behavior.
1246   StmtResult RebuildLabelStmt(SourceLocation IdentLoc, LabelDecl *L,
1247                               SourceLocation ColonLoc, Stmt *SubStmt) {
1248     return SemaRef.ActOnLabelStmt(IdentLoc, L, ColonLoc, SubStmt);
1249   }
1250 
1251   /// Build a new label statement.
1252   ///
1253   /// By default, performs semantic analysis to build the new statement.
1254   /// Subclasses may override this routine to provide different behavior.
1255   StmtResult RebuildAttributedStmt(SourceLocation AttrLoc,
1256                                    ArrayRef<const Attr*> Attrs,
1257                                    Stmt *SubStmt) {
1258     return SemaRef.ActOnAttributedStmt(AttrLoc, Attrs, SubStmt);
1259   }
1260 
1261   /// Build a new "if" statement.
1262   ///
1263   /// By default, performs semantic analysis to build the new statement.
1264   /// Subclasses may override this routine to provide different behavior.
1265   StmtResult RebuildIfStmt(SourceLocation IfLoc, bool IsConstexpr,
1266                            Sema::ConditionResult Cond, Stmt *Init, Stmt *Then,
1267                            SourceLocation ElseLoc, Stmt *Else) {
1268     return getSema().ActOnIfStmt(IfLoc, IsConstexpr, Init, Cond, Then,
1269                                  ElseLoc, Else);
1270   }
1271 
1272   /// Start building a new switch statement.
1273   ///
1274   /// By default, performs semantic analysis to build the new statement.
1275   /// Subclasses may override this routine to provide different behavior.
1276   StmtResult RebuildSwitchStmtStart(SourceLocation SwitchLoc, Stmt *Init,
1277                                     Sema::ConditionResult Cond) {
1278     return getSema().ActOnStartOfSwitchStmt(SwitchLoc, Init, Cond);
1279   }
1280 
1281   /// Attach the body to the switch statement.
1282   ///
1283   /// By default, performs semantic analysis to build the new statement.
1284   /// Subclasses may override this routine to provide different behavior.
1285   StmtResult RebuildSwitchStmtBody(SourceLocation SwitchLoc,
1286                                    Stmt *Switch, Stmt *Body) {
1287     return getSema().ActOnFinishSwitchStmt(SwitchLoc, Switch, Body);
1288   }
1289 
1290   /// Build a new while statement.
1291   ///
1292   /// By default, performs semantic analysis to build the new statement.
1293   /// Subclasses may override this routine to provide different behavior.
1294   StmtResult RebuildWhileStmt(SourceLocation WhileLoc,
1295                               Sema::ConditionResult Cond, Stmt *Body) {
1296     return getSema().ActOnWhileStmt(WhileLoc, Cond, Body);
1297   }
1298 
1299   /// Build a new do-while 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 RebuildDoStmt(SourceLocation DoLoc, Stmt *Body,
1304                            SourceLocation WhileLoc, SourceLocation LParenLoc,
1305                            Expr *Cond, SourceLocation RParenLoc) {
1306     return getSema().ActOnDoStmt(DoLoc, Body, WhileLoc, LParenLoc,
1307                                  Cond, RParenLoc);
1308   }
1309 
1310   /// Build a new for statement.
1311   ///
1312   /// By default, performs semantic analysis to build the new statement.
1313   /// Subclasses may override this routine to provide different behavior.
1314   StmtResult RebuildForStmt(SourceLocation ForLoc, SourceLocation LParenLoc,
1315                             Stmt *Init, Sema::ConditionResult Cond,
1316                             Sema::FullExprArg Inc, SourceLocation RParenLoc,
1317                             Stmt *Body) {
1318     return getSema().ActOnForStmt(ForLoc, LParenLoc, Init, Cond,
1319                                   Inc, RParenLoc, Body);
1320   }
1321 
1322   /// Build a new goto statement.
1323   ///
1324   /// By default, performs semantic analysis to build the new statement.
1325   /// Subclasses may override this routine to provide different behavior.
1326   StmtResult RebuildGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc,
1327                              LabelDecl *Label) {
1328     return getSema().ActOnGotoStmt(GotoLoc, LabelLoc, Label);
1329   }
1330 
1331   /// Build a new indirect goto statement.
1332   ///
1333   /// By default, performs semantic analysis to build the new statement.
1334   /// Subclasses may override this routine to provide different behavior.
1335   StmtResult RebuildIndirectGotoStmt(SourceLocation GotoLoc,
1336                                      SourceLocation StarLoc,
1337                                      Expr *Target) {
1338     return getSema().ActOnIndirectGotoStmt(GotoLoc, StarLoc, Target);
1339   }
1340 
1341   /// Build a new return statement.
1342   ///
1343   /// By default, performs semantic analysis to build the new statement.
1344   /// Subclasses may override this routine to provide different behavior.
1345   StmtResult RebuildReturnStmt(SourceLocation ReturnLoc, Expr *Result) {
1346     return getSema().BuildReturnStmt(ReturnLoc, Result);
1347   }
1348 
1349   /// Build a new declaration statement.
1350   ///
1351   /// By default, performs semantic analysis to build the new statement.
1352   /// Subclasses may override this routine to provide different behavior.
1353   StmtResult RebuildDeclStmt(MutableArrayRef<Decl *> Decls,
1354                              SourceLocation StartLoc, SourceLocation EndLoc) {
1355     Sema::DeclGroupPtrTy DG = getSema().BuildDeclaratorGroup(Decls);
1356     return getSema().ActOnDeclStmt(DG, StartLoc, EndLoc);
1357   }
1358 
1359   /// Build a new inline asm statement.
1360   ///
1361   /// By default, performs semantic analysis to build the new statement.
1362   /// Subclasses may override this routine to provide different behavior.
1363   StmtResult RebuildGCCAsmStmt(SourceLocation AsmLoc, bool IsSimple,
1364                                bool IsVolatile, unsigned NumOutputs,
1365                                unsigned NumInputs, IdentifierInfo **Names,
1366                                MultiExprArg Constraints, MultiExprArg Exprs,
1367                                Expr *AsmString, MultiExprArg Clobbers,
1368                                SourceLocation RParenLoc) {
1369     return getSema().ActOnGCCAsmStmt(AsmLoc, IsSimple, IsVolatile, NumOutputs,
1370                                      NumInputs, Names, Constraints, Exprs,
1371                                      AsmString, Clobbers, RParenLoc);
1372   }
1373 
1374   /// Build a new MS style inline asm statement.
1375   ///
1376   /// By default, performs semantic analysis to build the new statement.
1377   /// Subclasses may override this routine to provide different behavior.
1378   StmtResult RebuildMSAsmStmt(SourceLocation AsmLoc, SourceLocation LBraceLoc,
1379                               ArrayRef<Token> AsmToks,
1380                               StringRef AsmString,
1381                               unsigned NumOutputs, unsigned NumInputs,
1382                               ArrayRef<StringRef> Constraints,
1383                               ArrayRef<StringRef> Clobbers,
1384                               ArrayRef<Expr*> Exprs,
1385                               SourceLocation EndLoc) {
1386     return getSema().ActOnMSAsmStmt(AsmLoc, LBraceLoc, AsmToks, AsmString,
1387                                     NumOutputs, NumInputs,
1388                                     Constraints, Clobbers, Exprs, EndLoc);
1389   }
1390 
1391   /// Build a new co_return statement.
1392   ///
1393   /// By default, performs semantic analysis to build the new statement.
1394   /// Subclasses may override this routine to provide different behavior.
1395   StmtResult RebuildCoreturnStmt(SourceLocation CoreturnLoc, Expr *Result,
1396                                  bool IsImplicit) {
1397     return getSema().BuildCoreturnStmt(CoreturnLoc, Result, IsImplicit);
1398   }
1399 
1400   /// Build a new co_await expression.
1401   ///
1402   /// By default, performs semantic analysis to build the new expression.
1403   /// Subclasses may override this routine to provide different behavior.
1404   ExprResult RebuildCoawaitExpr(SourceLocation CoawaitLoc, Expr *Result,
1405                                 bool IsImplicit) {
1406     return getSema().BuildResolvedCoawaitExpr(CoawaitLoc, Result, IsImplicit);
1407   }
1408 
1409   /// Build a new co_await expression.
1410   ///
1411   /// By default, performs semantic analysis to build the new expression.
1412   /// Subclasses may override this routine to provide different behavior.
1413   ExprResult RebuildDependentCoawaitExpr(SourceLocation CoawaitLoc,
1414                                          Expr *Result,
1415                                          UnresolvedLookupExpr *Lookup) {
1416     return getSema().BuildUnresolvedCoawaitExpr(CoawaitLoc, Result, Lookup);
1417   }
1418 
1419   /// Build a new co_yield expression.
1420   ///
1421   /// By default, performs semantic analysis to build the new expression.
1422   /// Subclasses may override this routine to provide different behavior.
1423   ExprResult RebuildCoyieldExpr(SourceLocation CoyieldLoc, Expr *Result) {
1424     return getSema().BuildCoyieldExpr(CoyieldLoc, Result);
1425   }
1426 
1427   StmtResult RebuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs Args) {
1428     return getSema().BuildCoroutineBodyStmt(Args);
1429   }
1430 
1431   /// Build a new Objective-C \@try statement.
1432   ///
1433   /// By default, performs semantic analysis to build the new statement.
1434   /// Subclasses may override this routine to provide different behavior.
1435   StmtResult RebuildObjCAtTryStmt(SourceLocation AtLoc,
1436                                         Stmt *TryBody,
1437                                         MultiStmtArg CatchStmts,
1438                                         Stmt *Finally) {
1439     return getSema().ActOnObjCAtTryStmt(AtLoc, TryBody, CatchStmts,
1440                                         Finally);
1441   }
1442 
1443   /// Rebuild an Objective-C exception declaration.
1444   ///
1445   /// By default, performs semantic analysis to build the new declaration.
1446   /// Subclasses may override this routine to provide different behavior.
1447   VarDecl *RebuildObjCExceptionDecl(VarDecl *ExceptionDecl,
1448                                     TypeSourceInfo *TInfo, QualType T) {
1449     return getSema().BuildObjCExceptionDecl(TInfo, T,
1450                                             ExceptionDecl->getInnerLocStart(),
1451                                             ExceptionDecl->getLocation(),
1452                                             ExceptionDecl->getIdentifier());
1453   }
1454 
1455   /// Build a new Objective-C \@catch statement.
1456   ///
1457   /// By default, performs semantic analysis to build the new statement.
1458   /// Subclasses may override this routine to provide different behavior.
1459   StmtResult RebuildObjCAtCatchStmt(SourceLocation AtLoc,
1460                                           SourceLocation RParenLoc,
1461                                           VarDecl *Var,
1462                                           Stmt *Body) {
1463     return getSema().ActOnObjCAtCatchStmt(AtLoc, RParenLoc,
1464                                           Var, Body);
1465   }
1466 
1467   /// Build a new Objective-C \@finally statement.
1468   ///
1469   /// By default, performs semantic analysis to build the new statement.
1470   /// Subclasses may override this routine to provide different behavior.
1471   StmtResult RebuildObjCAtFinallyStmt(SourceLocation AtLoc,
1472                                             Stmt *Body) {
1473     return getSema().ActOnObjCAtFinallyStmt(AtLoc, Body);
1474   }
1475 
1476   /// Build a new Objective-C \@throw statement.
1477   ///
1478   /// By default, performs semantic analysis to build the new statement.
1479   /// Subclasses may override this routine to provide different behavior.
1480   StmtResult RebuildObjCAtThrowStmt(SourceLocation AtLoc,
1481                                           Expr *Operand) {
1482     return getSema().BuildObjCAtThrowStmt(AtLoc, Operand);
1483   }
1484 
1485   /// Build a new OpenMP executable directive.
1486   ///
1487   /// By default, performs semantic analysis to build the new statement.
1488   /// Subclasses may override this routine to provide different behavior.
1489   StmtResult RebuildOMPExecutableDirective(OpenMPDirectiveKind Kind,
1490                                            DeclarationNameInfo DirName,
1491                                            OpenMPDirectiveKind CancelRegion,
1492                                            ArrayRef<OMPClause *> Clauses,
1493                                            Stmt *AStmt, SourceLocation StartLoc,
1494                                            SourceLocation EndLoc) {
1495     return getSema().ActOnOpenMPExecutableDirective(
1496         Kind, DirName, CancelRegion, Clauses, AStmt, StartLoc, EndLoc);
1497   }
1498 
1499   /// Build a new OpenMP 'if' clause.
1500   ///
1501   /// By default, performs semantic analysis to build the new OpenMP clause.
1502   /// Subclasses may override this routine to provide different behavior.
1503   OMPClause *RebuildOMPIfClause(OpenMPDirectiveKind NameModifier,
1504                                 Expr *Condition, SourceLocation StartLoc,
1505                                 SourceLocation LParenLoc,
1506                                 SourceLocation NameModifierLoc,
1507                                 SourceLocation ColonLoc,
1508                                 SourceLocation EndLoc) {
1509     return getSema().ActOnOpenMPIfClause(NameModifier, Condition, StartLoc,
1510                                          LParenLoc, NameModifierLoc, ColonLoc,
1511                                          EndLoc);
1512   }
1513 
1514   /// Build a new OpenMP 'final' clause.
1515   ///
1516   /// By default, performs semantic analysis to build the new OpenMP clause.
1517   /// Subclasses may override this routine to provide different behavior.
1518   OMPClause *RebuildOMPFinalClause(Expr *Condition, SourceLocation StartLoc,
1519                                    SourceLocation LParenLoc,
1520                                    SourceLocation EndLoc) {
1521     return getSema().ActOnOpenMPFinalClause(Condition, StartLoc, LParenLoc,
1522                                             EndLoc);
1523   }
1524 
1525   /// Build a new OpenMP 'num_threads' clause.
1526   ///
1527   /// By default, performs semantic analysis to build the new OpenMP clause.
1528   /// Subclasses may override this routine to provide different behavior.
1529   OMPClause *RebuildOMPNumThreadsClause(Expr *NumThreads,
1530                                         SourceLocation StartLoc,
1531                                         SourceLocation LParenLoc,
1532                                         SourceLocation EndLoc) {
1533     return getSema().ActOnOpenMPNumThreadsClause(NumThreads, StartLoc,
1534                                                  LParenLoc, EndLoc);
1535   }
1536 
1537   /// Build a new OpenMP 'safelen' clause.
1538   ///
1539   /// By default, performs semantic analysis to build the new OpenMP clause.
1540   /// Subclasses may override this routine to provide different behavior.
1541   OMPClause *RebuildOMPSafelenClause(Expr *Len, SourceLocation StartLoc,
1542                                      SourceLocation LParenLoc,
1543                                      SourceLocation EndLoc) {
1544     return getSema().ActOnOpenMPSafelenClause(Len, StartLoc, LParenLoc, EndLoc);
1545   }
1546 
1547   /// Build a new OpenMP 'simdlen' clause.
1548   ///
1549   /// By default, performs semantic analysis to build the new OpenMP clause.
1550   /// Subclasses may override this routine to provide different behavior.
1551   OMPClause *RebuildOMPSimdlenClause(Expr *Len, SourceLocation StartLoc,
1552                                      SourceLocation LParenLoc,
1553                                      SourceLocation EndLoc) {
1554     return getSema().ActOnOpenMPSimdlenClause(Len, StartLoc, LParenLoc, EndLoc);
1555   }
1556 
1557   /// Build a new OpenMP 'allocator' clause.
1558   ///
1559   /// By default, performs semantic analysis to build the new OpenMP clause.
1560   /// Subclasses may override this routine to provide different behavior.
1561   OMPClause *RebuildOMPAllocatorClause(Expr *A, SourceLocation StartLoc,
1562                                        SourceLocation LParenLoc,
1563                                        SourceLocation EndLoc) {
1564     return getSema().ActOnOpenMPAllocatorClause(A, StartLoc, LParenLoc, EndLoc);
1565   }
1566 
1567   /// Build a new OpenMP 'collapse' clause.
1568   ///
1569   /// By default, performs semantic analysis to build the new OpenMP clause.
1570   /// Subclasses may override this routine to provide different behavior.
1571   OMPClause *RebuildOMPCollapseClause(Expr *Num, SourceLocation StartLoc,
1572                                       SourceLocation LParenLoc,
1573                                       SourceLocation EndLoc) {
1574     return getSema().ActOnOpenMPCollapseClause(Num, StartLoc, LParenLoc,
1575                                                EndLoc);
1576   }
1577 
1578   /// Build a new OpenMP 'default' clause.
1579   ///
1580   /// By default, performs semantic analysis to build the new OpenMP clause.
1581   /// Subclasses may override this routine to provide different behavior.
1582   OMPClause *RebuildOMPDefaultClause(OpenMPDefaultClauseKind Kind,
1583                                      SourceLocation KindKwLoc,
1584                                      SourceLocation StartLoc,
1585                                      SourceLocation LParenLoc,
1586                                      SourceLocation EndLoc) {
1587     return getSema().ActOnOpenMPDefaultClause(Kind, KindKwLoc,
1588                                               StartLoc, LParenLoc, EndLoc);
1589   }
1590 
1591   /// Build a new OpenMP 'proc_bind' clause.
1592   ///
1593   /// By default, performs semantic analysis to build the new OpenMP clause.
1594   /// Subclasses may override this routine to provide different behavior.
1595   OMPClause *RebuildOMPProcBindClause(OpenMPProcBindClauseKind Kind,
1596                                       SourceLocation KindKwLoc,
1597                                       SourceLocation StartLoc,
1598                                       SourceLocation LParenLoc,
1599                                       SourceLocation EndLoc) {
1600     return getSema().ActOnOpenMPProcBindClause(Kind, KindKwLoc,
1601                                                StartLoc, LParenLoc, EndLoc);
1602   }
1603 
1604   /// Build a new OpenMP 'schedule' clause.
1605   ///
1606   /// By default, performs semantic analysis to build the new OpenMP clause.
1607   /// Subclasses may override this routine to provide different behavior.
1608   OMPClause *RebuildOMPScheduleClause(
1609       OpenMPScheduleClauseModifier M1, OpenMPScheduleClauseModifier M2,
1610       OpenMPScheduleClauseKind Kind, Expr *ChunkSize, SourceLocation StartLoc,
1611       SourceLocation LParenLoc, SourceLocation M1Loc, SourceLocation M2Loc,
1612       SourceLocation KindLoc, SourceLocation CommaLoc, SourceLocation EndLoc) {
1613     return getSema().ActOnOpenMPScheduleClause(
1614         M1, M2, Kind, ChunkSize, StartLoc, LParenLoc, M1Loc, M2Loc, KindLoc,
1615         CommaLoc, EndLoc);
1616   }
1617 
1618   /// Build a new OpenMP 'ordered' clause.
1619   ///
1620   /// By default, performs semantic analysis to build the new OpenMP clause.
1621   /// Subclasses may override this routine to provide different behavior.
1622   OMPClause *RebuildOMPOrderedClause(SourceLocation StartLoc,
1623                                      SourceLocation EndLoc,
1624                                      SourceLocation LParenLoc, Expr *Num) {
1625     return getSema().ActOnOpenMPOrderedClause(StartLoc, EndLoc, LParenLoc, Num);
1626   }
1627 
1628   /// Build a new OpenMP 'private' clause.
1629   ///
1630   /// By default, performs semantic analysis to build the new OpenMP clause.
1631   /// Subclasses may override this routine to provide different behavior.
1632   OMPClause *RebuildOMPPrivateClause(ArrayRef<Expr *> VarList,
1633                                      SourceLocation StartLoc,
1634                                      SourceLocation LParenLoc,
1635                                      SourceLocation EndLoc) {
1636     return getSema().ActOnOpenMPPrivateClause(VarList, StartLoc, LParenLoc,
1637                                               EndLoc);
1638   }
1639 
1640   /// Build a new OpenMP 'firstprivate' clause.
1641   ///
1642   /// By default, performs semantic analysis to build the new OpenMP clause.
1643   /// Subclasses may override this routine to provide different behavior.
1644   OMPClause *RebuildOMPFirstprivateClause(ArrayRef<Expr *> VarList,
1645                                           SourceLocation StartLoc,
1646                                           SourceLocation LParenLoc,
1647                                           SourceLocation EndLoc) {
1648     return getSema().ActOnOpenMPFirstprivateClause(VarList, StartLoc, LParenLoc,
1649                                                    EndLoc);
1650   }
1651 
1652   /// Build a new OpenMP 'lastprivate' clause.
1653   ///
1654   /// By default, performs semantic analysis to build the new OpenMP clause.
1655   /// Subclasses may override this routine to provide different behavior.
1656   OMPClause *RebuildOMPLastprivateClause(ArrayRef<Expr *> VarList,
1657                                          SourceLocation StartLoc,
1658                                          SourceLocation LParenLoc,
1659                                          SourceLocation EndLoc) {
1660     return getSema().ActOnOpenMPLastprivateClause(VarList, StartLoc, LParenLoc,
1661                                                   EndLoc);
1662   }
1663 
1664   /// Build a new OpenMP 'shared' clause.
1665   ///
1666   /// By default, performs semantic analysis to build the new OpenMP clause.
1667   /// Subclasses may override this routine to provide different behavior.
1668   OMPClause *RebuildOMPSharedClause(ArrayRef<Expr *> VarList,
1669                                     SourceLocation StartLoc,
1670                                     SourceLocation LParenLoc,
1671                                     SourceLocation EndLoc) {
1672     return getSema().ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc,
1673                                              EndLoc);
1674   }
1675 
1676   /// Build a new OpenMP 'reduction' clause.
1677   ///
1678   /// By default, performs semantic analysis to build the new statement.
1679   /// Subclasses may override this routine to provide different behavior.
1680   OMPClause *RebuildOMPReductionClause(ArrayRef<Expr *> VarList,
1681                                        SourceLocation StartLoc,
1682                                        SourceLocation LParenLoc,
1683                                        SourceLocation ColonLoc,
1684                                        SourceLocation EndLoc,
1685                                        CXXScopeSpec &ReductionIdScopeSpec,
1686                                        const DeclarationNameInfo &ReductionId,
1687                                        ArrayRef<Expr *> UnresolvedReductions) {
1688     return getSema().ActOnOpenMPReductionClause(
1689         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1690         ReductionId, UnresolvedReductions);
1691   }
1692 
1693   /// Build a new OpenMP 'task_reduction' clause.
1694   ///
1695   /// By default, performs semantic analysis to build the new statement.
1696   /// Subclasses may override this routine to provide different behavior.
1697   OMPClause *RebuildOMPTaskReductionClause(
1698       ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1699       SourceLocation LParenLoc, SourceLocation ColonLoc, SourceLocation EndLoc,
1700       CXXScopeSpec &ReductionIdScopeSpec,
1701       const DeclarationNameInfo &ReductionId,
1702       ArrayRef<Expr *> UnresolvedReductions) {
1703     return getSema().ActOnOpenMPTaskReductionClause(
1704         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1705         ReductionId, UnresolvedReductions);
1706   }
1707 
1708   /// Build a new OpenMP 'in_reduction' clause.
1709   ///
1710   /// By default, performs semantic analysis to build the new statement.
1711   /// Subclasses may override this routine to provide different behavior.
1712   OMPClause *
1713   RebuildOMPInReductionClause(ArrayRef<Expr *> VarList, SourceLocation StartLoc,
1714                               SourceLocation LParenLoc, SourceLocation ColonLoc,
1715                               SourceLocation EndLoc,
1716                               CXXScopeSpec &ReductionIdScopeSpec,
1717                               const DeclarationNameInfo &ReductionId,
1718                               ArrayRef<Expr *> UnresolvedReductions) {
1719     return getSema().ActOnOpenMPInReductionClause(
1720         VarList, StartLoc, LParenLoc, ColonLoc, EndLoc, ReductionIdScopeSpec,
1721         ReductionId, UnresolvedReductions);
1722   }
1723 
1724   /// Build a new OpenMP 'linear' clause.
1725   ///
1726   /// By default, performs semantic analysis to build the new OpenMP clause.
1727   /// Subclasses may override this routine to provide different behavior.
1728   OMPClause *RebuildOMPLinearClause(ArrayRef<Expr *> VarList, Expr *Step,
1729                                     SourceLocation StartLoc,
1730                                     SourceLocation LParenLoc,
1731                                     OpenMPLinearClauseKind Modifier,
1732                                     SourceLocation ModifierLoc,
1733                                     SourceLocation ColonLoc,
1734                                     SourceLocation EndLoc) {
1735     return getSema().ActOnOpenMPLinearClause(VarList, Step, StartLoc, LParenLoc,
1736                                              Modifier, ModifierLoc, ColonLoc,
1737                                              EndLoc);
1738   }
1739 
1740   /// Build a new OpenMP 'aligned' clause.
1741   ///
1742   /// By default, performs semantic analysis to build the new OpenMP clause.
1743   /// Subclasses may override this routine to provide different behavior.
1744   OMPClause *RebuildOMPAlignedClause(ArrayRef<Expr *> VarList, Expr *Alignment,
1745                                      SourceLocation StartLoc,
1746                                      SourceLocation LParenLoc,
1747                                      SourceLocation ColonLoc,
1748                                      SourceLocation EndLoc) {
1749     return getSema().ActOnOpenMPAlignedClause(VarList, Alignment, StartLoc,
1750                                               LParenLoc, ColonLoc, EndLoc);
1751   }
1752 
1753   /// Build a new OpenMP 'copyin' clause.
1754   ///
1755   /// By default, performs semantic analysis to build the new OpenMP clause.
1756   /// Subclasses may override this routine to provide different behavior.
1757   OMPClause *RebuildOMPCopyinClause(ArrayRef<Expr *> VarList,
1758                                     SourceLocation StartLoc,
1759                                     SourceLocation LParenLoc,
1760                                     SourceLocation EndLoc) {
1761     return getSema().ActOnOpenMPCopyinClause(VarList, StartLoc, LParenLoc,
1762                                              EndLoc);
1763   }
1764 
1765   /// Build a new OpenMP 'copyprivate' clause.
1766   ///
1767   /// By default, performs semantic analysis to build the new OpenMP clause.
1768   /// Subclasses may override this routine to provide different behavior.
1769   OMPClause *RebuildOMPCopyprivateClause(ArrayRef<Expr *> VarList,
1770                                          SourceLocation StartLoc,
1771                                          SourceLocation LParenLoc,
1772                                          SourceLocation EndLoc) {
1773     return getSema().ActOnOpenMPCopyprivateClause(VarList, StartLoc, LParenLoc,
1774                                                   EndLoc);
1775   }
1776 
1777   /// Build a new OpenMP 'flush' pseudo clause.
1778   ///
1779   /// By default, performs semantic analysis to build the new OpenMP clause.
1780   /// Subclasses may override this routine to provide different behavior.
1781   OMPClause *RebuildOMPFlushClause(ArrayRef<Expr *> VarList,
1782                                    SourceLocation StartLoc,
1783                                    SourceLocation LParenLoc,
1784                                    SourceLocation EndLoc) {
1785     return getSema().ActOnOpenMPFlushClause(VarList, StartLoc, LParenLoc,
1786                                             EndLoc);
1787   }
1788 
1789   /// Build a new OpenMP 'depend' pseudo clause.
1790   ///
1791   /// By default, performs semantic analysis to build the new OpenMP clause.
1792   /// Subclasses may override this routine to provide different behavior.
1793   OMPClause *
1794   RebuildOMPDependClause(OpenMPDependClauseKind DepKind, SourceLocation DepLoc,
1795                          SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1796                          SourceLocation StartLoc, SourceLocation LParenLoc,
1797                          SourceLocation EndLoc) {
1798     return getSema().ActOnOpenMPDependClause(DepKind, DepLoc, ColonLoc, VarList,
1799                                              StartLoc, LParenLoc, EndLoc);
1800   }
1801 
1802   /// Build a new OpenMP 'device' clause.
1803   ///
1804   /// By default, performs semantic analysis to build the new statement.
1805   /// Subclasses may override this routine to provide different behavior.
1806   OMPClause *RebuildOMPDeviceClause(Expr *Device, SourceLocation StartLoc,
1807                                     SourceLocation LParenLoc,
1808                                     SourceLocation EndLoc) {
1809     return getSema().ActOnOpenMPDeviceClause(Device, StartLoc, LParenLoc,
1810                                              EndLoc);
1811   }
1812 
1813   /// Build a new OpenMP 'map' clause.
1814   ///
1815   /// By default, performs semantic analysis to build the new OpenMP clause.
1816   /// Subclasses may override this routine to provide different behavior.
1817   OMPClause *RebuildOMPMapClause(
1818       ArrayRef<OpenMPMapModifierKind> MapTypeModifiers,
1819       ArrayRef<SourceLocation> MapTypeModifiersLoc,
1820       CXXScopeSpec MapperIdScopeSpec, DeclarationNameInfo MapperId,
1821       OpenMPMapClauseKind MapType, bool IsMapTypeImplicit,
1822       SourceLocation MapLoc, SourceLocation ColonLoc, ArrayRef<Expr *> VarList,
1823       const OMPVarListLocTy &Locs, ArrayRef<Expr *> UnresolvedMappers) {
1824     return getSema().ActOnOpenMPMapClause(MapTypeModifiers, MapTypeModifiersLoc,
1825                                           MapperIdScopeSpec, MapperId, MapType,
1826                                           IsMapTypeImplicit, MapLoc, ColonLoc,
1827                                           VarList, Locs, UnresolvedMappers);
1828   }
1829 
1830   /// Build a new OpenMP 'num_teams' clause.
1831   ///
1832   /// By default, performs semantic analysis to build the new statement.
1833   /// Subclasses may override this routine to provide different behavior.
1834   OMPClause *RebuildOMPNumTeamsClause(Expr *NumTeams, SourceLocation StartLoc,
1835                                       SourceLocation LParenLoc,
1836                                       SourceLocation EndLoc) {
1837     return getSema().ActOnOpenMPNumTeamsClause(NumTeams, StartLoc, LParenLoc,
1838                                                EndLoc);
1839   }
1840 
1841   /// Build a new OpenMP 'thread_limit' clause.
1842   ///
1843   /// By default, performs semantic analysis to build the new statement.
1844   /// Subclasses may override this routine to provide different behavior.
1845   OMPClause *RebuildOMPThreadLimitClause(Expr *ThreadLimit,
1846                                          SourceLocation StartLoc,
1847                                          SourceLocation LParenLoc,
1848                                          SourceLocation EndLoc) {
1849     return getSema().ActOnOpenMPThreadLimitClause(ThreadLimit, StartLoc,
1850                                                   LParenLoc, EndLoc);
1851   }
1852 
1853   /// Build a new OpenMP 'priority' clause.
1854   ///
1855   /// By default, performs semantic analysis to build the new statement.
1856   /// Subclasses may override this routine to provide different behavior.
1857   OMPClause *RebuildOMPPriorityClause(Expr *Priority, SourceLocation StartLoc,
1858                                       SourceLocation LParenLoc,
1859                                       SourceLocation EndLoc) {
1860     return getSema().ActOnOpenMPPriorityClause(Priority, StartLoc, LParenLoc,
1861                                                EndLoc);
1862   }
1863 
1864   /// Build a new OpenMP 'grainsize' clause.
1865   ///
1866   /// By default, performs semantic analysis to build the new statement.
1867   /// Subclasses may override this routine to provide different behavior.
1868   OMPClause *RebuildOMPGrainsizeClause(Expr *Grainsize, SourceLocation StartLoc,
1869                                        SourceLocation LParenLoc,
1870                                        SourceLocation EndLoc) {
1871     return getSema().ActOnOpenMPGrainsizeClause(Grainsize, StartLoc, LParenLoc,
1872                                                 EndLoc);
1873   }
1874 
1875   /// Build a new OpenMP 'num_tasks' clause.
1876   ///
1877   /// By default, performs semantic analysis to build the new statement.
1878   /// Subclasses may override this routine to provide different behavior.
1879   OMPClause *RebuildOMPNumTasksClause(Expr *NumTasks, SourceLocation StartLoc,
1880                                       SourceLocation LParenLoc,
1881                                       SourceLocation EndLoc) {
1882     return getSema().ActOnOpenMPNumTasksClause(NumTasks, StartLoc, LParenLoc,
1883                                                EndLoc);
1884   }
1885 
1886   /// Build a new OpenMP 'hint' clause.
1887   ///
1888   /// By default, performs semantic analysis to build the new statement.
1889   /// Subclasses may override this routine to provide different behavior.
1890   OMPClause *RebuildOMPHintClause(Expr *Hint, SourceLocation StartLoc,
1891                                   SourceLocation LParenLoc,
1892                                   SourceLocation EndLoc) {
1893     return getSema().ActOnOpenMPHintClause(Hint, StartLoc, LParenLoc, EndLoc);
1894   }
1895 
1896   /// Build a new OpenMP 'dist_schedule' clause.
1897   ///
1898   /// By default, performs semantic analysis to build the new OpenMP clause.
1899   /// Subclasses may override this routine to provide different behavior.
1900   OMPClause *
1901   RebuildOMPDistScheduleClause(OpenMPDistScheduleClauseKind Kind,
1902                                Expr *ChunkSize, SourceLocation StartLoc,
1903                                SourceLocation LParenLoc, SourceLocation KindLoc,
1904                                SourceLocation CommaLoc, SourceLocation EndLoc) {
1905     return getSema().ActOnOpenMPDistScheduleClause(
1906         Kind, ChunkSize, StartLoc, LParenLoc, KindLoc, CommaLoc, EndLoc);
1907   }
1908 
1909   /// Build a new OpenMP 'to' clause.
1910   ///
1911   /// By default, performs semantic analysis to build the new statement.
1912   /// Subclasses may override this routine to provide different behavior.
1913   OMPClause *RebuildOMPToClause(ArrayRef<Expr *> VarList,
1914                                 CXXScopeSpec &MapperIdScopeSpec,
1915                                 DeclarationNameInfo &MapperId,
1916                                 const OMPVarListLocTy &Locs,
1917                                 ArrayRef<Expr *> UnresolvedMappers) {
1918     return getSema().ActOnOpenMPToClause(VarList, MapperIdScopeSpec, MapperId,
1919                                          Locs, UnresolvedMappers);
1920   }
1921 
1922   /// Build a new OpenMP 'from' clause.
1923   ///
1924   /// By default, performs semantic analysis to build the new statement.
1925   /// Subclasses may override this routine to provide different behavior.
1926   OMPClause *RebuildOMPFromClause(ArrayRef<Expr *> VarList,
1927                                   CXXScopeSpec &MapperIdScopeSpec,
1928                                   DeclarationNameInfo &MapperId,
1929                                   const OMPVarListLocTy &Locs,
1930                                   ArrayRef<Expr *> UnresolvedMappers) {
1931     return getSema().ActOnOpenMPFromClause(VarList, MapperIdScopeSpec, MapperId,
1932                                            Locs, UnresolvedMappers);
1933   }
1934 
1935   /// Build a new OpenMP 'use_device_ptr' clause.
1936   ///
1937   /// By default, performs semantic analysis to build the new OpenMP clause.
1938   /// Subclasses may override this routine to provide different behavior.
1939   OMPClause *RebuildOMPUseDevicePtrClause(ArrayRef<Expr *> VarList,
1940                                           const OMPVarListLocTy &Locs) {
1941     return getSema().ActOnOpenMPUseDevicePtrClause(VarList, Locs);
1942   }
1943 
1944   /// Build a new OpenMP 'is_device_ptr' clause.
1945   ///
1946   /// By default, performs semantic analysis to build the new OpenMP clause.
1947   /// Subclasses may override this routine to provide different behavior.
1948   OMPClause *RebuildOMPIsDevicePtrClause(ArrayRef<Expr *> VarList,
1949                                          const OMPVarListLocTy &Locs) {
1950     return getSema().ActOnOpenMPIsDevicePtrClause(VarList, Locs);
1951   }
1952 
1953   /// Rebuild the operand to an Objective-C \@synchronized statement.
1954   ///
1955   /// By default, performs semantic analysis to build the new statement.
1956   /// Subclasses may override this routine to provide different behavior.
1957   ExprResult RebuildObjCAtSynchronizedOperand(SourceLocation atLoc,
1958                                               Expr *object) {
1959     return getSema().ActOnObjCAtSynchronizedOperand(atLoc, object);
1960   }
1961 
1962   /// Build a new Objective-C \@synchronized statement.
1963   ///
1964   /// By default, performs semantic analysis to build the new statement.
1965   /// Subclasses may override this routine to provide different behavior.
1966   StmtResult RebuildObjCAtSynchronizedStmt(SourceLocation AtLoc,
1967                                            Expr *Object, Stmt *Body) {
1968     return getSema().ActOnObjCAtSynchronizedStmt(AtLoc, Object, Body);
1969   }
1970 
1971   /// Build a new Objective-C \@autoreleasepool statement.
1972   ///
1973   /// By default, performs semantic analysis to build the new statement.
1974   /// Subclasses may override this routine to provide different behavior.
1975   StmtResult RebuildObjCAutoreleasePoolStmt(SourceLocation AtLoc,
1976                                             Stmt *Body) {
1977     return getSema().ActOnObjCAutoreleasePoolStmt(AtLoc, Body);
1978   }
1979 
1980   /// Build a new Objective-C fast enumeration statement.
1981   ///
1982   /// By default, performs semantic analysis to build the new statement.
1983   /// Subclasses may override this routine to provide different behavior.
1984   StmtResult RebuildObjCForCollectionStmt(SourceLocation ForLoc,
1985                                           Stmt *Element,
1986                                           Expr *Collection,
1987                                           SourceLocation RParenLoc,
1988                                           Stmt *Body) {
1989     StmtResult ForEachStmt = getSema().ActOnObjCForCollectionStmt(ForLoc,
1990                                                 Element,
1991                                                 Collection,
1992                                                 RParenLoc);
1993     if (ForEachStmt.isInvalid())
1994       return StmtError();
1995 
1996     return getSema().FinishObjCForCollectionStmt(ForEachStmt.get(), Body);
1997   }
1998 
1999   /// Build a new C++ exception declaration.
2000   ///
2001   /// By default, performs semantic analysis to build the new decaration.
2002   /// Subclasses may override this routine to provide different behavior.
2003   VarDecl *RebuildExceptionDecl(VarDecl *ExceptionDecl,
2004                                 TypeSourceInfo *Declarator,
2005                                 SourceLocation StartLoc,
2006                                 SourceLocation IdLoc,
2007                                 IdentifierInfo *Id) {
2008     VarDecl *Var = getSema().BuildExceptionDeclaration(nullptr, Declarator,
2009                                                        StartLoc, IdLoc, Id);
2010     if (Var)
2011       getSema().CurContext->addDecl(Var);
2012     return Var;
2013   }
2014 
2015   /// Build a new C++ catch statement.
2016   ///
2017   /// By default, performs semantic analysis to build the new statement.
2018   /// Subclasses may override this routine to provide different behavior.
2019   StmtResult RebuildCXXCatchStmt(SourceLocation CatchLoc,
2020                                  VarDecl *ExceptionDecl,
2021                                  Stmt *Handler) {
2022     return Owned(new (getSema().Context) CXXCatchStmt(CatchLoc, ExceptionDecl,
2023                                                       Handler));
2024   }
2025 
2026   /// Build a new C++ try statement.
2027   ///
2028   /// By default, performs semantic analysis to build the new statement.
2029   /// Subclasses may override this routine to provide different behavior.
2030   StmtResult RebuildCXXTryStmt(SourceLocation TryLoc, Stmt *TryBlock,
2031                                ArrayRef<Stmt *> Handlers) {
2032     return getSema().ActOnCXXTryBlock(TryLoc, TryBlock, Handlers);
2033   }
2034 
2035   /// Build a new C++0x range-based for statement.
2036   ///
2037   /// By default, performs semantic analysis to build the new statement.
2038   /// Subclasses may override this routine to provide different behavior.
2039   StmtResult RebuildCXXForRangeStmt(SourceLocation ForLoc,
2040                                     SourceLocation CoawaitLoc, Stmt *Init,
2041                                     SourceLocation ColonLoc, Stmt *Range,
2042                                     Stmt *Begin, Stmt *End, Expr *Cond,
2043                                     Expr *Inc, Stmt *LoopVar,
2044                                     SourceLocation RParenLoc) {
2045     // If we've just learned that the range is actually an Objective-C
2046     // collection, treat this as an Objective-C fast enumeration loop.
2047     if (DeclStmt *RangeStmt = dyn_cast<DeclStmt>(Range)) {
2048       if (RangeStmt->isSingleDecl()) {
2049         if (VarDecl *RangeVar = dyn_cast<VarDecl>(RangeStmt->getSingleDecl())) {
2050           if (RangeVar->isInvalidDecl())
2051             return StmtError();
2052 
2053           Expr *RangeExpr = RangeVar->getInit();
2054           if (!RangeExpr->isTypeDependent() &&
2055               RangeExpr->getType()->isObjCObjectPointerType()) {
2056             // FIXME: Support init-statements in Objective-C++20 ranged for
2057             // statement.
2058             if (Init) {
2059               return SemaRef.Diag(Init->getBeginLoc(),
2060                                   diag::err_objc_for_range_init_stmt)
2061                          << Init->getSourceRange();
2062             }
2063             return getSema().ActOnObjCForCollectionStmt(ForLoc, LoopVar,
2064                                                         RangeExpr, RParenLoc);
2065           }
2066         }
2067       }
2068     }
2069 
2070     return getSema().BuildCXXForRangeStmt(ForLoc, CoawaitLoc, Init, ColonLoc,
2071                                           Range, Begin, End, Cond, Inc, LoopVar,
2072                                           RParenLoc, Sema::BFRK_Rebuild);
2073   }
2074 
2075   /// Build a new C++0x range-based for statement.
2076   ///
2077   /// By default, performs semantic analysis to build the new statement.
2078   /// Subclasses may override this routine to provide different behavior.
2079   StmtResult RebuildMSDependentExistsStmt(SourceLocation KeywordLoc,
2080                                           bool IsIfExists,
2081                                           NestedNameSpecifierLoc QualifierLoc,
2082                                           DeclarationNameInfo NameInfo,
2083                                           Stmt *Nested) {
2084     return getSema().BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
2085                                                 QualifierLoc, NameInfo, Nested);
2086   }
2087 
2088   /// Attach body to a C++0x range-based for statement.
2089   ///
2090   /// By default, performs semantic analysis to finish the new statement.
2091   /// Subclasses may override this routine to provide different behavior.
2092   StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body) {
2093     return getSema().FinishCXXForRangeStmt(ForRange, Body);
2094   }
2095 
2096   StmtResult RebuildSEHTryStmt(bool IsCXXTry, SourceLocation TryLoc,
2097                                Stmt *TryBlock, Stmt *Handler) {
2098     return getSema().ActOnSEHTryBlock(IsCXXTry, TryLoc, TryBlock, Handler);
2099   }
2100 
2101   StmtResult RebuildSEHExceptStmt(SourceLocation Loc, Expr *FilterExpr,
2102                                   Stmt *Block) {
2103     return getSema().ActOnSEHExceptBlock(Loc, FilterExpr, Block);
2104   }
2105 
2106   StmtResult RebuildSEHFinallyStmt(SourceLocation Loc, Stmt *Block) {
2107     return SEHFinallyStmt::Create(getSema().getASTContext(), Loc, Block);
2108   }
2109 
2110   /// Build a new predefined expression.
2111   ///
2112   /// By default, performs semantic analysis to build the new expression.
2113   /// Subclasses may override this routine to provide different behavior.
2114   ExprResult RebuildPredefinedExpr(SourceLocation Loc,
2115                                    PredefinedExpr::IdentKind IK) {
2116     return getSema().BuildPredefinedExpr(Loc, IK);
2117   }
2118 
2119   /// Build a new expression that references a declaration.
2120   ///
2121   /// By default, performs semantic analysis to build the new expression.
2122   /// Subclasses may override this routine to provide different behavior.
2123   ExprResult RebuildDeclarationNameExpr(const CXXScopeSpec &SS,
2124                                         LookupResult &R,
2125                                         bool RequiresADL) {
2126     return getSema().BuildDeclarationNameExpr(SS, R, RequiresADL);
2127   }
2128 
2129 
2130   /// Build a new expression that references a declaration.
2131   ///
2132   /// By default, performs semantic analysis to build the new expression.
2133   /// Subclasses may override this routine to provide different behavior.
2134   ExprResult RebuildDeclRefExpr(NestedNameSpecifierLoc QualifierLoc,
2135                                 ValueDecl *VD,
2136                                 const DeclarationNameInfo &NameInfo,
2137                                 TemplateArgumentListInfo *TemplateArgs) {
2138     CXXScopeSpec SS;
2139     SS.Adopt(QualifierLoc);
2140 
2141     // FIXME: loses template args.
2142 
2143     return getSema().BuildDeclarationNameExpr(SS, NameInfo, VD);
2144   }
2145 
2146   /// Build a new expression in parentheses.
2147   ///
2148   /// By default, performs semantic analysis to build the new expression.
2149   /// Subclasses may override this routine to provide different behavior.
2150   ExprResult RebuildParenExpr(Expr *SubExpr, SourceLocation LParen,
2151                                     SourceLocation RParen) {
2152     return getSema().ActOnParenExpr(LParen, RParen, SubExpr);
2153   }
2154 
2155   /// Build a new pseudo-destructor expression.
2156   ///
2157   /// By default, performs semantic analysis to build the new expression.
2158   /// Subclasses may override this routine to provide different behavior.
2159   ExprResult RebuildCXXPseudoDestructorExpr(Expr *Base,
2160                                             SourceLocation OperatorLoc,
2161                                             bool isArrow,
2162                                             CXXScopeSpec &SS,
2163                                             TypeSourceInfo *ScopeType,
2164                                             SourceLocation CCLoc,
2165                                             SourceLocation TildeLoc,
2166                                         PseudoDestructorTypeStorage Destroyed);
2167 
2168   /// Build a new unary operator expression.
2169   ///
2170   /// By default, performs semantic analysis to build the new expression.
2171   /// Subclasses may override this routine to provide different behavior.
2172   ExprResult RebuildUnaryOperator(SourceLocation OpLoc,
2173                                         UnaryOperatorKind Opc,
2174                                         Expr *SubExpr) {
2175     return getSema().BuildUnaryOp(/*Scope=*/nullptr, OpLoc, Opc, SubExpr);
2176   }
2177 
2178   /// Build a new builtin offsetof expression.
2179   ///
2180   /// By default, performs semantic analysis to build the new expression.
2181   /// Subclasses may override this routine to provide different behavior.
2182   ExprResult RebuildOffsetOfExpr(SourceLocation OperatorLoc,
2183                                  TypeSourceInfo *Type,
2184                                  ArrayRef<Sema::OffsetOfComponent> Components,
2185                                  SourceLocation RParenLoc) {
2186     return getSema().BuildBuiltinOffsetOf(OperatorLoc, Type, Components,
2187                                           RParenLoc);
2188   }
2189 
2190   /// Build a new sizeof, alignof or vec_step expression with a
2191   /// type argument.
2192   ///
2193   /// By default, performs semantic analysis to build the new expression.
2194   /// Subclasses may override this routine to provide different behavior.
2195   ExprResult RebuildUnaryExprOrTypeTrait(TypeSourceInfo *TInfo,
2196                                          SourceLocation OpLoc,
2197                                          UnaryExprOrTypeTrait ExprKind,
2198                                          SourceRange R) {
2199     return getSema().CreateUnaryExprOrTypeTraitExpr(TInfo, OpLoc, ExprKind, R);
2200   }
2201 
2202   /// Build a new sizeof, alignof or vec step expression with an
2203   /// expression argument.
2204   ///
2205   /// By default, performs semantic analysis to build the new expression.
2206   /// Subclasses may override this routine to provide different behavior.
2207   ExprResult RebuildUnaryExprOrTypeTrait(Expr *SubExpr, SourceLocation OpLoc,
2208                                          UnaryExprOrTypeTrait ExprKind,
2209                                          SourceRange R) {
2210     ExprResult Result
2211       = getSema().CreateUnaryExprOrTypeTraitExpr(SubExpr, OpLoc, ExprKind);
2212     if (Result.isInvalid())
2213       return ExprError();
2214 
2215     return Result;
2216   }
2217 
2218   /// Build a new array subscript expression.
2219   ///
2220   /// By default, performs semantic analysis to build the new expression.
2221   /// Subclasses may override this routine to provide different behavior.
2222   ExprResult RebuildArraySubscriptExpr(Expr *LHS,
2223                                              SourceLocation LBracketLoc,
2224                                              Expr *RHS,
2225                                              SourceLocation RBracketLoc) {
2226     return getSema().ActOnArraySubscriptExpr(/*Scope=*/nullptr, LHS,
2227                                              LBracketLoc, RHS,
2228                                              RBracketLoc);
2229   }
2230 
2231   /// Build a new array section expression.
2232   ///
2233   /// By default, performs semantic analysis to build the new expression.
2234   /// Subclasses may override this routine to provide different behavior.
2235   ExprResult RebuildOMPArraySectionExpr(Expr *Base, SourceLocation LBracketLoc,
2236                                         Expr *LowerBound,
2237                                         SourceLocation ColonLoc, Expr *Length,
2238                                         SourceLocation RBracketLoc) {
2239     return getSema().ActOnOMPArraySectionExpr(Base, LBracketLoc, LowerBound,
2240                                               ColonLoc, Length, RBracketLoc);
2241   }
2242 
2243   /// Build a new call expression.
2244   ///
2245   /// By default, performs semantic analysis to build the new expression.
2246   /// Subclasses may override this routine to provide different behavior.
2247   ExprResult RebuildCallExpr(Expr *Callee, SourceLocation LParenLoc,
2248                                    MultiExprArg Args,
2249                                    SourceLocation RParenLoc,
2250                                    Expr *ExecConfig = nullptr) {
2251     return getSema().ActOnCallExpr(/*Scope=*/nullptr, Callee, LParenLoc,
2252                                    Args, RParenLoc, ExecConfig);
2253   }
2254 
2255   /// Build a new member access expression.
2256   ///
2257   /// By default, performs semantic analysis to build the new expression.
2258   /// Subclasses may override this routine to provide different behavior.
2259   ExprResult RebuildMemberExpr(Expr *Base, SourceLocation OpLoc,
2260                                bool isArrow,
2261                                NestedNameSpecifierLoc QualifierLoc,
2262                                SourceLocation TemplateKWLoc,
2263                                const DeclarationNameInfo &MemberNameInfo,
2264                                ValueDecl *Member,
2265                                NamedDecl *FoundDecl,
2266                         const TemplateArgumentListInfo *ExplicitTemplateArgs,
2267                                NamedDecl *FirstQualifierInScope) {
2268     ExprResult BaseResult = getSema().PerformMemberExprBaseConversion(Base,
2269                                                                       isArrow);
2270     if (!Member->getDeclName()) {
2271       // We have a reference to an unnamed field.  This is always the
2272       // base of an anonymous struct/union member access, i.e. the
2273       // field is always of record type.
2274       assert(Member->getType()->isRecordType() &&
2275              "unnamed member not of record type?");
2276 
2277       BaseResult =
2278         getSema().PerformObjectMemberConversion(BaseResult.get(),
2279                                                 QualifierLoc.getNestedNameSpecifier(),
2280                                                 FoundDecl, Member);
2281       if (BaseResult.isInvalid())
2282         return ExprError();
2283       Base = BaseResult.get();
2284 
2285       CXXScopeSpec EmptySS;
2286       return getSema().BuildFieldReferenceExpr(
2287           Base, isArrow, OpLoc, EmptySS, cast<FieldDecl>(Member),
2288           DeclAccessPair::make(FoundDecl, FoundDecl->getAccess()), MemberNameInfo);
2289     }
2290 
2291     CXXScopeSpec SS;
2292     SS.Adopt(QualifierLoc);
2293 
2294     Base = BaseResult.get();
2295     QualType BaseType = Base->getType();
2296 
2297     if (isArrow && !BaseType->isPointerType())
2298       return ExprError();
2299 
2300     // FIXME: this involves duplicating earlier analysis in a lot of
2301     // cases; we should avoid this when possible.
2302     LookupResult R(getSema(), MemberNameInfo, Sema::LookupMemberName);
2303     R.addDecl(FoundDecl);
2304     R.resolveKind();
2305 
2306     return getSema().BuildMemberReferenceExpr(Base, BaseType, OpLoc, isArrow,
2307                                               SS, TemplateKWLoc,
2308                                               FirstQualifierInScope,
2309                                               R, ExplicitTemplateArgs,
2310                                               /*S*/nullptr);
2311   }
2312 
2313   /// Build a new binary operator expression.
2314   ///
2315   /// By default, performs semantic analysis to build the new expression.
2316   /// Subclasses may override this routine to provide different behavior.
2317   ExprResult RebuildBinaryOperator(SourceLocation OpLoc,
2318                                          BinaryOperatorKind Opc,
2319                                          Expr *LHS, Expr *RHS) {
2320     return getSema().BuildBinOp(/*Scope=*/nullptr, OpLoc, Opc, LHS, RHS);
2321   }
2322 
2323   /// Build a new conditional operator expression.
2324   ///
2325   /// By default, performs semantic analysis to build the new expression.
2326   /// Subclasses may override this routine to provide different behavior.
2327   ExprResult RebuildConditionalOperator(Expr *Cond,
2328                                         SourceLocation QuestionLoc,
2329                                         Expr *LHS,
2330                                         SourceLocation ColonLoc,
2331                                         Expr *RHS) {
2332     return getSema().ActOnConditionalOp(QuestionLoc, ColonLoc, Cond,
2333                                         LHS, RHS);
2334   }
2335 
2336   /// Build a new C-style cast expression.
2337   ///
2338   /// By default, performs semantic analysis to build the new expression.
2339   /// Subclasses may override this routine to provide different behavior.
2340   ExprResult RebuildCStyleCastExpr(SourceLocation LParenLoc,
2341                                          TypeSourceInfo *TInfo,
2342                                          SourceLocation RParenLoc,
2343                                          Expr *SubExpr) {
2344     return getSema().BuildCStyleCastExpr(LParenLoc, TInfo, RParenLoc,
2345                                          SubExpr);
2346   }
2347 
2348   /// Build a new compound literal expression.
2349   ///
2350   /// By default, performs semantic analysis to build the new expression.
2351   /// Subclasses may override this routine to provide different behavior.
2352   ExprResult RebuildCompoundLiteralExpr(SourceLocation LParenLoc,
2353                                               TypeSourceInfo *TInfo,
2354                                               SourceLocation RParenLoc,
2355                                               Expr *Init) {
2356     return getSema().BuildCompoundLiteralExpr(LParenLoc, TInfo, RParenLoc,
2357                                               Init);
2358   }
2359 
2360   /// Build a new extended vector element access expression.
2361   ///
2362   /// By default, performs semantic analysis to build the new expression.
2363   /// Subclasses may override this routine to provide different behavior.
2364   ExprResult RebuildExtVectorElementExpr(Expr *Base,
2365                                                SourceLocation OpLoc,
2366                                                SourceLocation AccessorLoc,
2367                                                IdentifierInfo &Accessor) {
2368 
2369     CXXScopeSpec SS;
2370     DeclarationNameInfo NameInfo(&Accessor, AccessorLoc);
2371     return getSema().BuildMemberReferenceExpr(Base, Base->getType(),
2372                                               OpLoc, /*IsArrow*/ false,
2373                                               SS, SourceLocation(),
2374                                               /*FirstQualifierInScope*/ nullptr,
2375                                               NameInfo,
2376                                               /* TemplateArgs */ nullptr,
2377                                               /*S*/ nullptr);
2378   }
2379 
2380   /// Build a new initializer list expression.
2381   ///
2382   /// By default, performs semantic analysis to build the new expression.
2383   /// Subclasses may override this routine to provide different behavior.
2384   ExprResult RebuildInitList(SourceLocation LBraceLoc,
2385                              MultiExprArg Inits,
2386                              SourceLocation RBraceLoc) {
2387     return SemaRef.ActOnInitList(LBraceLoc, Inits, RBraceLoc);
2388   }
2389 
2390   /// Build a new designated initializer expression.
2391   ///
2392   /// By default, performs semantic analysis to build the new expression.
2393   /// Subclasses may override this routine to provide different behavior.
2394   ExprResult RebuildDesignatedInitExpr(Designation &Desig,
2395                                              MultiExprArg ArrayExprs,
2396                                              SourceLocation EqualOrColonLoc,
2397                                              bool GNUSyntax,
2398                                              Expr *Init) {
2399     ExprResult Result
2400       = SemaRef.ActOnDesignatedInitializer(Desig, EqualOrColonLoc, GNUSyntax,
2401                                            Init);
2402     if (Result.isInvalid())
2403       return ExprError();
2404 
2405     return Result;
2406   }
2407 
2408   /// Build a new value-initialized expression.
2409   ///
2410   /// By default, builds the implicit value initialization without performing
2411   /// any semantic analysis. Subclasses may override this routine to provide
2412   /// different behavior.
2413   ExprResult RebuildImplicitValueInitExpr(QualType T) {
2414     return new (SemaRef.Context) ImplicitValueInitExpr(T);
2415   }
2416 
2417   /// Build a new \c va_arg expression.
2418   ///
2419   /// By default, performs semantic analysis to build the new expression.
2420   /// Subclasses may override this routine to provide different behavior.
2421   ExprResult RebuildVAArgExpr(SourceLocation BuiltinLoc,
2422                                     Expr *SubExpr, TypeSourceInfo *TInfo,
2423                                     SourceLocation RParenLoc) {
2424     return getSema().BuildVAArgExpr(BuiltinLoc,
2425                                     SubExpr, TInfo,
2426                                     RParenLoc);
2427   }
2428 
2429   /// Build a new expression list in parentheses.
2430   ///
2431   /// By default, performs semantic analysis to build the new expression.
2432   /// Subclasses may override this routine to provide different behavior.
2433   ExprResult RebuildParenListExpr(SourceLocation LParenLoc,
2434                                   MultiExprArg SubExprs,
2435                                   SourceLocation RParenLoc) {
2436     return getSema().ActOnParenListExpr(LParenLoc, RParenLoc, SubExprs);
2437   }
2438 
2439   /// Build a new address-of-label expression.
2440   ///
2441   /// By default, performs semantic analysis, using the name of the label
2442   /// rather than attempting to map the label statement itself.
2443   /// Subclasses may override this routine to provide different behavior.
2444   ExprResult RebuildAddrLabelExpr(SourceLocation AmpAmpLoc,
2445                                   SourceLocation LabelLoc, LabelDecl *Label) {
2446     return getSema().ActOnAddrLabel(AmpAmpLoc, LabelLoc, Label);
2447   }
2448 
2449   /// Build a new GNU statement expression.
2450   ///
2451   /// By default, performs semantic analysis to build the new expression.
2452   /// Subclasses may override this routine to provide different behavior.
2453   ExprResult RebuildStmtExpr(SourceLocation LParenLoc,
2454                                    Stmt *SubStmt,
2455                                    SourceLocation RParenLoc) {
2456     return getSema().ActOnStmtExpr(LParenLoc, SubStmt, RParenLoc);
2457   }
2458 
2459   /// Build a new __builtin_choose_expr expression.
2460   ///
2461   /// By default, performs semantic analysis to build the new expression.
2462   /// Subclasses may override this routine to provide different behavior.
2463   ExprResult RebuildChooseExpr(SourceLocation BuiltinLoc,
2464                                      Expr *Cond, Expr *LHS, Expr *RHS,
2465                                      SourceLocation RParenLoc) {
2466     return SemaRef.ActOnChooseExpr(BuiltinLoc,
2467                                    Cond, LHS, RHS,
2468                                    RParenLoc);
2469   }
2470 
2471   /// Build a new generic selection expression.
2472   ///
2473   /// By default, performs semantic analysis to build the new expression.
2474   /// Subclasses may override this routine to provide different behavior.
2475   ExprResult RebuildGenericSelectionExpr(SourceLocation KeyLoc,
2476                                          SourceLocation DefaultLoc,
2477                                          SourceLocation RParenLoc,
2478                                          Expr *ControllingExpr,
2479                                          ArrayRef<TypeSourceInfo *> Types,
2480                                          ArrayRef<Expr *> Exprs) {
2481     return getSema().CreateGenericSelectionExpr(KeyLoc, DefaultLoc, RParenLoc,
2482                                                 ControllingExpr, Types, Exprs);
2483   }
2484 
2485   /// Build a new overloaded operator call expression.
2486   ///
2487   /// By default, performs semantic analysis to build the new expression.
2488   /// The semantic analysis provides the behavior of template instantiation,
2489   /// copying with transformations that turn what looks like an overloaded
2490   /// operator call into a use of a builtin operator, performing
2491   /// argument-dependent lookup, etc. Subclasses may override this routine to
2492   /// provide different behavior.
2493   ExprResult RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
2494                                               SourceLocation OpLoc,
2495                                               Expr *Callee,
2496                                               Expr *First,
2497                                               Expr *Second);
2498 
2499   /// Build a new C++ "named" cast expression, such as static_cast or
2500   /// reinterpret_cast.
2501   ///
2502   /// By default, this routine dispatches to one of the more-specific routines
2503   /// for a particular named case, e.g., RebuildCXXStaticCastExpr().
2504   /// Subclasses may override this routine to provide different behavior.
2505   ExprResult RebuildCXXNamedCastExpr(SourceLocation OpLoc,
2506                                            Stmt::StmtClass Class,
2507                                            SourceLocation LAngleLoc,
2508                                            TypeSourceInfo *TInfo,
2509                                            SourceLocation RAngleLoc,
2510                                            SourceLocation LParenLoc,
2511                                            Expr *SubExpr,
2512                                            SourceLocation RParenLoc) {
2513     switch (Class) {
2514     case Stmt::CXXStaticCastExprClass:
2515       return getDerived().RebuildCXXStaticCastExpr(OpLoc, LAngleLoc, TInfo,
2516                                                    RAngleLoc, LParenLoc,
2517                                                    SubExpr, RParenLoc);
2518 
2519     case Stmt::CXXDynamicCastExprClass:
2520       return getDerived().RebuildCXXDynamicCastExpr(OpLoc, LAngleLoc, TInfo,
2521                                                     RAngleLoc, LParenLoc,
2522                                                     SubExpr, RParenLoc);
2523 
2524     case Stmt::CXXReinterpretCastExprClass:
2525       return getDerived().RebuildCXXReinterpretCastExpr(OpLoc, LAngleLoc, TInfo,
2526                                                         RAngleLoc, LParenLoc,
2527                                                         SubExpr,
2528                                                         RParenLoc);
2529 
2530     case Stmt::CXXConstCastExprClass:
2531       return getDerived().RebuildCXXConstCastExpr(OpLoc, LAngleLoc, TInfo,
2532                                                    RAngleLoc, LParenLoc,
2533                                                    SubExpr, RParenLoc);
2534 
2535     default:
2536       llvm_unreachable("Invalid C++ named cast");
2537     }
2538   }
2539 
2540   /// Build a new C++ static_cast expression.
2541   ///
2542   /// By default, performs semantic analysis to build the new expression.
2543   /// Subclasses may override this routine to provide different behavior.
2544   ExprResult RebuildCXXStaticCastExpr(SourceLocation OpLoc,
2545                                             SourceLocation LAngleLoc,
2546                                             TypeSourceInfo *TInfo,
2547                                             SourceLocation RAngleLoc,
2548                                             SourceLocation LParenLoc,
2549                                             Expr *SubExpr,
2550                                             SourceLocation RParenLoc) {
2551     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_static_cast,
2552                                        TInfo, SubExpr,
2553                                        SourceRange(LAngleLoc, RAngleLoc),
2554                                        SourceRange(LParenLoc, RParenLoc));
2555   }
2556 
2557   /// Build a new C++ dynamic_cast expression.
2558   ///
2559   /// By default, performs semantic analysis to build the new expression.
2560   /// Subclasses may override this routine to provide different behavior.
2561   ExprResult RebuildCXXDynamicCastExpr(SourceLocation OpLoc,
2562                                              SourceLocation LAngleLoc,
2563                                              TypeSourceInfo *TInfo,
2564                                              SourceLocation RAngleLoc,
2565                                              SourceLocation LParenLoc,
2566                                              Expr *SubExpr,
2567                                              SourceLocation RParenLoc) {
2568     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_dynamic_cast,
2569                                        TInfo, SubExpr,
2570                                        SourceRange(LAngleLoc, RAngleLoc),
2571                                        SourceRange(LParenLoc, RParenLoc));
2572   }
2573 
2574   /// Build a new C++ reinterpret_cast 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 RebuildCXXReinterpretCastExpr(SourceLocation OpLoc,
2579                                                  SourceLocation LAngleLoc,
2580                                                  TypeSourceInfo *TInfo,
2581                                                  SourceLocation RAngleLoc,
2582                                                  SourceLocation LParenLoc,
2583                                                  Expr *SubExpr,
2584                                                  SourceLocation RParenLoc) {
2585     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_reinterpret_cast,
2586                                        TInfo, SubExpr,
2587                                        SourceRange(LAngleLoc, RAngleLoc),
2588                                        SourceRange(LParenLoc, RParenLoc));
2589   }
2590 
2591   /// Build a new C++ const_cast expression.
2592   ///
2593   /// By default, performs semantic analysis to build the new expression.
2594   /// Subclasses may override this routine to provide different behavior.
2595   ExprResult RebuildCXXConstCastExpr(SourceLocation OpLoc,
2596                                            SourceLocation LAngleLoc,
2597                                            TypeSourceInfo *TInfo,
2598                                            SourceLocation RAngleLoc,
2599                                            SourceLocation LParenLoc,
2600                                            Expr *SubExpr,
2601                                            SourceLocation RParenLoc) {
2602     return getSema().BuildCXXNamedCast(OpLoc, tok::kw_const_cast,
2603                                        TInfo, SubExpr,
2604                                        SourceRange(LAngleLoc, RAngleLoc),
2605                                        SourceRange(LParenLoc, RParenLoc));
2606   }
2607 
2608   /// Build a new C++ functional-style cast expression.
2609   ///
2610   /// By default, performs semantic analysis to build the new expression.
2611   /// Subclasses may override this routine to provide different behavior.
2612   ExprResult RebuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo,
2613                                           SourceLocation LParenLoc,
2614                                           Expr *Sub,
2615                                           SourceLocation RParenLoc,
2616                                           bool ListInitialization) {
2617     return getSema().BuildCXXTypeConstructExpr(TInfo, LParenLoc,
2618                                                MultiExprArg(&Sub, 1), RParenLoc,
2619                                                ListInitialization);
2620   }
2621 
2622   /// Build a new C++ typeid(type) expression.
2623   ///
2624   /// By default, performs semantic analysis to build the new expression.
2625   /// Subclasses may override this routine to provide different behavior.
2626   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2627                                         SourceLocation TypeidLoc,
2628                                         TypeSourceInfo *Operand,
2629                                         SourceLocation RParenLoc) {
2630     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2631                                     RParenLoc);
2632   }
2633 
2634 
2635   /// Build a new C++ typeid(expr) expression.
2636   ///
2637   /// By default, performs semantic analysis to build the new expression.
2638   /// Subclasses may override this routine to provide different behavior.
2639   ExprResult RebuildCXXTypeidExpr(QualType TypeInfoType,
2640                                         SourceLocation TypeidLoc,
2641                                         Expr *Operand,
2642                                         SourceLocation RParenLoc) {
2643     return getSema().BuildCXXTypeId(TypeInfoType, TypeidLoc, Operand,
2644                                     RParenLoc);
2645   }
2646 
2647   /// Build a new C++ __uuidof(type) expression.
2648   ///
2649   /// By default, performs semantic analysis to build the new expression.
2650   /// Subclasses may override this routine to provide different behavior.
2651   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2652                                         SourceLocation TypeidLoc,
2653                                         TypeSourceInfo *Operand,
2654                                         SourceLocation RParenLoc) {
2655     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2656                                     RParenLoc);
2657   }
2658 
2659   /// Build a new C++ __uuidof(expr) expression.
2660   ///
2661   /// By default, performs semantic analysis to build the new expression.
2662   /// Subclasses may override this routine to provide different behavior.
2663   ExprResult RebuildCXXUuidofExpr(QualType TypeInfoType,
2664                                         SourceLocation TypeidLoc,
2665                                         Expr *Operand,
2666                                         SourceLocation RParenLoc) {
2667     return getSema().BuildCXXUuidof(TypeInfoType, TypeidLoc, Operand,
2668                                     RParenLoc);
2669   }
2670 
2671   /// Build a new C++ "this" expression.
2672   ///
2673   /// By default, builds a new "this" expression without performing any
2674   /// semantic analysis. Subclasses may override this routine to provide
2675   /// different behavior.
2676   ExprResult RebuildCXXThisExpr(SourceLocation ThisLoc,
2677                                 QualType ThisType,
2678                                 bool isImplicit) {
2679     getSema().CheckCXXThisCapture(ThisLoc);
2680     return new (getSema().Context) CXXThisExpr(ThisLoc, ThisType, isImplicit);
2681   }
2682 
2683   /// Build a new C++ throw expression.
2684   ///
2685   /// By default, performs semantic analysis to build the new expression.
2686   /// Subclasses may override this routine to provide different behavior.
2687   ExprResult RebuildCXXThrowExpr(SourceLocation ThrowLoc, Expr *Sub,
2688                                  bool IsThrownVariableInScope) {
2689     return getSema().BuildCXXThrow(ThrowLoc, Sub, IsThrownVariableInScope);
2690   }
2691 
2692   /// Build a new C++ default-argument expression.
2693   ///
2694   /// By default, builds a new default-argument expression, which does not
2695   /// require any semantic analysis. Subclasses may override this routine to
2696   /// provide different behavior.
2697   ExprResult RebuildCXXDefaultArgExpr(SourceLocation Loc,
2698                                             ParmVarDecl *Param) {
2699     return CXXDefaultArgExpr::Create(getSema().Context, Loc, Param);
2700   }
2701 
2702   /// Build a new C++11 default-initialization expression.
2703   ///
2704   /// By default, builds a new default field initialization expression, which
2705   /// does not require any semantic analysis. Subclasses may override this
2706   /// routine to provide different behavior.
2707   ExprResult RebuildCXXDefaultInitExpr(SourceLocation Loc,
2708                                        FieldDecl *Field) {
2709     return CXXDefaultInitExpr::Create(getSema().Context, Loc, Field);
2710   }
2711 
2712   /// Build a new C++ zero-initialization expression.
2713   ///
2714   /// By default, performs semantic analysis to build the new expression.
2715   /// Subclasses may override this routine to provide different behavior.
2716   ExprResult RebuildCXXScalarValueInitExpr(TypeSourceInfo *TSInfo,
2717                                            SourceLocation LParenLoc,
2718                                            SourceLocation RParenLoc) {
2719     return getSema().BuildCXXTypeConstructExpr(
2720         TSInfo, LParenLoc, None, RParenLoc, /*ListInitialization=*/false);
2721   }
2722 
2723   /// Build a new C++ "new" expression.
2724   ///
2725   /// By default, performs semantic analysis to build the new expression.
2726   /// Subclasses may override this routine to provide different behavior.
2727   ExprResult RebuildCXXNewExpr(SourceLocation StartLoc,
2728                                bool UseGlobal,
2729                                SourceLocation PlacementLParen,
2730                                MultiExprArg PlacementArgs,
2731                                SourceLocation PlacementRParen,
2732                                SourceRange TypeIdParens,
2733                                QualType AllocatedType,
2734                                TypeSourceInfo *AllocatedTypeInfo,
2735                                Expr *ArraySize,
2736                                SourceRange DirectInitRange,
2737                                Expr *Initializer) {
2738     return getSema().BuildCXXNew(StartLoc, UseGlobal,
2739                                  PlacementLParen,
2740                                  PlacementArgs,
2741                                  PlacementRParen,
2742                                  TypeIdParens,
2743                                  AllocatedType,
2744                                  AllocatedTypeInfo,
2745                                  ArraySize,
2746                                  DirectInitRange,
2747                                  Initializer);
2748   }
2749 
2750   /// Build a new C++ "delete" expression.
2751   ///
2752   /// By default, performs semantic analysis to build the new expression.
2753   /// Subclasses may override this routine to provide different behavior.
2754   ExprResult RebuildCXXDeleteExpr(SourceLocation StartLoc,
2755                                         bool IsGlobalDelete,
2756                                         bool IsArrayForm,
2757                                         Expr *Operand) {
2758     return getSema().ActOnCXXDelete(StartLoc, IsGlobalDelete, IsArrayForm,
2759                                     Operand);
2760   }
2761 
2762   /// Build a new type trait expression.
2763   ///
2764   /// By default, performs semantic analysis to build the new expression.
2765   /// Subclasses may override this routine to provide different behavior.
2766   ExprResult RebuildTypeTrait(TypeTrait Trait,
2767                               SourceLocation StartLoc,
2768                               ArrayRef<TypeSourceInfo *> Args,
2769                               SourceLocation RParenLoc) {
2770     return getSema().BuildTypeTrait(Trait, StartLoc, Args, RParenLoc);
2771   }
2772 
2773   /// Build a new array type trait expression.
2774   ///
2775   /// By default, performs semantic analysis to build the new expression.
2776   /// Subclasses may override this routine to provide different behavior.
2777   ExprResult RebuildArrayTypeTrait(ArrayTypeTrait Trait,
2778                                    SourceLocation StartLoc,
2779                                    TypeSourceInfo *TSInfo,
2780                                    Expr *DimExpr,
2781                                    SourceLocation RParenLoc) {
2782     return getSema().BuildArrayTypeTrait(Trait, StartLoc, TSInfo, DimExpr, RParenLoc);
2783   }
2784 
2785   /// Build a new expression trait expression.
2786   ///
2787   /// By default, performs semantic analysis to build the new expression.
2788   /// Subclasses may override this routine to provide different behavior.
2789   ExprResult RebuildExpressionTrait(ExpressionTrait Trait,
2790                                    SourceLocation StartLoc,
2791                                    Expr *Queried,
2792                                    SourceLocation RParenLoc) {
2793     return getSema().BuildExpressionTrait(Trait, StartLoc, Queried, RParenLoc);
2794   }
2795 
2796   /// Build a new (previously unresolved) declaration reference
2797   /// expression.
2798   ///
2799   /// By default, performs semantic analysis to build the new expression.
2800   /// Subclasses may override this routine to provide different behavior.
2801   ExprResult RebuildDependentScopeDeclRefExpr(
2802                                           NestedNameSpecifierLoc QualifierLoc,
2803                                           SourceLocation TemplateKWLoc,
2804                                        const DeclarationNameInfo &NameInfo,
2805                               const TemplateArgumentListInfo *TemplateArgs,
2806                                           bool IsAddressOfOperand,
2807                                           TypeSourceInfo **RecoveryTSI) {
2808     CXXScopeSpec SS;
2809     SS.Adopt(QualifierLoc);
2810 
2811     if (TemplateArgs || TemplateKWLoc.isValid())
2812       return getSema().BuildQualifiedTemplateIdExpr(SS, TemplateKWLoc, NameInfo,
2813                                                     TemplateArgs);
2814 
2815     return getSema().BuildQualifiedDeclarationNameExpr(
2816         SS, NameInfo, IsAddressOfOperand, /*S*/nullptr, RecoveryTSI);
2817   }
2818 
2819   /// Build a new template-id expression.
2820   ///
2821   /// By default, performs semantic analysis to build the new expression.
2822   /// Subclasses may override this routine to provide different behavior.
2823   ExprResult RebuildTemplateIdExpr(const CXXScopeSpec &SS,
2824                                    SourceLocation TemplateKWLoc,
2825                                    LookupResult &R,
2826                                    bool RequiresADL,
2827                               const TemplateArgumentListInfo *TemplateArgs) {
2828     return getSema().BuildTemplateIdExpr(SS, TemplateKWLoc, R, RequiresADL,
2829                                          TemplateArgs);
2830   }
2831 
2832   /// Build a new object-construction expression.
2833   ///
2834   /// By default, performs semantic analysis to build the new expression.
2835   /// Subclasses may override this routine to provide different behavior.
2836   ExprResult RebuildCXXConstructExpr(QualType T,
2837                                      SourceLocation Loc,
2838                                      CXXConstructorDecl *Constructor,
2839                                      bool IsElidable,
2840                                      MultiExprArg Args,
2841                                      bool HadMultipleCandidates,
2842                                      bool ListInitialization,
2843                                      bool StdInitListInitialization,
2844                                      bool RequiresZeroInit,
2845                              CXXConstructExpr::ConstructionKind ConstructKind,
2846                                      SourceRange ParenRange) {
2847     SmallVector<Expr*, 8> ConvertedArgs;
2848     if (getSema().CompleteConstructorCall(Constructor, Args, Loc,
2849                                           ConvertedArgs))
2850       return ExprError();
2851 
2852     return getSema().BuildCXXConstructExpr(Loc, T, Constructor,
2853                                            IsElidable,
2854                                            ConvertedArgs,
2855                                            HadMultipleCandidates,
2856                                            ListInitialization,
2857                                            StdInitListInitialization,
2858                                            RequiresZeroInit, ConstructKind,
2859                                            ParenRange);
2860   }
2861 
2862   /// Build a new implicit construction via inherited constructor
2863   /// expression.
2864   ExprResult RebuildCXXInheritedCtorInitExpr(QualType T, SourceLocation Loc,
2865                                              CXXConstructorDecl *Constructor,
2866                                              bool ConstructsVBase,
2867                                              bool InheritedFromVBase) {
2868     return new (getSema().Context) CXXInheritedCtorInitExpr(
2869         Loc, T, Constructor, ConstructsVBase, InheritedFromVBase);
2870   }
2871 
2872   /// Build a new object-construction expression.
2873   ///
2874   /// By default, performs semantic analysis to build the new expression.
2875   /// Subclasses may override this routine to provide different behavior.
2876   ExprResult RebuildCXXTemporaryObjectExpr(TypeSourceInfo *TSInfo,
2877                                            SourceLocation LParenOrBraceLoc,
2878                                            MultiExprArg Args,
2879                                            SourceLocation RParenOrBraceLoc,
2880                                            bool ListInitialization) {
2881     return getSema().BuildCXXTypeConstructExpr(
2882         TSInfo, LParenOrBraceLoc, Args, RParenOrBraceLoc, ListInitialization);
2883   }
2884 
2885   /// Build a new object-construction expression.
2886   ///
2887   /// By default, performs semantic analysis to build the new expression.
2888   /// Subclasses may override this routine to provide different behavior.
2889   ExprResult RebuildCXXUnresolvedConstructExpr(TypeSourceInfo *TSInfo,
2890                                                SourceLocation LParenLoc,
2891                                                MultiExprArg Args,
2892                                                SourceLocation RParenLoc,
2893                                                bool ListInitialization) {
2894     return getSema().BuildCXXTypeConstructExpr(TSInfo, LParenLoc, Args,
2895                                                RParenLoc, ListInitialization);
2896   }
2897 
2898   /// Build a new member reference expression.
2899   ///
2900   /// By default, performs semantic analysis to build the new expression.
2901   /// Subclasses may override this routine to provide different behavior.
2902   ExprResult RebuildCXXDependentScopeMemberExpr(Expr *BaseE,
2903                                                 QualType BaseType,
2904                                                 bool IsArrow,
2905                                                 SourceLocation OperatorLoc,
2906                                           NestedNameSpecifierLoc QualifierLoc,
2907                                                 SourceLocation TemplateKWLoc,
2908                                             NamedDecl *FirstQualifierInScope,
2909                                    const DeclarationNameInfo &MemberNameInfo,
2910                               const TemplateArgumentListInfo *TemplateArgs) {
2911     CXXScopeSpec SS;
2912     SS.Adopt(QualifierLoc);
2913 
2914     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2915                                             OperatorLoc, IsArrow,
2916                                             SS, TemplateKWLoc,
2917                                             FirstQualifierInScope,
2918                                             MemberNameInfo,
2919                                             TemplateArgs, /*S*/nullptr);
2920   }
2921 
2922   /// Build a new member reference 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 RebuildUnresolvedMemberExpr(Expr *BaseE, QualType BaseType,
2927                                          SourceLocation OperatorLoc,
2928                                          bool IsArrow,
2929                                          NestedNameSpecifierLoc QualifierLoc,
2930                                          SourceLocation TemplateKWLoc,
2931                                          NamedDecl *FirstQualifierInScope,
2932                                          LookupResult &R,
2933                                 const TemplateArgumentListInfo *TemplateArgs) {
2934     CXXScopeSpec SS;
2935     SS.Adopt(QualifierLoc);
2936 
2937     return SemaRef.BuildMemberReferenceExpr(BaseE, BaseType,
2938                                             OperatorLoc, IsArrow,
2939                                             SS, TemplateKWLoc,
2940                                             FirstQualifierInScope,
2941                                             R, TemplateArgs, /*S*/nullptr);
2942   }
2943 
2944   /// Build a new noexcept expression.
2945   ///
2946   /// By default, performs semantic analysis to build the new expression.
2947   /// Subclasses may override this routine to provide different behavior.
2948   ExprResult RebuildCXXNoexceptExpr(SourceRange Range, Expr *Arg) {
2949     return SemaRef.BuildCXXNoexceptExpr(Range.getBegin(), Arg, Range.getEnd());
2950   }
2951 
2952   /// Build a new expression to compute the length of a parameter pack.
2953   ExprResult RebuildSizeOfPackExpr(SourceLocation OperatorLoc,
2954                                    NamedDecl *Pack,
2955                                    SourceLocation PackLoc,
2956                                    SourceLocation RParenLoc,
2957                                    Optional<unsigned> Length,
2958                                    ArrayRef<TemplateArgument> PartialArgs) {
2959     return SizeOfPackExpr::Create(SemaRef.Context, OperatorLoc, Pack, PackLoc,
2960                                   RParenLoc, Length, PartialArgs);
2961   }
2962 
2963   /// Build a new Objective-C boxed expression.
2964   ///
2965   /// By default, performs semantic analysis to build the new expression.
2966   /// Subclasses may override this routine to provide different behavior.
2967   ExprResult RebuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
2968     return getSema().BuildObjCBoxedExpr(SR, ValueExpr);
2969   }
2970 
2971   /// Build a new Objective-C array literal.
2972   ///
2973   /// By default, performs semantic analysis to build the new expression.
2974   /// Subclasses may override this routine to provide different behavior.
2975   ExprResult RebuildObjCArrayLiteral(SourceRange Range,
2976                                      Expr **Elements, unsigned NumElements) {
2977     return getSema().BuildObjCArrayLiteral(Range,
2978                                            MultiExprArg(Elements, NumElements));
2979   }
2980 
2981   ExprResult RebuildObjCSubscriptRefExpr(SourceLocation RB,
2982                                          Expr *Base, Expr *Key,
2983                                          ObjCMethodDecl *getterMethod,
2984                                          ObjCMethodDecl *setterMethod) {
2985     return  getSema().BuildObjCSubscriptExpression(RB, Base, Key,
2986                                                    getterMethod, setterMethod);
2987   }
2988 
2989   /// Build a new Objective-C dictionary literal.
2990   ///
2991   /// By default, performs semantic analysis to build the new expression.
2992   /// Subclasses may override this routine to provide different behavior.
2993   ExprResult RebuildObjCDictionaryLiteral(SourceRange Range,
2994                               MutableArrayRef<ObjCDictionaryElement> Elements) {
2995     return getSema().BuildObjCDictionaryLiteral(Range, Elements);
2996   }
2997 
2998   /// Build a new Objective-C \@encode expression.
2999   ///
3000   /// By default, performs semantic analysis to build the new expression.
3001   /// Subclasses may override this routine to provide different behavior.
3002   ExprResult RebuildObjCEncodeExpr(SourceLocation AtLoc,
3003                                          TypeSourceInfo *EncodeTypeInfo,
3004                                          SourceLocation RParenLoc) {
3005     return SemaRef.BuildObjCEncodeExpression(AtLoc, EncodeTypeInfo, RParenLoc);
3006   }
3007 
3008   /// Build a new Objective-C class message.
3009   ExprResult RebuildObjCMessageExpr(TypeSourceInfo *ReceiverTypeInfo,
3010                                           Selector Sel,
3011                                           ArrayRef<SourceLocation> SelectorLocs,
3012                                           ObjCMethodDecl *Method,
3013                                           SourceLocation LBracLoc,
3014                                           MultiExprArg Args,
3015                                           SourceLocation RBracLoc) {
3016     return SemaRef.BuildClassMessage(ReceiverTypeInfo,
3017                                      ReceiverTypeInfo->getType(),
3018                                      /*SuperLoc=*/SourceLocation(),
3019                                      Sel, Method, LBracLoc, SelectorLocs,
3020                                      RBracLoc, Args);
3021   }
3022 
3023   /// Build a new Objective-C instance message.
3024   ExprResult RebuildObjCMessageExpr(Expr *Receiver,
3025                                           Selector Sel,
3026                                           ArrayRef<SourceLocation> SelectorLocs,
3027                                           ObjCMethodDecl *Method,
3028                                           SourceLocation LBracLoc,
3029                                           MultiExprArg Args,
3030                                           SourceLocation RBracLoc) {
3031     return SemaRef.BuildInstanceMessage(Receiver,
3032                                         Receiver->getType(),
3033                                         /*SuperLoc=*/SourceLocation(),
3034                                         Sel, Method, LBracLoc, SelectorLocs,
3035                                         RBracLoc, Args);
3036   }
3037 
3038   /// Build a new Objective-C instance/class message to 'super'.
3039   ExprResult RebuildObjCMessageExpr(SourceLocation SuperLoc,
3040                                     Selector Sel,
3041                                     ArrayRef<SourceLocation> SelectorLocs,
3042                                     QualType SuperType,
3043                                     ObjCMethodDecl *Method,
3044                                     SourceLocation LBracLoc,
3045                                     MultiExprArg Args,
3046                                     SourceLocation RBracLoc) {
3047     return Method->isInstanceMethod() ? SemaRef.BuildInstanceMessage(nullptr,
3048                                           SuperType,
3049                                           SuperLoc,
3050                                           Sel, Method, LBracLoc, SelectorLocs,
3051                                           RBracLoc, Args)
3052                                       : SemaRef.BuildClassMessage(nullptr,
3053                                           SuperType,
3054                                           SuperLoc,
3055                                           Sel, Method, LBracLoc, SelectorLocs,
3056                                           RBracLoc, Args);
3057 
3058 
3059   }
3060 
3061   /// Build a new Objective-C ivar reference expression.
3062   ///
3063   /// By default, performs semantic analysis to build the new expression.
3064   /// Subclasses may override this routine to provide different behavior.
3065   ExprResult RebuildObjCIvarRefExpr(Expr *BaseArg, ObjCIvarDecl *Ivar,
3066                                           SourceLocation IvarLoc,
3067                                           bool IsArrow, bool IsFreeIvar) {
3068     CXXScopeSpec SS;
3069     DeclarationNameInfo NameInfo(Ivar->getDeclName(), IvarLoc);
3070     ExprResult Result = getSema().BuildMemberReferenceExpr(
3071         BaseArg, BaseArg->getType(),
3072         /*FIXME:*/ IvarLoc, IsArrow, SS, SourceLocation(),
3073         /*FirstQualifierInScope=*/nullptr, NameInfo,
3074         /*TemplateArgs=*/nullptr,
3075         /*S=*/nullptr);
3076     if (IsFreeIvar && Result.isUsable())
3077       cast<ObjCIvarRefExpr>(Result.get())->setIsFreeIvar(IsFreeIvar);
3078     return Result;
3079   }
3080 
3081   /// Build a new Objective-C property reference expression.
3082   ///
3083   /// By default, performs semantic analysis to build the new expression.
3084   /// Subclasses may override this routine to provide different behavior.
3085   ExprResult RebuildObjCPropertyRefExpr(Expr *BaseArg,
3086                                         ObjCPropertyDecl *Property,
3087                                         SourceLocation PropertyLoc) {
3088     CXXScopeSpec SS;
3089     DeclarationNameInfo NameInfo(Property->getDeclName(), PropertyLoc);
3090     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3091                                               /*FIXME:*/PropertyLoc,
3092                                               /*IsArrow=*/false,
3093                                               SS, SourceLocation(),
3094                                               /*FirstQualifierInScope=*/nullptr,
3095                                               NameInfo,
3096                                               /*TemplateArgs=*/nullptr,
3097                                               /*S=*/nullptr);
3098   }
3099 
3100   /// Build a new Objective-C property reference expression.
3101   ///
3102   /// By default, performs semantic analysis to build the new expression.
3103   /// Subclasses may override this routine to provide different behavior.
3104   ExprResult RebuildObjCPropertyRefExpr(Expr *Base, QualType T,
3105                                         ObjCMethodDecl *Getter,
3106                                         ObjCMethodDecl *Setter,
3107                                         SourceLocation PropertyLoc) {
3108     // Since these expressions can only be value-dependent, we do not
3109     // need to perform semantic analysis again.
3110     return Owned(
3111       new (getSema().Context) ObjCPropertyRefExpr(Getter, Setter, T,
3112                                                   VK_LValue, OK_ObjCProperty,
3113                                                   PropertyLoc, Base));
3114   }
3115 
3116   /// Build a new Objective-C "isa" expression.
3117   ///
3118   /// By default, performs semantic analysis to build the new expression.
3119   /// Subclasses may override this routine to provide different behavior.
3120   ExprResult RebuildObjCIsaExpr(Expr *BaseArg, SourceLocation IsaLoc,
3121                                 SourceLocation OpLoc, bool IsArrow) {
3122     CXXScopeSpec SS;
3123     DeclarationNameInfo NameInfo(&getSema().Context.Idents.get("isa"), IsaLoc);
3124     return getSema().BuildMemberReferenceExpr(BaseArg, BaseArg->getType(),
3125                                               OpLoc, IsArrow,
3126                                               SS, SourceLocation(),
3127                                               /*FirstQualifierInScope=*/nullptr,
3128                                               NameInfo,
3129                                               /*TemplateArgs=*/nullptr,
3130                                               /*S=*/nullptr);
3131   }
3132 
3133   /// Build a new shuffle vector expression.
3134   ///
3135   /// By default, performs semantic analysis to build the new expression.
3136   /// Subclasses may override this routine to provide different behavior.
3137   ExprResult RebuildShuffleVectorExpr(SourceLocation BuiltinLoc,
3138                                       MultiExprArg SubExprs,
3139                                       SourceLocation RParenLoc) {
3140     // Find the declaration for __builtin_shufflevector
3141     const IdentifierInfo &Name
3142       = SemaRef.Context.Idents.get("__builtin_shufflevector");
3143     TranslationUnitDecl *TUDecl = SemaRef.Context.getTranslationUnitDecl();
3144     DeclContext::lookup_result Lookup = TUDecl->lookup(DeclarationName(&Name));
3145     assert(!Lookup.empty() && "No __builtin_shufflevector?");
3146 
3147     // Build a reference to the __builtin_shufflevector builtin
3148     FunctionDecl *Builtin = cast<FunctionDecl>(Lookup.front());
3149     Expr *Callee = new (SemaRef.Context)
3150         DeclRefExpr(SemaRef.Context, Builtin, false,
3151                     SemaRef.Context.BuiltinFnTy, VK_RValue, BuiltinLoc);
3152     QualType CalleePtrTy = SemaRef.Context.getPointerType(Builtin->getType());
3153     Callee = SemaRef.ImpCastExprToType(Callee, CalleePtrTy,
3154                                        CK_BuiltinFnToFnPtr).get();
3155 
3156     // Build the CallExpr
3157     ExprResult TheCall = CallExpr::Create(
3158         SemaRef.Context, Callee, SubExprs, Builtin->getCallResultType(),
3159         Expr::getValueKindForType(Builtin->getReturnType()), RParenLoc);
3160 
3161     // Type-check the __builtin_shufflevector expression.
3162     return SemaRef.SemaBuiltinShuffleVector(cast<CallExpr>(TheCall.get()));
3163   }
3164 
3165   /// Build a new convert vector expression.
3166   ExprResult RebuildConvertVectorExpr(SourceLocation BuiltinLoc,
3167                                       Expr *SrcExpr, TypeSourceInfo *DstTInfo,
3168                                       SourceLocation RParenLoc) {
3169     return SemaRef.SemaConvertVectorExpr(SrcExpr, DstTInfo,
3170                                          BuiltinLoc, RParenLoc);
3171   }
3172 
3173   /// Build a new template argument pack expansion.
3174   ///
3175   /// By default, performs semantic analysis to build a new pack expansion
3176   /// for a template argument. Subclasses may override this routine to provide
3177   /// different behavior.
3178   TemplateArgumentLoc RebuildPackExpansion(TemplateArgumentLoc Pattern,
3179                                            SourceLocation EllipsisLoc,
3180                                            Optional<unsigned> NumExpansions) {
3181     switch (Pattern.getArgument().getKind()) {
3182     case TemplateArgument::Expression: {
3183       ExprResult Result
3184         = getSema().CheckPackExpansion(Pattern.getSourceExpression(),
3185                                        EllipsisLoc, NumExpansions);
3186       if (Result.isInvalid())
3187         return TemplateArgumentLoc();
3188 
3189       return TemplateArgumentLoc(Result.get(), Result.get());
3190     }
3191 
3192     case TemplateArgument::Template:
3193       return TemplateArgumentLoc(TemplateArgument(
3194                                           Pattern.getArgument().getAsTemplate(),
3195                                                   NumExpansions),
3196                                  Pattern.getTemplateQualifierLoc(),
3197                                  Pattern.getTemplateNameLoc(),
3198                                  EllipsisLoc);
3199 
3200     case TemplateArgument::Null:
3201     case TemplateArgument::Integral:
3202     case TemplateArgument::Declaration:
3203     case TemplateArgument::Pack:
3204     case TemplateArgument::TemplateExpansion:
3205     case TemplateArgument::NullPtr:
3206       llvm_unreachable("Pack expansion pattern has no parameter packs");
3207 
3208     case TemplateArgument::Type:
3209       if (TypeSourceInfo *Expansion
3210             = getSema().CheckPackExpansion(Pattern.getTypeSourceInfo(),
3211                                            EllipsisLoc,
3212                                            NumExpansions))
3213         return TemplateArgumentLoc(TemplateArgument(Expansion->getType()),
3214                                    Expansion);
3215       break;
3216     }
3217 
3218     return TemplateArgumentLoc();
3219   }
3220 
3221   /// Build a new expression pack expansion.
3222   ///
3223   /// By default, performs semantic analysis to build a new pack expansion
3224   /// for an expression. Subclasses may override this routine to provide
3225   /// different behavior.
3226   ExprResult RebuildPackExpansion(Expr *Pattern, SourceLocation EllipsisLoc,
3227                                   Optional<unsigned> NumExpansions) {
3228     return getSema().CheckPackExpansion(Pattern, EllipsisLoc, NumExpansions);
3229   }
3230 
3231   /// Build a new C++1z fold-expression.
3232   ///
3233   /// By default, performs semantic analysis in order to build a new fold
3234   /// expression.
3235   ExprResult RebuildCXXFoldExpr(SourceLocation LParenLoc, Expr *LHS,
3236                                 BinaryOperatorKind Operator,
3237                                 SourceLocation EllipsisLoc, Expr *RHS,
3238                                 SourceLocation RParenLoc) {
3239     return getSema().BuildCXXFoldExpr(LParenLoc, LHS, Operator, EllipsisLoc,
3240                                       RHS, RParenLoc);
3241   }
3242 
3243   /// Build an empty C++1z fold-expression with the given operator.
3244   ///
3245   /// By default, produces the fallback value for the fold-expression, or
3246   /// produce an error if there is no fallback value.
3247   ExprResult RebuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc,
3248                                      BinaryOperatorKind Operator) {
3249     return getSema().BuildEmptyCXXFoldExpr(EllipsisLoc, Operator);
3250   }
3251 
3252   /// Build a new atomic operation expression.
3253   ///
3254   /// By default, performs semantic analysis to build the new expression.
3255   /// Subclasses may override this routine to provide different behavior.
3256   ExprResult RebuildAtomicExpr(SourceLocation BuiltinLoc,
3257                                MultiExprArg SubExprs,
3258                                QualType RetTy,
3259                                AtomicExpr::AtomicOp Op,
3260                                SourceLocation RParenLoc) {
3261     // Just create the expression; there is not any interesting semantic
3262     // analysis here because we can't actually build an AtomicExpr until
3263     // we are sure it is semantically sound.
3264     return new (SemaRef.Context) AtomicExpr(BuiltinLoc, SubExprs, RetTy, Op,
3265                                             RParenLoc);
3266   }
3267 
3268 private:
3269   TypeLoc TransformTypeInObjectScope(TypeLoc TL,
3270                                      QualType ObjectType,
3271                                      NamedDecl *FirstQualifierInScope,
3272                                      CXXScopeSpec &SS);
3273 
3274   TypeSourceInfo *TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
3275                                              QualType ObjectType,
3276                                              NamedDecl *FirstQualifierInScope,
3277                                              CXXScopeSpec &SS);
3278 
3279   TypeSourceInfo *TransformTSIInObjectScope(TypeLoc TL, QualType ObjectType,
3280                                             NamedDecl *FirstQualifierInScope,
3281                                             CXXScopeSpec &SS);
3282 
3283   QualType TransformDependentNameType(TypeLocBuilder &TLB,
3284                                       DependentNameTypeLoc TL,
3285                                       bool DeducibleTSTContext);
3286 };
3287 
3288 template <typename Derived>
3289 StmtResult TreeTransform<Derived>::TransformStmt(Stmt *S, StmtDiscardKind SDK) {
3290   if (!S)
3291     return S;
3292 
3293   switch (S->getStmtClass()) {
3294   case Stmt::NoStmtClass: break;
3295 
3296   // Transform individual statement nodes
3297   // Pass SDK into statements that can produce a value
3298 #define STMT(Node, Parent)                                              \
3299   case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(S));
3300 #define VALUESTMT(Node, Parent)                                         \
3301   case Stmt::Node##Class:                                               \
3302     return getDerived().Transform##Node(cast<Node>(S), SDK);
3303 #define ABSTRACT_STMT(Node)
3304 #define EXPR(Node, Parent)
3305 #include "clang/AST/StmtNodes.inc"
3306 
3307   // Transform expressions by calling TransformExpr.
3308 #define STMT(Node, Parent)
3309 #define ABSTRACT_STMT(Stmt)
3310 #define EXPR(Node, Parent) case Stmt::Node##Class:
3311 #include "clang/AST/StmtNodes.inc"
3312     {
3313       ExprResult E = getDerived().TransformExpr(cast<Expr>(S));
3314 
3315       if (SDK == SDK_StmtExprResult)
3316         E = getSema().ActOnStmtExprResult(E);
3317       return getSema().ActOnExprStmt(E, SDK == SDK_Discarded);
3318     }
3319   }
3320 
3321   return S;
3322 }
3323 
3324 template<typename Derived>
3325 OMPClause *TreeTransform<Derived>::TransformOMPClause(OMPClause *S) {
3326   if (!S)
3327     return S;
3328 
3329   switch (S->getClauseKind()) {
3330   default: break;
3331   // Transform individual clause nodes
3332 #define OPENMP_CLAUSE(Name, Class)                                             \
3333   case OMPC_ ## Name :                                                         \
3334     return getDerived().Transform ## Class(cast<Class>(S));
3335 #include "clang/Basic/OpenMPKinds.def"
3336   }
3337 
3338   return S;
3339 }
3340 
3341 
3342 template<typename Derived>
3343 ExprResult TreeTransform<Derived>::TransformExpr(Expr *E) {
3344   if (!E)
3345     return E;
3346 
3347   switch (E->getStmtClass()) {
3348     case Stmt::NoStmtClass: break;
3349 #define STMT(Node, Parent) case Stmt::Node##Class: break;
3350 #define ABSTRACT_STMT(Stmt)
3351 #define EXPR(Node, Parent)                                              \
3352     case Stmt::Node##Class: return getDerived().Transform##Node(cast<Node>(E));
3353 #include "clang/AST/StmtNodes.inc"
3354   }
3355 
3356   return E;
3357 }
3358 
3359 template<typename Derived>
3360 ExprResult TreeTransform<Derived>::TransformInitializer(Expr *Init,
3361                                                         bool NotCopyInit) {
3362   // Initializers are instantiated like expressions, except that various outer
3363   // layers are stripped.
3364   if (!Init)
3365     return Init;
3366 
3367   if (auto *FE = dyn_cast<FullExpr>(Init))
3368     Init = FE->getSubExpr();
3369 
3370   if (auto *AIL = dyn_cast<ArrayInitLoopExpr>(Init))
3371     Init = AIL->getCommonExpr();
3372 
3373   if (MaterializeTemporaryExpr *MTE = dyn_cast<MaterializeTemporaryExpr>(Init))
3374     Init = MTE->GetTemporaryExpr();
3375 
3376   while (CXXBindTemporaryExpr *Binder = dyn_cast<CXXBindTemporaryExpr>(Init))
3377     Init = Binder->getSubExpr();
3378 
3379   if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Init))
3380     Init = ICE->getSubExprAsWritten();
3381 
3382   if (CXXStdInitializerListExpr *ILE =
3383           dyn_cast<CXXStdInitializerListExpr>(Init))
3384     return TransformInitializer(ILE->getSubExpr(), NotCopyInit);
3385 
3386   // If this is copy-initialization, we only need to reconstruct
3387   // InitListExprs. Other forms of copy-initialization will be a no-op if
3388   // the initializer is already the right type.
3389   CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init);
3390   if (!NotCopyInit && !(Construct && Construct->isListInitialization()))
3391     return getDerived().TransformExpr(Init);
3392 
3393   // Revert value-initialization back to empty parens.
3394   if (CXXScalarValueInitExpr *VIE = dyn_cast<CXXScalarValueInitExpr>(Init)) {
3395     SourceRange Parens = VIE->getSourceRange();
3396     return getDerived().RebuildParenListExpr(Parens.getBegin(), None,
3397                                              Parens.getEnd());
3398   }
3399 
3400   // FIXME: We shouldn't build ImplicitValueInitExprs for direct-initialization.
3401   if (isa<ImplicitValueInitExpr>(Init))
3402     return getDerived().RebuildParenListExpr(SourceLocation(), None,
3403                                              SourceLocation());
3404 
3405   // Revert initialization by constructor back to a parenthesized or braced list
3406   // of expressions. Any other form of initializer can just be reused directly.
3407   if (!Construct || isa<CXXTemporaryObjectExpr>(Construct))
3408     return getDerived().TransformExpr(Init);
3409 
3410   // If the initialization implicitly converted an initializer list to a
3411   // std::initializer_list object, unwrap the std::initializer_list too.
3412   if (Construct && Construct->isStdInitListInitialization())
3413     return TransformInitializer(Construct->getArg(0), NotCopyInit);
3414 
3415   // Enter a list-init context if this was list initialization.
3416   EnterExpressionEvaluationContext Context(
3417       getSema(), EnterExpressionEvaluationContext::InitList,
3418       Construct->isListInitialization());
3419 
3420   SmallVector<Expr*, 8> NewArgs;
3421   bool ArgChanged = false;
3422   if (getDerived().TransformExprs(Construct->getArgs(), Construct->getNumArgs(),
3423                                   /*IsCall*/true, NewArgs, &ArgChanged))
3424     return ExprError();
3425 
3426   // If this was list initialization, revert to syntactic list form.
3427   if (Construct->isListInitialization())
3428     return getDerived().RebuildInitList(Construct->getBeginLoc(), NewArgs,
3429                                         Construct->getEndLoc());
3430 
3431   // Build a ParenListExpr to represent anything else.
3432   SourceRange Parens = Construct->getParenOrBraceRange();
3433   if (Parens.isInvalid()) {
3434     // This was a variable declaration's initialization for which no initializer
3435     // was specified.
3436     assert(NewArgs.empty() &&
3437            "no parens or braces but have direct init with arguments?");
3438     return ExprEmpty();
3439   }
3440   return getDerived().RebuildParenListExpr(Parens.getBegin(), NewArgs,
3441                                            Parens.getEnd());
3442 }
3443 
3444 template<typename Derived>
3445 bool TreeTransform<Derived>::TransformExprs(Expr *const *Inputs,
3446                                             unsigned NumInputs,
3447                                             bool IsCall,
3448                                       SmallVectorImpl<Expr *> &Outputs,
3449                                             bool *ArgChanged) {
3450   for (unsigned I = 0; I != NumInputs; ++I) {
3451     // If requested, drop call arguments that need to be dropped.
3452     if (IsCall && getDerived().DropCallArgument(Inputs[I])) {
3453       if (ArgChanged)
3454         *ArgChanged = true;
3455 
3456       break;
3457     }
3458 
3459     if (PackExpansionExpr *Expansion = dyn_cast<PackExpansionExpr>(Inputs[I])) {
3460       Expr *Pattern = Expansion->getPattern();
3461 
3462       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
3463       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
3464       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
3465 
3466       // Determine whether the set of unexpanded parameter packs can and should
3467       // be expanded.
3468       bool Expand = true;
3469       bool RetainExpansion = false;
3470       Optional<unsigned> OrigNumExpansions = Expansion->getNumExpansions();
3471       Optional<unsigned> NumExpansions = OrigNumExpansions;
3472       if (getDerived().TryExpandParameterPacks(Expansion->getEllipsisLoc(),
3473                                                Pattern->getSourceRange(),
3474                                                Unexpanded,
3475                                                Expand, RetainExpansion,
3476                                                NumExpansions))
3477         return true;
3478 
3479       if (!Expand) {
3480         // The transform has determined that we should perform a simple
3481         // transformation on the pack expansion, producing another pack
3482         // expansion.
3483         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
3484         ExprResult OutPattern = getDerived().TransformExpr(Pattern);
3485         if (OutPattern.isInvalid())
3486           return true;
3487 
3488         ExprResult Out = getDerived().RebuildPackExpansion(OutPattern.get(),
3489                                                 Expansion->getEllipsisLoc(),
3490                                                            NumExpansions);
3491         if (Out.isInvalid())
3492           return true;
3493 
3494         if (ArgChanged)
3495           *ArgChanged = true;
3496         Outputs.push_back(Out.get());
3497         continue;
3498       }
3499 
3500       // Record right away that the argument was changed.  This needs
3501       // to happen even if the array expands to nothing.
3502       if (ArgChanged) *ArgChanged = true;
3503 
3504       // The transform has determined that we should perform an elementwise
3505       // expansion of the pattern. Do so.
3506       for (unsigned I = 0; I != *NumExpansions; ++I) {
3507         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
3508         ExprResult Out = getDerived().TransformExpr(Pattern);
3509         if (Out.isInvalid())
3510           return true;
3511 
3512         if (Out.get()->containsUnexpandedParameterPack()) {
3513           Out = getDerived().RebuildPackExpansion(
3514               Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3515           if (Out.isInvalid())
3516             return true;
3517         }
3518 
3519         Outputs.push_back(Out.get());
3520       }
3521 
3522       // If we're supposed to retain a pack expansion, do so by temporarily
3523       // forgetting the partially-substituted parameter pack.
3524       if (RetainExpansion) {
3525         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
3526 
3527         ExprResult Out = getDerived().TransformExpr(Pattern);
3528         if (Out.isInvalid())
3529           return true;
3530 
3531         Out = getDerived().RebuildPackExpansion(
3532             Out.get(), Expansion->getEllipsisLoc(), OrigNumExpansions);
3533         if (Out.isInvalid())
3534           return true;
3535 
3536         Outputs.push_back(Out.get());
3537       }
3538 
3539       continue;
3540     }
3541 
3542     ExprResult Result =
3543       IsCall ? getDerived().TransformInitializer(Inputs[I], /*DirectInit*/false)
3544              : getDerived().TransformExpr(Inputs[I]);
3545     if (Result.isInvalid())
3546       return true;
3547 
3548     if (Result.get() != Inputs[I] && ArgChanged)
3549       *ArgChanged = true;
3550 
3551     Outputs.push_back(Result.get());
3552   }
3553 
3554   return false;
3555 }
3556 
3557 template <typename Derived>
3558 Sema::ConditionResult TreeTransform<Derived>::TransformCondition(
3559     SourceLocation Loc, VarDecl *Var, Expr *Expr, Sema::ConditionKind Kind) {
3560   if (Var) {
3561     VarDecl *ConditionVar = cast_or_null<VarDecl>(
3562         getDerived().TransformDefinition(Var->getLocation(), Var));
3563 
3564     if (!ConditionVar)
3565       return Sema::ConditionError();
3566 
3567     return getSema().ActOnConditionVariable(ConditionVar, Loc, Kind);
3568   }
3569 
3570   if (Expr) {
3571     ExprResult CondExpr = getDerived().TransformExpr(Expr);
3572 
3573     if (CondExpr.isInvalid())
3574       return Sema::ConditionError();
3575 
3576     return getSema().ActOnCondition(nullptr, Loc, CondExpr.get(), Kind);
3577   }
3578 
3579   return Sema::ConditionResult();
3580 }
3581 
3582 template<typename Derived>
3583 NestedNameSpecifierLoc
3584 TreeTransform<Derived>::TransformNestedNameSpecifierLoc(
3585                                                     NestedNameSpecifierLoc NNS,
3586                                                      QualType ObjectType,
3587                                              NamedDecl *FirstQualifierInScope) {
3588   SmallVector<NestedNameSpecifierLoc, 4> Qualifiers;
3589   for (NestedNameSpecifierLoc Qualifier = NNS; Qualifier;
3590        Qualifier = Qualifier.getPrefix())
3591     Qualifiers.push_back(Qualifier);
3592 
3593   CXXScopeSpec SS;
3594   while (!Qualifiers.empty()) {
3595     NestedNameSpecifierLoc Q = Qualifiers.pop_back_val();
3596     NestedNameSpecifier *QNNS = Q.getNestedNameSpecifier();
3597 
3598     switch (QNNS->getKind()) {
3599     case NestedNameSpecifier::Identifier: {
3600       Sema::NestedNameSpecInfo IdInfo(QNNS->getAsIdentifier(),
3601                           Q.getLocalBeginLoc(), Q.getLocalEndLoc(), ObjectType);
3602       if (SemaRef.BuildCXXNestedNameSpecifier(/*Scope=*/nullptr, IdInfo, false,
3603                                               SS, FirstQualifierInScope, false))
3604         return NestedNameSpecifierLoc();
3605     }
3606       break;
3607 
3608     case NestedNameSpecifier::Namespace: {
3609       NamespaceDecl *NS
3610         = cast_or_null<NamespaceDecl>(
3611                                     getDerived().TransformDecl(
3612                                                           Q.getLocalBeginLoc(),
3613                                                        QNNS->getAsNamespace()));
3614       SS.Extend(SemaRef.Context, NS, Q.getLocalBeginLoc(), Q.getLocalEndLoc());
3615       break;
3616     }
3617 
3618     case NestedNameSpecifier::NamespaceAlias: {
3619       NamespaceAliasDecl *Alias
3620         = cast_or_null<NamespaceAliasDecl>(
3621                       getDerived().TransformDecl(Q.getLocalBeginLoc(),
3622                                                  QNNS->getAsNamespaceAlias()));
3623       SS.Extend(SemaRef.Context, Alias, Q.getLocalBeginLoc(),
3624                 Q.getLocalEndLoc());
3625       break;
3626     }
3627 
3628     case NestedNameSpecifier::Global:
3629       // There is no meaningful transformation that one could perform on the
3630       // global scope.
3631       SS.MakeGlobal(SemaRef.Context, Q.getBeginLoc());
3632       break;
3633 
3634     case NestedNameSpecifier::Super: {
3635       CXXRecordDecl *RD =
3636           cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
3637               SourceLocation(), QNNS->getAsRecordDecl()));
3638       SS.MakeSuper(SemaRef.Context, RD, Q.getBeginLoc(), Q.getEndLoc());
3639       break;
3640     }
3641 
3642     case NestedNameSpecifier::TypeSpecWithTemplate:
3643     case NestedNameSpecifier::TypeSpec: {
3644       TypeLoc TL = TransformTypeInObjectScope(Q.getTypeLoc(), ObjectType,
3645                                               FirstQualifierInScope, SS);
3646 
3647       if (!TL)
3648         return NestedNameSpecifierLoc();
3649 
3650       if (TL.getType()->isDependentType() || TL.getType()->isRecordType() ||
3651           (SemaRef.getLangOpts().CPlusPlus11 &&
3652            TL.getType()->isEnumeralType())) {
3653         assert(!TL.getType().hasLocalQualifiers() &&
3654                "Can't get cv-qualifiers here");
3655         if (TL.getType()->isEnumeralType())
3656           SemaRef.Diag(TL.getBeginLoc(),
3657                        diag::warn_cxx98_compat_enum_nested_name_spec);
3658         SS.Extend(SemaRef.Context, /*FIXME:*/SourceLocation(), TL,
3659                   Q.getLocalEndLoc());
3660         break;
3661       }
3662       // If the nested-name-specifier is an invalid type def, don't emit an
3663       // error because a previous error should have already been emitted.
3664       TypedefTypeLoc TTL = TL.getAs<TypedefTypeLoc>();
3665       if (!TTL || !TTL.getTypedefNameDecl()->isInvalidDecl()) {
3666         SemaRef.Diag(TL.getBeginLoc(), diag::err_nested_name_spec_non_tag)
3667           << TL.getType() << SS.getRange();
3668       }
3669       return NestedNameSpecifierLoc();
3670     }
3671     }
3672 
3673     // The qualifier-in-scope and object type only apply to the leftmost entity.
3674     FirstQualifierInScope = nullptr;
3675     ObjectType = QualType();
3676   }
3677 
3678   // Don't rebuild the nested-name-specifier if we don't have to.
3679   if (SS.getScopeRep() == NNS.getNestedNameSpecifier() &&
3680       !getDerived().AlwaysRebuild())
3681     return NNS;
3682 
3683   // If we can re-use the source-location data from the original
3684   // nested-name-specifier, do so.
3685   if (SS.location_size() == NNS.getDataLength() &&
3686       memcmp(SS.location_data(), NNS.getOpaqueData(), SS.location_size()) == 0)
3687     return NestedNameSpecifierLoc(SS.getScopeRep(), NNS.getOpaqueData());
3688 
3689   // Allocate new nested-name-specifier location information.
3690   return SS.getWithLocInContext(SemaRef.Context);
3691 }
3692 
3693 template<typename Derived>
3694 DeclarationNameInfo
3695 TreeTransform<Derived>
3696 ::TransformDeclarationNameInfo(const DeclarationNameInfo &NameInfo) {
3697   DeclarationName Name = NameInfo.getName();
3698   if (!Name)
3699     return DeclarationNameInfo();
3700 
3701   switch (Name.getNameKind()) {
3702   case DeclarationName::Identifier:
3703   case DeclarationName::ObjCZeroArgSelector:
3704   case DeclarationName::ObjCOneArgSelector:
3705   case DeclarationName::ObjCMultiArgSelector:
3706   case DeclarationName::CXXOperatorName:
3707   case DeclarationName::CXXLiteralOperatorName:
3708   case DeclarationName::CXXUsingDirective:
3709     return NameInfo;
3710 
3711   case DeclarationName::CXXDeductionGuideName: {
3712     TemplateDecl *OldTemplate = Name.getCXXDeductionGuideTemplate();
3713     TemplateDecl *NewTemplate = cast_or_null<TemplateDecl>(
3714         getDerived().TransformDecl(NameInfo.getLoc(), OldTemplate));
3715     if (!NewTemplate)
3716       return DeclarationNameInfo();
3717 
3718     DeclarationNameInfo NewNameInfo(NameInfo);
3719     NewNameInfo.setName(
3720         SemaRef.Context.DeclarationNames.getCXXDeductionGuideName(NewTemplate));
3721     return NewNameInfo;
3722   }
3723 
3724   case DeclarationName::CXXConstructorName:
3725   case DeclarationName::CXXDestructorName:
3726   case DeclarationName::CXXConversionFunctionName: {
3727     TypeSourceInfo *NewTInfo;
3728     CanQualType NewCanTy;
3729     if (TypeSourceInfo *OldTInfo = NameInfo.getNamedTypeInfo()) {
3730       NewTInfo = getDerived().TransformType(OldTInfo);
3731       if (!NewTInfo)
3732         return DeclarationNameInfo();
3733       NewCanTy = SemaRef.Context.getCanonicalType(NewTInfo->getType());
3734     }
3735     else {
3736       NewTInfo = nullptr;
3737       TemporaryBase Rebase(*this, NameInfo.getLoc(), Name);
3738       QualType NewT = getDerived().TransformType(Name.getCXXNameType());
3739       if (NewT.isNull())
3740         return DeclarationNameInfo();
3741       NewCanTy = SemaRef.Context.getCanonicalType(NewT);
3742     }
3743 
3744     DeclarationName NewName
3745       = SemaRef.Context.DeclarationNames.getCXXSpecialName(Name.getNameKind(),
3746                                                            NewCanTy);
3747     DeclarationNameInfo NewNameInfo(NameInfo);
3748     NewNameInfo.setName(NewName);
3749     NewNameInfo.setNamedTypeInfo(NewTInfo);
3750     return NewNameInfo;
3751   }
3752   }
3753 
3754   llvm_unreachable("Unknown name kind.");
3755 }
3756 
3757 template<typename Derived>
3758 TemplateName
3759 TreeTransform<Derived>::TransformTemplateName(CXXScopeSpec &SS,
3760                                               TemplateName Name,
3761                                               SourceLocation NameLoc,
3762                                               QualType ObjectType,
3763                                               NamedDecl *FirstQualifierInScope,
3764                                               bool AllowInjectedClassName) {
3765   if (QualifiedTemplateName *QTN = Name.getAsQualifiedTemplateName()) {
3766     TemplateDecl *Template = QTN->getTemplateDecl();
3767     assert(Template && "qualified template name must refer to a template");
3768 
3769     TemplateDecl *TransTemplate
3770       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3771                                                               Template));
3772     if (!TransTemplate)
3773       return TemplateName();
3774 
3775     if (!getDerived().AlwaysRebuild() &&
3776         SS.getScopeRep() == QTN->getQualifier() &&
3777         TransTemplate == Template)
3778       return Name;
3779 
3780     return getDerived().RebuildTemplateName(SS, QTN->hasTemplateKeyword(),
3781                                             TransTemplate);
3782   }
3783 
3784   if (DependentTemplateName *DTN = Name.getAsDependentTemplateName()) {
3785     if (SS.getScopeRep()) {
3786       // These apply to the scope specifier, not the template.
3787       ObjectType = QualType();
3788       FirstQualifierInScope = nullptr;
3789     }
3790 
3791     if (!getDerived().AlwaysRebuild() &&
3792         SS.getScopeRep() == DTN->getQualifier() &&
3793         ObjectType.isNull())
3794       return Name;
3795 
3796     // FIXME: Preserve the location of the "template" keyword.
3797     SourceLocation TemplateKWLoc = NameLoc;
3798 
3799     if (DTN->isIdentifier()) {
3800       return getDerived().RebuildTemplateName(SS,
3801                                               TemplateKWLoc,
3802                                               *DTN->getIdentifier(),
3803                                               NameLoc,
3804                                               ObjectType,
3805                                               FirstQualifierInScope,
3806                                               AllowInjectedClassName);
3807     }
3808 
3809     return getDerived().RebuildTemplateName(SS, TemplateKWLoc,
3810                                             DTN->getOperator(), NameLoc,
3811                                             ObjectType, AllowInjectedClassName);
3812   }
3813 
3814   if (TemplateDecl *Template = Name.getAsTemplateDecl()) {
3815     TemplateDecl *TransTemplate
3816       = cast_or_null<TemplateDecl>(getDerived().TransformDecl(NameLoc,
3817                                                               Template));
3818     if (!TransTemplate)
3819       return TemplateName();
3820 
3821     if (!getDerived().AlwaysRebuild() &&
3822         TransTemplate == Template)
3823       return Name;
3824 
3825     return TemplateName(TransTemplate);
3826   }
3827 
3828   if (SubstTemplateTemplateParmPackStorage *SubstPack
3829       = Name.getAsSubstTemplateTemplateParmPack()) {
3830     TemplateTemplateParmDecl *TransParam
3831     = cast_or_null<TemplateTemplateParmDecl>(
3832             getDerived().TransformDecl(NameLoc, SubstPack->getParameterPack()));
3833     if (!TransParam)
3834       return TemplateName();
3835 
3836     if (!getDerived().AlwaysRebuild() &&
3837         TransParam == SubstPack->getParameterPack())
3838       return Name;
3839 
3840     return getDerived().RebuildTemplateName(TransParam,
3841                                             SubstPack->getArgumentPack());
3842   }
3843 
3844   // These should be getting filtered out before they reach the AST.
3845   llvm_unreachable("overloaded function decl survived to here");
3846 }
3847 
3848 template<typename Derived>
3849 void TreeTransform<Derived>::InventTemplateArgumentLoc(
3850                                          const TemplateArgument &Arg,
3851                                          TemplateArgumentLoc &Output) {
3852   SourceLocation Loc = getDerived().getBaseLocation();
3853   switch (Arg.getKind()) {
3854   case TemplateArgument::Null:
3855     llvm_unreachable("null template argument in TreeTransform");
3856     break;
3857 
3858   case TemplateArgument::Type:
3859     Output = TemplateArgumentLoc(Arg,
3860                SemaRef.Context.getTrivialTypeSourceInfo(Arg.getAsType(), Loc));
3861 
3862     break;
3863 
3864   case TemplateArgument::Template:
3865   case TemplateArgument::TemplateExpansion: {
3866     NestedNameSpecifierLocBuilder Builder;
3867     TemplateName Template = Arg.getAsTemplateOrTemplatePattern();
3868     if (DependentTemplateName *DTN = Template.getAsDependentTemplateName())
3869       Builder.MakeTrivial(SemaRef.Context, DTN->getQualifier(), Loc);
3870     else if (QualifiedTemplateName *QTN = Template.getAsQualifiedTemplateName())
3871       Builder.MakeTrivial(SemaRef.Context, QTN->getQualifier(), Loc);
3872 
3873     if (Arg.getKind() == TemplateArgument::Template)
3874       Output = TemplateArgumentLoc(Arg,
3875                                    Builder.getWithLocInContext(SemaRef.Context),
3876                                    Loc);
3877     else
3878       Output = TemplateArgumentLoc(Arg,
3879                                    Builder.getWithLocInContext(SemaRef.Context),
3880                                    Loc, Loc);
3881 
3882     break;
3883   }
3884 
3885   case TemplateArgument::Expression:
3886     Output = TemplateArgumentLoc(Arg, Arg.getAsExpr());
3887     break;
3888 
3889   case TemplateArgument::Declaration:
3890   case TemplateArgument::Integral:
3891   case TemplateArgument::Pack:
3892   case TemplateArgument::NullPtr:
3893     Output = TemplateArgumentLoc(Arg, TemplateArgumentLocInfo());
3894     break;
3895   }
3896 }
3897 
3898 template<typename Derived>
3899 bool TreeTransform<Derived>::TransformTemplateArgument(
3900                                          const TemplateArgumentLoc &Input,
3901                                          TemplateArgumentLoc &Output, bool Uneval) {
3902   EnterExpressionEvaluationContext EEEC(
3903       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated,
3904       /*LambdaContextDecl=*/nullptr, /*ExprContext=*/
3905       Sema::ExpressionEvaluationContextRecord::EK_TemplateArgument);
3906   const TemplateArgument &Arg = Input.getArgument();
3907   switch (Arg.getKind()) {
3908   case TemplateArgument::Null:
3909   case TemplateArgument::Integral:
3910   case TemplateArgument::Pack:
3911   case TemplateArgument::Declaration:
3912   case TemplateArgument::NullPtr:
3913     llvm_unreachable("Unexpected TemplateArgument");
3914 
3915   case TemplateArgument::Type: {
3916     TypeSourceInfo *DI = Input.getTypeSourceInfo();
3917     if (!DI)
3918       DI = InventTypeSourceInfo(Input.getArgument().getAsType());
3919 
3920     DI = getDerived().TransformType(DI);
3921     if (!DI) return true;
3922 
3923     Output = TemplateArgumentLoc(TemplateArgument(DI->getType()), DI);
3924     return false;
3925   }
3926 
3927   case TemplateArgument::Template: {
3928     NestedNameSpecifierLoc QualifierLoc = Input.getTemplateQualifierLoc();
3929     if (QualifierLoc) {
3930       QualifierLoc = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc);
3931       if (!QualifierLoc)
3932         return true;
3933     }
3934 
3935     CXXScopeSpec SS;
3936     SS.Adopt(QualifierLoc);
3937     TemplateName Template
3938       = getDerived().TransformTemplateName(SS, Arg.getAsTemplate(),
3939                                            Input.getTemplateNameLoc());
3940     if (Template.isNull())
3941       return true;
3942 
3943     Output = TemplateArgumentLoc(TemplateArgument(Template), QualifierLoc,
3944                                  Input.getTemplateNameLoc());
3945     return false;
3946   }
3947 
3948   case TemplateArgument::TemplateExpansion:
3949     llvm_unreachable("Caller should expand pack expansions");
3950 
3951   case TemplateArgument::Expression: {
3952     // Template argument expressions are constant expressions.
3953     EnterExpressionEvaluationContext Unevaluated(
3954         getSema(), Uneval
3955                        ? Sema::ExpressionEvaluationContext::Unevaluated
3956                        : Sema::ExpressionEvaluationContext::ConstantEvaluated);
3957 
3958     Expr *InputExpr = Input.getSourceExpression();
3959     if (!InputExpr) InputExpr = Input.getArgument().getAsExpr();
3960 
3961     ExprResult E = getDerived().TransformExpr(InputExpr);
3962     E = SemaRef.ActOnConstantExpression(E);
3963     if (E.isInvalid()) return true;
3964     Output = TemplateArgumentLoc(TemplateArgument(E.get()), E.get());
3965     return false;
3966   }
3967   }
3968 
3969   // Work around bogus GCC warning
3970   return true;
3971 }
3972 
3973 /// Iterator adaptor that invents template argument location information
3974 /// for each of the template arguments in its underlying iterator.
3975 template<typename Derived, typename InputIterator>
3976 class TemplateArgumentLocInventIterator {
3977   TreeTransform<Derived> &Self;
3978   InputIterator Iter;
3979 
3980 public:
3981   typedef TemplateArgumentLoc value_type;
3982   typedef TemplateArgumentLoc reference;
3983   typedef typename std::iterator_traits<InputIterator>::difference_type
3984     difference_type;
3985   typedef std::input_iterator_tag iterator_category;
3986 
3987   class pointer {
3988     TemplateArgumentLoc Arg;
3989 
3990   public:
3991     explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
3992 
3993     const TemplateArgumentLoc *operator->() const { return &Arg; }
3994   };
3995 
3996   TemplateArgumentLocInventIterator() { }
3997 
3998   explicit TemplateArgumentLocInventIterator(TreeTransform<Derived> &Self,
3999                                              InputIterator Iter)
4000     : Self(Self), Iter(Iter) { }
4001 
4002   TemplateArgumentLocInventIterator &operator++() {
4003     ++Iter;
4004     return *this;
4005   }
4006 
4007   TemplateArgumentLocInventIterator operator++(int) {
4008     TemplateArgumentLocInventIterator Old(*this);
4009     ++(*this);
4010     return Old;
4011   }
4012 
4013   reference operator*() const {
4014     TemplateArgumentLoc Result;
4015     Self.InventTemplateArgumentLoc(*Iter, Result);
4016     return Result;
4017   }
4018 
4019   pointer operator->() const { return pointer(**this); }
4020 
4021   friend bool operator==(const TemplateArgumentLocInventIterator &X,
4022                          const TemplateArgumentLocInventIterator &Y) {
4023     return X.Iter == Y.Iter;
4024   }
4025 
4026   friend bool operator!=(const TemplateArgumentLocInventIterator &X,
4027                          const TemplateArgumentLocInventIterator &Y) {
4028     return X.Iter != Y.Iter;
4029   }
4030 };
4031 
4032 template<typename Derived>
4033 template<typename InputIterator>
4034 bool TreeTransform<Derived>::TransformTemplateArguments(
4035     InputIterator First, InputIterator Last, TemplateArgumentListInfo &Outputs,
4036     bool Uneval) {
4037   for (; First != Last; ++First) {
4038     TemplateArgumentLoc Out;
4039     TemplateArgumentLoc In = *First;
4040 
4041     if (In.getArgument().getKind() == TemplateArgument::Pack) {
4042       // Unpack argument packs, which we translate them into separate
4043       // arguments.
4044       // FIXME: We could do much better if we could guarantee that the
4045       // TemplateArgumentLocInfo for the pack expansion would be usable for
4046       // all of the template arguments in the argument pack.
4047       typedef TemplateArgumentLocInventIterator<Derived,
4048                                                 TemplateArgument::pack_iterator>
4049         PackLocIterator;
4050       if (TransformTemplateArguments(PackLocIterator(*this,
4051                                                  In.getArgument().pack_begin()),
4052                                      PackLocIterator(*this,
4053                                                    In.getArgument().pack_end()),
4054                                      Outputs, Uneval))
4055         return true;
4056 
4057       continue;
4058     }
4059 
4060     if (In.getArgument().isPackExpansion()) {
4061       // We have a pack expansion, for which we will be substituting into
4062       // the pattern.
4063       SourceLocation Ellipsis;
4064       Optional<unsigned> OrigNumExpansions;
4065       TemplateArgumentLoc Pattern
4066         = getSema().getTemplateArgumentPackExpansionPattern(
4067               In, Ellipsis, OrigNumExpansions);
4068 
4069       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
4070       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
4071       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
4072 
4073       // Determine whether the set of unexpanded parameter packs can and should
4074       // be expanded.
4075       bool Expand = true;
4076       bool RetainExpansion = false;
4077       Optional<unsigned> NumExpansions = OrigNumExpansions;
4078       if (getDerived().TryExpandParameterPacks(Ellipsis,
4079                                                Pattern.getSourceRange(),
4080                                                Unexpanded,
4081                                                Expand,
4082                                                RetainExpansion,
4083                                                NumExpansions))
4084         return true;
4085 
4086       if (!Expand) {
4087         // The transform has determined that we should perform a simple
4088         // transformation on the pack expansion, producing another pack
4089         // expansion.
4090         TemplateArgumentLoc OutPattern;
4091         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
4092         if (getDerived().TransformTemplateArgument(Pattern, OutPattern, Uneval))
4093           return true;
4094 
4095         Out = getDerived().RebuildPackExpansion(OutPattern, Ellipsis,
4096                                                 NumExpansions);
4097         if (Out.getArgument().isNull())
4098           return true;
4099 
4100         Outputs.addArgument(Out);
4101         continue;
4102       }
4103 
4104       // The transform has determined that we should perform an elementwise
4105       // expansion of the pattern. Do so.
4106       for (unsigned I = 0; I != *NumExpansions; ++I) {
4107         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
4108 
4109         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4110           return true;
4111 
4112         if (Out.getArgument().containsUnexpandedParameterPack()) {
4113           Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4114                                                   OrigNumExpansions);
4115           if (Out.getArgument().isNull())
4116             return true;
4117         }
4118 
4119         Outputs.addArgument(Out);
4120       }
4121 
4122       // If we're supposed to retain a pack expansion, do so by temporarily
4123       // forgetting the partially-substituted parameter pack.
4124       if (RetainExpansion) {
4125         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
4126 
4127         if (getDerived().TransformTemplateArgument(Pattern, Out, Uneval))
4128           return true;
4129 
4130         Out = getDerived().RebuildPackExpansion(Out, Ellipsis,
4131                                                 OrigNumExpansions);
4132         if (Out.getArgument().isNull())
4133           return true;
4134 
4135         Outputs.addArgument(Out);
4136       }
4137 
4138       continue;
4139     }
4140 
4141     // The simple case:
4142     if (getDerived().TransformTemplateArgument(In, Out, Uneval))
4143       return true;
4144 
4145     Outputs.addArgument(Out);
4146   }
4147 
4148   return false;
4149 
4150 }
4151 
4152 //===----------------------------------------------------------------------===//
4153 // Type transformation
4154 //===----------------------------------------------------------------------===//
4155 
4156 template<typename Derived>
4157 QualType TreeTransform<Derived>::TransformType(QualType T) {
4158   if (getDerived().AlreadyTransformed(T))
4159     return T;
4160 
4161   // Temporary workaround.  All of these transformations should
4162   // eventually turn into transformations on TypeLocs.
4163   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4164                                                 getDerived().getBaseLocation());
4165 
4166   TypeSourceInfo *NewDI = getDerived().TransformType(DI);
4167 
4168   if (!NewDI)
4169     return QualType();
4170 
4171   return NewDI->getType();
4172 }
4173 
4174 template<typename Derived>
4175 TypeSourceInfo *TreeTransform<Derived>::TransformType(TypeSourceInfo *DI) {
4176   // Refine the base location to the type's location.
4177   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4178                        getDerived().getBaseEntity());
4179   if (getDerived().AlreadyTransformed(DI->getType()))
4180     return DI;
4181 
4182   TypeLocBuilder TLB;
4183 
4184   TypeLoc TL = DI->getTypeLoc();
4185   TLB.reserve(TL.getFullDataSize());
4186 
4187   QualType Result = getDerived().TransformType(TLB, TL);
4188   if (Result.isNull())
4189     return nullptr;
4190 
4191   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4192 }
4193 
4194 template<typename Derived>
4195 QualType
4196 TreeTransform<Derived>::TransformType(TypeLocBuilder &TLB, TypeLoc T) {
4197   switch (T.getTypeLocClass()) {
4198 #define ABSTRACT_TYPELOC(CLASS, PARENT)
4199 #define TYPELOC(CLASS, PARENT)                                                 \
4200   case TypeLoc::CLASS:                                                         \
4201     return getDerived().Transform##CLASS##Type(TLB,                            \
4202                                                T.castAs<CLASS##TypeLoc>());
4203 #include "clang/AST/TypeLocNodes.def"
4204   }
4205 
4206   llvm_unreachable("unhandled type loc!");
4207 }
4208 
4209 template<typename Derived>
4210 QualType TreeTransform<Derived>::TransformTypeWithDeducedTST(QualType T) {
4211   if (!isa<DependentNameType>(T))
4212     return TransformType(T);
4213 
4214   if (getDerived().AlreadyTransformed(T))
4215     return T;
4216   TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(T,
4217                                                 getDerived().getBaseLocation());
4218   TypeSourceInfo *NewDI = getDerived().TransformTypeWithDeducedTST(DI);
4219   return NewDI ? NewDI->getType() : QualType();
4220 }
4221 
4222 template<typename Derived>
4223 TypeSourceInfo *
4224 TreeTransform<Derived>::TransformTypeWithDeducedTST(TypeSourceInfo *DI) {
4225   if (!isa<DependentNameType>(DI->getType()))
4226     return TransformType(DI);
4227 
4228   // Refine the base location to the type's location.
4229   TemporaryBase Rebase(*this, DI->getTypeLoc().getBeginLoc(),
4230                        getDerived().getBaseEntity());
4231   if (getDerived().AlreadyTransformed(DI->getType()))
4232     return DI;
4233 
4234   TypeLocBuilder TLB;
4235 
4236   TypeLoc TL = DI->getTypeLoc();
4237   TLB.reserve(TL.getFullDataSize());
4238 
4239   auto QTL = TL.getAs<QualifiedTypeLoc>();
4240   if (QTL)
4241     TL = QTL.getUnqualifiedLoc();
4242 
4243   auto DNTL = TL.castAs<DependentNameTypeLoc>();
4244 
4245   QualType Result = getDerived().TransformDependentNameType(
4246       TLB, DNTL, /*DeducedTSTContext*/true);
4247   if (Result.isNull())
4248     return nullptr;
4249 
4250   if (QTL) {
4251     Result = getDerived().RebuildQualifiedType(Result, QTL);
4252     if (Result.isNull())
4253       return nullptr;
4254     TLB.TypeWasModifiedSafely(Result);
4255   }
4256 
4257   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4258 }
4259 
4260 template<typename Derived>
4261 QualType
4262 TreeTransform<Derived>::TransformQualifiedType(TypeLocBuilder &TLB,
4263                                                QualifiedTypeLoc T) {
4264   QualType Result = getDerived().TransformType(TLB, T.getUnqualifiedLoc());
4265   if (Result.isNull())
4266     return QualType();
4267 
4268   Result = getDerived().RebuildQualifiedType(Result, T);
4269 
4270   if (Result.isNull())
4271     return QualType();
4272 
4273   // RebuildQualifiedType might have updated the type, but not in a way
4274   // that invalidates the TypeLoc. (There's no location information for
4275   // qualifiers.)
4276   TLB.TypeWasModifiedSafely(Result);
4277 
4278   return Result;
4279 }
4280 
4281 template <typename Derived>
4282 QualType TreeTransform<Derived>::RebuildQualifiedType(QualType T,
4283                                                       QualifiedTypeLoc TL) {
4284 
4285   SourceLocation Loc = TL.getBeginLoc();
4286   Qualifiers Quals = TL.getType().getLocalQualifiers();
4287 
4288   if (((T.getAddressSpace() != LangAS::Default &&
4289         Quals.getAddressSpace() != LangAS::Default)) &&
4290       T.getAddressSpace() != Quals.getAddressSpace()) {
4291     SemaRef.Diag(Loc, diag::err_address_space_mismatch_templ_inst)
4292         << TL.getType() << T;
4293     return QualType();
4294   }
4295 
4296   // C++ [dcl.fct]p7:
4297   //   [When] adding cv-qualifications on top of the function type [...] the
4298   //   cv-qualifiers are ignored.
4299   if (T->isFunctionType()) {
4300     T = SemaRef.getASTContext().getAddrSpaceQualType(T,
4301                                                      Quals.getAddressSpace());
4302     return T;
4303   }
4304 
4305   // C++ [dcl.ref]p1:
4306   //   when the cv-qualifiers are introduced through the use of a typedef-name
4307   //   or decltype-specifier [...] the cv-qualifiers are ignored.
4308   // Note that [dcl.ref]p1 lists all cases in which cv-qualifiers can be
4309   // applied to a reference type.
4310   if (T->isReferenceType()) {
4311     // The only qualifier that applies to a reference type is restrict.
4312     if (!Quals.hasRestrict())
4313       return T;
4314     Quals = Qualifiers::fromCVRMask(Qualifiers::Restrict);
4315   }
4316 
4317   // Suppress Objective-C lifetime qualifiers if they don't make sense for the
4318   // resulting type.
4319   if (Quals.hasObjCLifetime()) {
4320     if (!T->isObjCLifetimeType() && !T->isDependentType())
4321       Quals.removeObjCLifetime();
4322     else if (T.getObjCLifetime()) {
4323       // Objective-C ARC:
4324       //   A lifetime qualifier applied to a substituted template parameter
4325       //   overrides the lifetime qualifier from the template argument.
4326       const AutoType *AutoTy;
4327       if (const SubstTemplateTypeParmType *SubstTypeParam
4328                                 = dyn_cast<SubstTemplateTypeParmType>(T)) {
4329         QualType Replacement = SubstTypeParam->getReplacementType();
4330         Qualifiers Qs = Replacement.getQualifiers();
4331         Qs.removeObjCLifetime();
4332         Replacement = SemaRef.Context.getQualifiedType(
4333             Replacement.getUnqualifiedType(), Qs);
4334         T = SemaRef.Context.getSubstTemplateTypeParmType(
4335             SubstTypeParam->getReplacedParameter(), Replacement);
4336       } else if ((AutoTy = dyn_cast<AutoType>(T)) && AutoTy->isDeduced()) {
4337         // 'auto' types behave the same way as template parameters.
4338         QualType Deduced = AutoTy->getDeducedType();
4339         Qualifiers Qs = Deduced.getQualifiers();
4340         Qs.removeObjCLifetime();
4341         Deduced =
4342             SemaRef.Context.getQualifiedType(Deduced.getUnqualifiedType(), Qs);
4343         T = SemaRef.Context.getAutoType(Deduced, AutoTy->getKeyword(),
4344                                         AutoTy->isDependentType());
4345       } else {
4346         // Otherwise, complain about the addition of a qualifier to an
4347         // already-qualified type.
4348         // FIXME: Why is this check not in Sema::BuildQualifiedType?
4349         SemaRef.Diag(Loc, diag::err_attr_objc_ownership_redundant) << T;
4350         Quals.removeObjCLifetime();
4351       }
4352     }
4353   }
4354 
4355   return SemaRef.BuildQualifiedType(T, Loc, Quals);
4356 }
4357 
4358 template<typename Derived>
4359 TypeLoc
4360 TreeTransform<Derived>::TransformTypeInObjectScope(TypeLoc TL,
4361                                                    QualType ObjectType,
4362                                                    NamedDecl *UnqualLookup,
4363                                                    CXXScopeSpec &SS) {
4364   if (getDerived().AlreadyTransformed(TL.getType()))
4365     return TL;
4366 
4367   TypeSourceInfo *TSI =
4368       TransformTSIInObjectScope(TL, ObjectType, UnqualLookup, SS);
4369   if (TSI)
4370     return TSI->getTypeLoc();
4371   return TypeLoc();
4372 }
4373 
4374 template<typename Derived>
4375 TypeSourceInfo *
4376 TreeTransform<Derived>::TransformTypeInObjectScope(TypeSourceInfo *TSInfo,
4377                                                    QualType ObjectType,
4378                                                    NamedDecl *UnqualLookup,
4379                                                    CXXScopeSpec &SS) {
4380   if (getDerived().AlreadyTransformed(TSInfo->getType()))
4381     return TSInfo;
4382 
4383   return TransformTSIInObjectScope(TSInfo->getTypeLoc(), ObjectType,
4384                                    UnqualLookup, SS);
4385 }
4386 
4387 template <typename Derived>
4388 TypeSourceInfo *TreeTransform<Derived>::TransformTSIInObjectScope(
4389     TypeLoc TL, QualType ObjectType, NamedDecl *UnqualLookup,
4390     CXXScopeSpec &SS) {
4391   QualType T = TL.getType();
4392   assert(!getDerived().AlreadyTransformed(T));
4393 
4394   TypeLocBuilder TLB;
4395   QualType Result;
4396 
4397   if (isa<TemplateSpecializationType>(T)) {
4398     TemplateSpecializationTypeLoc SpecTL =
4399         TL.castAs<TemplateSpecializationTypeLoc>();
4400 
4401     TemplateName Template = getDerived().TransformTemplateName(
4402         SS, SpecTL.getTypePtr()->getTemplateName(), SpecTL.getTemplateNameLoc(),
4403         ObjectType, UnqualLookup, /*AllowInjectedClassName*/true);
4404     if (Template.isNull())
4405       return nullptr;
4406 
4407     Result = getDerived().TransformTemplateSpecializationType(TLB, SpecTL,
4408                                                               Template);
4409   } else if (isa<DependentTemplateSpecializationType>(T)) {
4410     DependentTemplateSpecializationTypeLoc SpecTL =
4411         TL.castAs<DependentTemplateSpecializationTypeLoc>();
4412 
4413     TemplateName Template
4414       = getDerived().RebuildTemplateName(SS,
4415                                          SpecTL.getTemplateKeywordLoc(),
4416                                          *SpecTL.getTypePtr()->getIdentifier(),
4417                                          SpecTL.getTemplateNameLoc(),
4418                                          ObjectType, UnqualLookup,
4419                                          /*AllowInjectedClassName*/true);
4420     if (Template.isNull())
4421       return nullptr;
4422 
4423     Result = getDerived().TransformDependentTemplateSpecializationType(TLB,
4424                                                                        SpecTL,
4425                                                                        Template,
4426                                                                        SS);
4427   } else {
4428     // Nothing special needs to be done for these.
4429     Result = getDerived().TransformType(TLB, TL);
4430   }
4431 
4432   if (Result.isNull())
4433     return nullptr;
4434 
4435   return TLB.getTypeSourceInfo(SemaRef.Context, Result);
4436 }
4437 
4438 template <class TyLoc> static inline
4439 QualType TransformTypeSpecType(TypeLocBuilder &TLB, TyLoc T) {
4440   TyLoc NewT = TLB.push<TyLoc>(T.getType());
4441   NewT.setNameLoc(T.getNameLoc());
4442   return T.getType();
4443 }
4444 
4445 template<typename Derived>
4446 QualType TreeTransform<Derived>::TransformBuiltinType(TypeLocBuilder &TLB,
4447                                                       BuiltinTypeLoc T) {
4448   BuiltinTypeLoc NewT = TLB.push<BuiltinTypeLoc>(T.getType());
4449   NewT.setBuiltinLoc(T.getBuiltinLoc());
4450   if (T.needsExtraLocalData())
4451     NewT.getWrittenBuiltinSpecs() = T.getWrittenBuiltinSpecs();
4452   return T.getType();
4453 }
4454 
4455 template<typename Derived>
4456 QualType TreeTransform<Derived>::TransformComplexType(TypeLocBuilder &TLB,
4457                                                       ComplexTypeLoc T) {
4458   // FIXME: recurse?
4459   return TransformTypeSpecType(TLB, T);
4460 }
4461 
4462 template <typename Derived>
4463 QualType TreeTransform<Derived>::TransformAdjustedType(TypeLocBuilder &TLB,
4464                                                        AdjustedTypeLoc TL) {
4465   // Adjustments applied during transformation are handled elsewhere.
4466   return getDerived().TransformType(TLB, TL.getOriginalLoc());
4467 }
4468 
4469 template<typename Derived>
4470 QualType TreeTransform<Derived>::TransformDecayedType(TypeLocBuilder &TLB,
4471                                                       DecayedTypeLoc TL) {
4472   QualType OriginalType = getDerived().TransformType(TLB, TL.getOriginalLoc());
4473   if (OriginalType.isNull())
4474     return QualType();
4475 
4476   QualType Result = TL.getType();
4477   if (getDerived().AlwaysRebuild() ||
4478       OriginalType != TL.getOriginalLoc().getType())
4479     Result = SemaRef.Context.getDecayedType(OriginalType);
4480   TLB.push<DecayedTypeLoc>(Result);
4481   // Nothing to set for DecayedTypeLoc.
4482   return Result;
4483 }
4484 
4485 template<typename Derived>
4486 QualType TreeTransform<Derived>::TransformPointerType(TypeLocBuilder &TLB,
4487                                                       PointerTypeLoc TL) {
4488   QualType PointeeType
4489     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4490   if (PointeeType.isNull())
4491     return QualType();
4492 
4493   QualType Result = TL.getType();
4494   if (PointeeType->getAs<ObjCObjectType>()) {
4495     // A dependent pointer type 'T *' has is being transformed such
4496     // that an Objective-C class type is being replaced for 'T'. The
4497     // resulting pointer type is an ObjCObjectPointerType, not a
4498     // PointerType.
4499     Result = SemaRef.Context.getObjCObjectPointerType(PointeeType);
4500 
4501     ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
4502     NewT.setStarLoc(TL.getStarLoc());
4503     return Result;
4504   }
4505 
4506   if (getDerived().AlwaysRebuild() ||
4507       PointeeType != TL.getPointeeLoc().getType()) {
4508     Result = getDerived().RebuildPointerType(PointeeType, TL.getSigilLoc());
4509     if (Result.isNull())
4510       return QualType();
4511   }
4512 
4513   // Objective-C ARC can add lifetime qualifiers to the type that we're
4514   // pointing to.
4515   TLB.TypeWasModifiedSafely(Result->getPointeeType());
4516 
4517   PointerTypeLoc NewT = TLB.push<PointerTypeLoc>(Result);
4518   NewT.setSigilLoc(TL.getSigilLoc());
4519   return Result;
4520 }
4521 
4522 template<typename Derived>
4523 QualType
4524 TreeTransform<Derived>::TransformBlockPointerType(TypeLocBuilder &TLB,
4525                                                   BlockPointerTypeLoc TL) {
4526   QualType PointeeType
4527     = getDerived().TransformType(TLB, TL.getPointeeLoc());
4528   if (PointeeType.isNull())
4529     return QualType();
4530 
4531   QualType Result = TL.getType();
4532   if (getDerived().AlwaysRebuild() ||
4533       PointeeType != TL.getPointeeLoc().getType()) {
4534     Result = getDerived().RebuildBlockPointerType(PointeeType,
4535                                                   TL.getSigilLoc());
4536     if (Result.isNull())
4537       return QualType();
4538   }
4539 
4540   BlockPointerTypeLoc NewT = TLB.push<BlockPointerTypeLoc>(Result);
4541   NewT.setSigilLoc(TL.getSigilLoc());
4542   return Result;
4543 }
4544 
4545 /// Transforms a reference type.  Note that somewhat paradoxically we
4546 /// don't care whether the type itself is an l-value type or an r-value
4547 /// type;  we only care if the type was *written* as an l-value type
4548 /// or an r-value type.
4549 template<typename Derived>
4550 QualType
4551 TreeTransform<Derived>::TransformReferenceType(TypeLocBuilder &TLB,
4552                                                ReferenceTypeLoc TL) {
4553   const ReferenceType *T = TL.getTypePtr();
4554 
4555   // Note that this works with the pointee-as-written.
4556   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4557   if (PointeeType.isNull())
4558     return QualType();
4559 
4560   QualType Result = TL.getType();
4561   if (getDerived().AlwaysRebuild() ||
4562       PointeeType != T->getPointeeTypeAsWritten()) {
4563     Result = getDerived().RebuildReferenceType(PointeeType,
4564                                                T->isSpelledAsLValue(),
4565                                                TL.getSigilLoc());
4566     if (Result.isNull())
4567       return QualType();
4568   }
4569 
4570   // Objective-C ARC can add lifetime qualifiers to the type that we're
4571   // referring to.
4572   TLB.TypeWasModifiedSafely(
4573                      Result->getAs<ReferenceType>()->getPointeeTypeAsWritten());
4574 
4575   // r-value references can be rebuilt as l-value references.
4576   ReferenceTypeLoc NewTL;
4577   if (isa<LValueReferenceType>(Result))
4578     NewTL = TLB.push<LValueReferenceTypeLoc>(Result);
4579   else
4580     NewTL = TLB.push<RValueReferenceTypeLoc>(Result);
4581   NewTL.setSigilLoc(TL.getSigilLoc());
4582 
4583   return Result;
4584 }
4585 
4586 template<typename Derived>
4587 QualType
4588 TreeTransform<Derived>::TransformLValueReferenceType(TypeLocBuilder &TLB,
4589                                                  LValueReferenceTypeLoc TL) {
4590   return TransformReferenceType(TLB, TL);
4591 }
4592 
4593 template<typename Derived>
4594 QualType
4595 TreeTransform<Derived>::TransformRValueReferenceType(TypeLocBuilder &TLB,
4596                                                  RValueReferenceTypeLoc TL) {
4597   return TransformReferenceType(TLB, TL);
4598 }
4599 
4600 template<typename Derived>
4601 QualType
4602 TreeTransform<Derived>::TransformMemberPointerType(TypeLocBuilder &TLB,
4603                                                    MemberPointerTypeLoc TL) {
4604   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
4605   if (PointeeType.isNull())
4606     return QualType();
4607 
4608   TypeSourceInfo* OldClsTInfo = TL.getClassTInfo();
4609   TypeSourceInfo *NewClsTInfo = nullptr;
4610   if (OldClsTInfo) {
4611     NewClsTInfo = getDerived().TransformType(OldClsTInfo);
4612     if (!NewClsTInfo)
4613       return QualType();
4614   }
4615 
4616   const MemberPointerType *T = TL.getTypePtr();
4617   QualType OldClsType = QualType(T->getClass(), 0);
4618   QualType NewClsType;
4619   if (NewClsTInfo)
4620     NewClsType = NewClsTInfo->getType();
4621   else {
4622     NewClsType = getDerived().TransformType(OldClsType);
4623     if (NewClsType.isNull())
4624       return QualType();
4625   }
4626 
4627   QualType Result = TL.getType();
4628   if (getDerived().AlwaysRebuild() ||
4629       PointeeType != T->getPointeeType() ||
4630       NewClsType != OldClsType) {
4631     Result = getDerived().RebuildMemberPointerType(PointeeType, NewClsType,
4632                                                    TL.getStarLoc());
4633     if (Result.isNull())
4634       return QualType();
4635   }
4636 
4637   // If we had to adjust the pointee type when building a member pointer, make
4638   // sure to push TypeLoc info for it.
4639   const MemberPointerType *MPT = Result->getAs<MemberPointerType>();
4640   if (MPT && PointeeType != MPT->getPointeeType()) {
4641     assert(isa<AdjustedType>(MPT->getPointeeType()));
4642     TLB.push<AdjustedTypeLoc>(MPT->getPointeeType());
4643   }
4644 
4645   MemberPointerTypeLoc NewTL = TLB.push<MemberPointerTypeLoc>(Result);
4646   NewTL.setSigilLoc(TL.getSigilLoc());
4647   NewTL.setClassTInfo(NewClsTInfo);
4648 
4649   return Result;
4650 }
4651 
4652 template<typename Derived>
4653 QualType
4654 TreeTransform<Derived>::TransformConstantArrayType(TypeLocBuilder &TLB,
4655                                                    ConstantArrayTypeLoc TL) {
4656   const ConstantArrayType *T = TL.getTypePtr();
4657   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4658   if (ElementType.isNull())
4659     return QualType();
4660 
4661   QualType Result = TL.getType();
4662   if (getDerived().AlwaysRebuild() ||
4663       ElementType != T->getElementType()) {
4664     Result = getDerived().RebuildConstantArrayType(ElementType,
4665                                                    T->getSizeModifier(),
4666                                                    T->getSize(),
4667                                              T->getIndexTypeCVRQualifiers(),
4668                                                    TL.getBracketsRange());
4669     if (Result.isNull())
4670       return QualType();
4671   }
4672 
4673   // We might have either a ConstantArrayType or a VariableArrayType now:
4674   // a ConstantArrayType is allowed to have an element type which is a
4675   // VariableArrayType if the type is dependent.  Fortunately, all array
4676   // types have the same location layout.
4677   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4678   NewTL.setLBracketLoc(TL.getLBracketLoc());
4679   NewTL.setRBracketLoc(TL.getRBracketLoc());
4680 
4681   Expr *Size = TL.getSizeExpr();
4682   if (Size) {
4683     EnterExpressionEvaluationContext Unevaluated(
4684         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4685     Size = getDerived().TransformExpr(Size).template getAs<Expr>();
4686     Size = SemaRef.ActOnConstantExpression(Size).get();
4687   }
4688   NewTL.setSizeExpr(Size);
4689 
4690   return Result;
4691 }
4692 
4693 template<typename Derived>
4694 QualType TreeTransform<Derived>::TransformIncompleteArrayType(
4695                                               TypeLocBuilder &TLB,
4696                                               IncompleteArrayTypeLoc TL) {
4697   const IncompleteArrayType *T = TL.getTypePtr();
4698   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4699   if (ElementType.isNull())
4700     return QualType();
4701 
4702   QualType Result = TL.getType();
4703   if (getDerived().AlwaysRebuild() ||
4704       ElementType != T->getElementType()) {
4705     Result = getDerived().RebuildIncompleteArrayType(ElementType,
4706                                                      T->getSizeModifier(),
4707                                            T->getIndexTypeCVRQualifiers(),
4708                                                      TL.getBracketsRange());
4709     if (Result.isNull())
4710       return QualType();
4711   }
4712 
4713   IncompleteArrayTypeLoc NewTL = TLB.push<IncompleteArrayTypeLoc>(Result);
4714   NewTL.setLBracketLoc(TL.getLBracketLoc());
4715   NewTL.setRBracketLoc(TL.getRBracketLoc());
4716   NewTL.setSizeExpr(nullptr);
4717 
4718   return Result;
4719 }
4720 
4721 template<typename Derived>
4722 QualType
4723 TreeTransform<Derived>::TransformVariableArrayType(TypeLocBuilder &TLB,
4724                                                    VariableArrayTypeLoc TL) {
4725   const VariableArrayType *T = TL.getTypePtr();
4726   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4727   if (ElementType.isNull())
4728     return QualType();
4729 
4730   ExprResult SizeResult;
4731   {
4732     EnterExpressionEvaluationContext Context(
4733         SemaRef, Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
4734     SizeResult = getDerived().TransformExpr(T->getSizeExpr());
4735   }
4736   if (SizeResult.isInvalid())
4737     return QualType();
4738   SizeResult =
4739       SemaRef.ActOnFinishFullExpr(SizeResult.get(), /*DiscardedValue*/ false);
4740   if (SizeResult.isInvalid())
4741     return QualType();
4742 
4743   Expr *Size = SizeResult.get();
4744 
4745   QualType Result = TL.getType();
4746   if (getDerived().AlwaysRebuild() ||
4747       ElementType != T->getElementType() ||
4748       Size != T->getSizeExpr()) {
4749     Result = getDerived().RebuildVariableArrayType(ElementType,
4750                                                    T->getSizeModifier(),
4751                                                    Size,
4752                                              T->getIndexTypeCVRQualifiers(),
4753                                                    TL.getBracketsRange());
4754     if (Result.isNull())
4755       return QualType();
4756   }
4757 
4758   // We might have constant size array now, but fortunately it has the same
4759   // location layout.
4760   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4761   NewTL.setLBracketLoc(TL.getLBracketLoc());
4762   NewTL.setRBracketLoc(TL.getRBracketLoc());
4763   NewTL.setSizeExpr(Size);
4764 
4765   return Result;
4766 }
4767 
4768 template<typename Derived>
4769 QualType
4770 TreeTransform<Derived>::TransformDependentSizedArrayType(TypeLocBuilder &TLB,
4771                                              DependentSizedArrayTypeLoc TL) {
4772   const DependentSizedArrayType *T = TL.getTypePtr();
4773   QualType ElementType = getDerived().TransformType(TLB, TL.getElementLoc());
4774   if (ElementType.isNull())
4775     return QualType();
4776 
4777   // Array bounds are constant expressions.
4778   EnterExpressionEvaluationContext Unevaluated(
4779       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4780 
4781   // Prefer the expression from the TypeLoc;  the other may have been uniqued.
4782   Expr *origSize = TL.getSizeExpr();
4783   if (!origSize) origSize = T->getSizeExpr();
4784 
4785   ExprResult sizeResult
4786     = getDerived().TransformExpr(origSize);
4787   sizeResult = SemaRef.ActOnConstantExpression(sizeResult);
4788   if (sizeResult.isInvalid())
4789     return QualType();
4790 
4791   Expr *size = sizeResult.get();
4792 
4793   QualType Result = TL.getType();
4794   if (getDerived().AlwaysRebuild() ||
4795       ElementType != T->getElementType() ||
4796       size != origSize) {
4797     Result = getDerived().RebuildDependentSizedArrayType(ElementType,
4798                                                          T->getSizeModifier(),
4799                                                          size,
4800                                                 T->getIndexTypeCVRQualifiers(),
4801                                                         TL.getBracketsRange());
4802     if (Result.isNull())
4803       return QualType();
4804   }
4805 
4806   // We might have any sort of array type now, but fortunately they
4807   // all have the same location layout.
4808   ArrayTypeLoc NewTL = TLB.push<ArrayTypeLoc>(Result);
4809   NewTL.setLBracketLoc(TL.getLBracketLoc());
4810   NewTL.setRBracketLoc(TL.getRBracketLoc());
4811   NewTL.setSizeExpr(size);
4812 
4813   return Result;
4814 }
4815 
4816 template <typename Derived>
4817 QualType TreeTransform<Derived>::TransformDependentVectorType(
4818     TypeLocBuilder &TLB, DependentVectorTypeLoc TL) {
4819   const DependentVectorType *T = TL.getTypePtr();
4820   QualType ElementType = getDerived().TransformType(T->getElementType());
4821   if (ElementType.isNull())
4822     return QualType();
4823 
4824   EnterExpressionEvaluationContext Unevaluated(
4825       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4826 
4827   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4828   Size = SemaRef.ActOnConstantExpression(Size);
4829   if (Size.isInvalid())
4830     return QualType();
4831 
4832   QualType Result = TL.getType();
4833   if (getDerived().AlwaysRebuild() || ElementType != T->getElementType() ||
4834       Size.get() != T->getSizeExpr()) {
4835     Result = getDerived().RebuildDependentVectorType(
4836         ElementType, Size.get(), T->getAttributeLoc(), T->getVectorKind());
4837     if (Result.isNull())
4838       return QualType();
4839   }
4840 
4841   // Result might be dependent or not.
4842   if (isa<DependentVectorType>(Result)) {
4843     DependentVectorTypeLoc NewTL =
4844         TLB.push<DependentVectorTypeLoc>(Result);
4845     NewTL.setNameLoc(TL.getNameLoc());
4846   } else {
4847     VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4848     NewTL.setNameLoc(TL.getNameLoc());
4849   }
4850 
4851   return Result;
4852 }
4853 
4854 template<typename Derived>
4855 QualType TreeTransform<Derived>::TransformDependentSizedExtVectorType(
4856                                       TypeLocBuilder &TLB,
4857                                       DependentSizedExtVectorTypeLoc TL) {
4858   const DependentSizedExtVectorType *T = TL.getTypePtr();
4859 
4860   // FIXME: ext vector locs should be nested
4861   QualType ElementType = getDerived().TransformType(T->getElementType());
4862   if (ElementType.isNull())
4863     return QualType();
4864 
4865   // Vector sizes are constant expressions.
4866   EnterExpressionEvaluationContext Unevaluated(
4867       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4868 
4869   ExprResult Size = getDerived().TransformExpr(T->getSizeExpr());
4870   Size = SemaRef.ActOnConstantExpression(Size);
4871   if (Size.isInvalid())
4872     return QualType();
4873 
4874   QualType Result = TL.getType();
4875   if (getDerived().AlwaysRebuild() ||
4876       ElementType != T->getElementType() ||
4877       Size.get() != T->getSizeExpr()) {
4878     Result = getDerived().RebuildDependentSizedExtVectorType(ElementType,
4879                                                              Size.get(),
4880                                                          T->getAttributeLoc());
4881     if (Result.isNull())
4882       return QualType();
4883   }
4884 
4885   // Result might be dependent or not.
4886   if (isa<DependentSizedExtVectorType>(Result)) {
4887     DependentSizedExtVectorTypeLoc NewTL
4888       = TLB.push<DependentSizedExtVectorTypeLoc>(Result);
4889     NewTL.setNameLoc(TL.getNameLoc());
4890   } else {
4891     ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4892     NewTL.setNameLoc(TL.getNameLoc());
4893   }
4894 
4895   return Result;
4896 }
4897 
4898 template <typename Derived>
4899 QualType TreeTransform<Derived>::TransformDependentAddressSpaceType(
4900     TypeLocBuilder &TLB, DependentAddressSpaceTypeLoc TL) {
4901   const DependentAddressSpaceType *T = TL.getTypePtr();
4902 
4903   QualType pointeeType = getDerived().TransformType(T->getPointeeType());
4904 
4905   if (pointeeType.isNull())
4906     return QualType();
4907 
4908   // Address spaces are constant expressions.
4909   EnterExpressionEvaluationContext Unevaluated(
4910       SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
4911 
4912   ExprResult AddrSpace = getDerived().TransformExpr(T->getAddrSpaceExpr());
4913   AddrSpace = SemaRef.ActOnConstantExpression(AddrSpace);
4914   if (AddrSpace.isInvalid())
4915     return QualType();
4916 
4917   QualType Result = TL.getType();
4918   if (getDerived().AlwaysRebuild() || pointeeType != T->getPointeeType() ||
4919       AddrSpace.get() != T->getAddrSpaceExpr()) {
4920     Result = getDerived().RebuildDependentAddressSpaceType(
4921         pointeeType, AddrSpace.get(), T->getAttributeLoc());
4922     if (Result.isNull())
4923       return QualType();
4924   }
4925 
4926   // Result might be dependent or not.
4927   if (isa<DependentAddressSpaceType>(Result)) {
4928     DependentAddressSpaceTypeLoc NewTL =
4929         TLB.push<DependentAddressSpaceTypeLoc>(Result);
4930 
4931     NewTL.setAttrOperandParensRange(TL.getAttrOperandParensRange());
4932     NewTL.setAttrExprOperand(TL.getAttrExprOperand());
4933     NewTL.setAttrNameLoc(TL.getAttrNameLoc());
4934 
4935   } else {
4936     TypeSourceInfo *DI = getSema().Context.getTrivialTypeSourceInfo(
4937         Result, getDerived().getBaseLocation());
4938     TransformType(TLB, DI->getTypeLoc());
4939   }
4940 
4941   return Result;
4942 }
4943 
4944 template <typename Derived>
4945 QualType TreeTransform<Derived>::TransformVectorType(TypeLocBuilder &TLB,
4946                                                      VectorTypeLoc TL) {
4947   const VectorType *T = TL.getTypePtr();
4948   QualType ElementType = getDerived().TransformType(T->getElementType());
4949   if (ElementType.isNull())
4950     return QualType();
4951 
4952   QualType Result = TL.getType();
4953   if (getDerived().AlwaysRebuild() ||
4954       ElementType != T->getElementType()) {
4955     Result = getDerived().RebuildVectorType(ElementType, T->getNumElements(),
4956                                             T->getVectorKind());
4957     if (Result.isNull())
4958       return QualType();
4959   }
4960 
4961   VectorTypeLoc NewTL = TLB.push<VectorTypeLoc>(Result);
4962   NewTL.setNameLoc(TL.getNameLoc());
4963 
4964   return Result;
4965 }
4966 
4967 template<typename Derived>
4968 QualType TreeTransform<Derived>::TransformExtVectorType(TypeLocBuilder &TLB,
4969                                                         ExtVectorTypeLoc TL) {
4970   const VectorType *T = TL.getTypePtr();
4971   QualType ElementType = getDerived().TransformType(T->getElementType());
4972   if (ElementType.isNull())
4973     return QualType();
4974 
4975   QualType Result = TL.getType();
4976   if (getDerived().AlwaysRebuild() ||
4977       ElementType != T->getElementType()) {
4978     Result = getDerived().RebuildExtVectorType(ElementType,
4979                                                T->getNumElements(),
4980                                                /*FIXME*/ SourceLocation());
4981     if (Result.isNull())
4982       return QualType();
4983   }
4984 
4985   ExtVectorTypeLoc NewTL = TLB.push<ExtVectorTypeLoc>(Result);
4986   NewTL.setNameLoc(TL.getNameLoc());
4987 
4988   return Result;
4989 }
4990 
4991 template <typename Derived>
4992 ParmVarDecl *TreeTransform<Derived>::TransformFunctionTypeParam(
4993     ParmVarDecl *OldParm, int indexAdjustment, Optional<unsigned> NumExpansions,
4994     bool ExpectParameterPack) {
4995   TypeSourceInfo *OldDI = OldParm->getTypeSourceInfo();
4996   TypeSourceInfo *NewDI = nullptr;
4997 
4998   if (NumExpansions && isa<PackExpansionType>(OldDI->getType())) {
4999     // If we're substituting into a pack expansion type and we know the
5000     // length we want to expand to, just substitute for the pattern.
5001     TypeLoc OldTL = OldDI->getTypeLoc();
5002     PackExpansionTypeLoc OldExpansionTL = OldTL.castAs<PackExpansionTypeLoc>();
5003 
5004     TypeLocBuilder TLB;
5005     TypeLoc NewTL = OldDI->getTypeLoc();
5006     TLB.reserve(NewTL.getFullDataSize());
5007 
5008     QualType Result = getDerived().TransformType(TLB,
5009                                                OldExpansionTL.getPatternLoc());
5010     if (Result.isNull())
5011       return nullptr;
5012 
5013     Result = RebuildPackExpansionType(Result,
5014                                 OldExpansionTL.getPatternLoc().getSourceRange(),
5015                                       OldExpansionTL.getEllipsisLoc(),
5016                                       NumExpansions);
5017     if (Result.isNull())
5018       return nullptr;
5019 
5020     PackExpansionTypeLoc NewExpansionTL
5021       = TLB.push<PackExpansionTypeLoc>(Result);
5022     NewExpansionTL.setEllipsisLoc(OldExpansionTL.getEllipsisLoc());
5023     NewDI = TLB.getTypeSourceInfo(SemaRef.Context, Result);
5024   } else
5025     NewDI = getDerived().TransformType(OldDI);
5026   if (!NewDI)
5027     return nullptr;
5028 
5029   if (NewDI == OldDI && indexAdjustment == 0)
5030     return OldParm;
5031 
5032   ParmVarDecl *newParm = ParmVarDecl::Create(SemaRef.Context,
5033                                              OldParm->getDeclContext(),
5034                                              OldParm->getInnerLocStart(),
5035                                              OldParm->getLocation(),
5036                                              OldParm->getIdentifier(),
5037                                              NewDI->getType(),
5038                                              NewDI,
5039                                              OldParm->getStorageClass(),
5040                                              /* DefArg */ nullptr);
5041   newParm->setScopeInfo(OldParm->getFunctionScopeDepth(),
5042                         OldParm->getFunctionScopeIndex() + indexAdjustment);
5043   return newParm;
5044 }
5045 
5046 template <typename Derived>
5047 bool TreeTransform<Derived>::TransformFunctionTypeParams(
5048     SourceLocation Loc, ArrayRef<ParmVarDecl *> Params,
5049     const QualType *ParamTypes,
5050     const FunctionProtoType::ExtParameterInfo *ParamInfos,
5051     SmallVectorImpl<QualType> &OutParamTypes,
5052     SmallVectorImpl<ParmVarDecl *> *PVars,
5053     Sema::ExtParameterInfoBuilder &PInfos) {
5054   int indexAdjustment = 0;
5055 
5056   unsigned NumParams = Params.size();
5057   for (unsigned i = 0; i != NumParams; ++i) {
5058     if (ParmVarDecl *OldParm = Params[i]) {
5059       assert(OldParm->getFunctionScopeIndex() == i);
5060 
5061       Optional<unsigned> NumExpansions;
5062       ParmVarDecl *NewParm = nullptr;
5063       if (OldParm->isParameterPack()) {
5064         // We have a function parameter pack that may need to be expanded.
5065         SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5066 
5067         // Find the parameter packs that could be expanded.
5068         TypeLoc TL = OldParm->getTypeSourceInfo()->getTypeLoc();
5069         PackExpansionTypeLoc ExpansionTL = TL.castAs<PackExpansionTypeLoc>();
5070         TypeLoc Pattern = ExpansionTL.getPatternLoc();
5071         SemaRef.collectUnexpandedParameterPacks(Pattern, Unexpanded);
5072         assert(Unexpanded.size() > 0 && "Could not find parameter packs!");
5073 
5074         // Determine whether we should expand the parameter packs.
5075         bool ShouldExpand = false;
5076         bool RetainExpansion = false;
5077         Optional<unsigned> OrigNumExpansions =
5078             ExpansionTL.getTypePtr()->getNumExpansions();
5079         NumExpansions = OrigNumExpansions;
5080         if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
5081                                                  Pattern.getSourceRange(),
5082                                                  Unexpanded,
5083                                                  ShouldExpand,
5084                                                  RetainExpansion,
5085                                                  NumExpansions)) {
5086           return true;
5087         }
5088 
5089         if (ShouldExpand) {
5090           // Expand the function parameter pack into multiple, separate
5091           // parameters.
5092           getDerived().ExpandingFunctionParameterPack(OldParm);
5093           for (unsigned I = 0; I != *NumExpansions; ++I) {
5094             Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5095             ParmVarDecl *NewParm
5096               = getDerived().TransformFunctionTypeParam(OldParm,
5097                                                         indexAdjustment++,
5098                                                         OrigNumExpansions,
5099                                                 /*ExpectParameterPack=*/false);
5100             if (!NewParm)
5101               return true;
5102 
5103             if (ParamInfos)
5104               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5105             OutParamTypes.push_back(NewParm->getType());
5106             if (PVars)
5107               PVars->push_back(NewParm);
5108           }
5109 
5110           // If we're supposed to retain a pack expansion, do so by temporarily
5111           // forgetting the partially-substituted parameter pack.
5112           if (RetainExpansion) {
5113             ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5114             ParmVarDecl *NewParm
5115               = getDerived().TransformFunctionTypeParam(OldParm,
5116                                                         indexAdjustment++,
5117                                                         OrigNumExpansions,
5118                                                 /*ExpectParameterPack=*/false);
5119             if (!NewParm)
5120               return true;
5121 
5122             if (ParamInfos)
5123               PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5124             OutParamTypes.push_back(NewParm->getType());
5125             if (PVars)
5126               PVars->push_back(NewParm);
5127           }
5128 
5129           // The next parameter should have the same adjustment as the
5130           // last thing we pushed, but we post-incremented indexAdjustment
5131           // on every push.  Also, if we push nothing, the adjustment should
5132           // go down by one.
5133           indexAdjustment--;
5134 
5135           // We're done with the pack expansion.
5136           continue;
5137         }
5138 
5139         // We'll substitute the parameter now without expanding the pack
5140         // expansion.
5141         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5142         NewParm = getDerived().TransformFunctionTypeParam(OldParm,
5143                                                           indexAdjustment,
5144                                                           NumExpansions,
5145                                                   /*ExpectParameterPack=*/true);
5146       } else {
5147         NewParm = getDerived().TransformFunctionTypeParam(
5148             OldParm, indexAdjustment, None, /*ExpectParameterPack=*/ false);
5149       }
5150 
5151       if (!NewParm)
5152         return true;
5153 
5154       if (ParamInfos)
5155         PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5156       OutParamTypes.push_back(NewParm->getType());
5157       if (PVars)
5158         PVars->push_back(NewParm);
5159       continue;
5160     }
5161 
5162     // Deal with the possibility that we don't have a parameter
5163     // declaration for this parameter.
5164     QualType OldType = ParamTypes[i];
5165     bool IsPackExpansion = false;
5166     Optional<unsigned> NumExpansions;
5167     QualType NewType;
5168     if (const PackExpansionType *Expansion
5169                                        = dyn_cast<PackExpansionType>(OldType)) {
5170       // We have a function parameter pack that may need to be expanded.
5171       QualType Pattern = Expansion->getPattern();
5172       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5173       getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
5174 
5175       // Determine whether we should expand the parameter packs.
5176       bool ShouldExpand = false;
5177       bool RetainExpansion = false;
5178       if (getDerived().TryExpandParameterPacks(Loc, SourceRange(),
5179                                                Unexpanded,
5180                                                ShouldExpand,
5181                                                RetainExpansion,
5182                                                NumExpansions)) {
5183         return true;
5184       }
5185 
5186       if (ShouldExpand) {
5187         // Expand the function parameter pack into multiple, separate
5188         // parameters.
5189         for (unsigned I = 0; I != *NumExpansions; ++I) {
5190           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
5191           QualType NewType = getDerived().TransformType(Pattern);
5192           if (NewType.isNull())
5193             return true;
5194 
5195           if (NewType->containsUnexpandedParameterPack()) {
5196             NewType =
5197                 getSema().getASTContext().getPackExpansionType(NewType, None);
5198 
5199             if (NewType.isNull())
5200               return true;
5201           }
5202 
5203           if (ParamInfos)
5204             PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5205           OutParamTypes.push_back(NewType);
5206           if (PVars)
5207             PVars->push_back(nullptr);
5208         }
5209 
5210         // We're done with the pack expansion.
5211         continue;
5212       }
5213 
5214       // If we're supposed to retain a pack expansion, do so by temporarily
5215       // forgetting the partially-substituted parameter pack.
5216       if (RetainExpansion) {
5217         ForgetPartiallySubstitutedPackRAII Forget(getDerived());
5218         QualType NewType = getDerived().TransformType(Pattern);
5219         if (NewType.isNull())
5220           return true;
5221 
5222         if (ParamInfos)
5223           PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5224         OutParamTypes.push_back(NewType);
5225         if (PVars)
5226           PVars->push_back(nullptr);
5227       }
5228 
5229       // We'll substitute the parameter now without expanding the pack
5230       // expansion.
5231       OldType = Expansion->getPattern();
5232       IsPackExpansion = true;
5233       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5234       NewType = getDerived().TransformType(OldType);
5235     } else {
5236       NewType = getDerived().TransformType(OldType);
5237     }
5238 
5239     if (NewType.isNull())
5240       return true;
5241 
5242     if (IsPackExpansion)
5243       NewType = getSema().Context.getPackExpansionType(NewType,
5244                                                        NumExpansions);
5245 
5246     if (ParamInfos)
5247       PInfos.set(OutParamTypes.size(), ParamInfos[i]);
5248     OutParamTypes.push_back(NewType);
5249     if (PVars)
5250       PVars->push_back(nullptr);
5251   }
5252 
5253 #ifndef NDEBUG
5254   if (PVars) {
5255     for (unsigned i = 0, e = PVars->size(); i != e; ++i)
5256       if (ParmVarDecl *parm = (*PVars)[i])
5257         assert(parm->getFunctionScopeIndex() == i);
5258   }
5259 #endif
5260 
5261   return false;
5262 }
5263 
5264 template<typename Derived>
5265 QualType
5266 TreeTransform<Derived>::TransformFunctionProtoType(TypeLocBuilder &TLB,
5267                                                    FunctionProtoTypeLoc TL) {
5268   SmallVector<QualType, 4> ExceptionStorage;
5269   TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
5270   return getDerived().TransformFunctionProtoType(
5271       TLB, TL, nullptr, Qualifiers(),
5272       [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
5273         return This->TransformExceptionSpec(TL.getBeginLoc(), ESI,
5274                                             ExceptionStorage, Changed);
5275       });
5276 }
5277 
5278 template<typename Derived> template<typename Fn>
5279 QualType TreeTransform<Derived>::TransformFunctionProtoType(
5280     TypeLocBuilder &TLB, FunctionProtoTypeLoc TL, CXXRecordDecl *ThisContext,
5281     Qualifiers ThisTypeQuals, Fn TransformExceptionSpec) {
5282 
5283   // Transform the parameters and return type.
5284   //
5285   // We are required to instantiate the params and return type in source order.
5286   // When the function has a trailing return type, we instantiate the
5287   // parameters before the return type,  since the return type can then refer
5288   // to the parameters themselves (via decltype, sizeof, etc.).
5289   //
5290   SmallVector<QualType, 4> ParamTypes;
5291   SmallVector<ParmVarDecl*, 4> ParamDecls;
5292   Sema::ExtParameterInfoBuilder ExtParamInfos;
5293   const FunctionProtoType *T = TL.getTypePtr();
5294 
5295   QualType ResultType;
5296 
5297   if (T->hasTrailingReturn()) {
5298     if (getDerived().TransformFunctionTypeParams(
5299             TL.getBeginLoc(), TL.getParams(),
5300             TL.getTypePtr()->param_type_begin(),
5301             T->getExtParameterInfosOrNull(),
5302             ParamTypes, &ParamDecls, ExtParamInfos))
5303       return QualType();
5304 
5305     {
5306       // C++11 [expr.prim.general]p3:
5307       //   If a declaration declares a member function or member function
5308       //   template of a class X, the expression this is a prvalue of type
5309       //   "pointer to cv-qualifier-seq X" between the optional cv-qualifer-seq
5310       //   and the end of the function-definition, member-declarator, or
5311       //   declarator.
5312       Sema::CXXThisScopeRAII ThisScope(SemaRef, ThisContext, ThisTypeQuals);
5313 
5314       ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5315       if (ResultType.isNull())
5316         return QualType();
5317     }
5318   }
5319   else {
5320     ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5321     if (ResultType.isNull())
5322       return QualType();
5323 
5324     // Return type can not be qualified with an address space.
5325     if (ResultType.getAddressSpace() != LangAS::Default) {
5326       SemaRef.Diag(TL.getReturnLoc().getBeginLoc(),
5327                    diag::err_attribute_address_function_type);
5328       return QualType();
5329     }
5330 
5331     if (getDerived().TransformFunctionTypeParams(
5332             TL.getBeginLoc(), TL.getParams(),
5333             TL.getTypePtr()->param_type_begin(),
5334             T->getExtParameterInfosOrNull(),
5335             ParamTypes, &ParamDecls, ExtParamInfos))
5336       return QualType();
5337   }
5338 
5339   FunctionProtoType::ExtProtoInfo EPI = T->getExtProtoInfo();
5340 
5341   bool EPIChanged = false;
5342   if (TransformExceptionSpec(EPI.ExceptionSpec, EPIChanged))
5343     return QualType();
5344 
5345   // Handle extended parameter information.
5346   if (auto NewExtParamInfos =
5347         ExtParamInfos.getPointerOrNull(ParamTypes.size())) {
5348     if (!EPI.ExtParameterInfos ||
5349         llvm::makeArrayRef(EPI.ExtParameterInfos, TL.getNumParams())
5350           != llvm::makeArrayRef(NewExtParamInfos, ParamTypes.size())) {
5351       EPIChanged = true;
5352     }
5353     EPI.ExtParameterInfos = NewExtParamInfos;
5354   } else if (EPI.ExtParameterInfos) {
5355     EPIChanged = true;
5356     EPI.ExtParameterInfos = nullptr;
5357   }
5358 
5359   QualType Result = TL.getType();
5360   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType() ||
5361       T->getParamTypes() != llvm::makeArrayRef(ParamTypes) || EPIChanged) {
5362     Result = getDerived().RebuildFunctionProtoType(ResultType, ParamTypes, EPI);
5363     if (Result.isNull())
5364       return QualType();
5365   }
5366 
5367   FunctionProtoTypeLoc NewTL = TLB.push<FunctionProtoTypeLoc>(Result);
5368   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5369   NewTL.setLParenLoc(TL.getLParenLoc());
5370   NewTL.setRParenLoc(TL.getRParenLoc());
5371   NewTL.setExceptionSpecRange(TL.getExceptionSpecRange());
5372   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5373   for (unsigned i = 0, e = NewTL.getNumParams(); i != e; ++i)
5374     NewTL.setParam(i, ParamDecls[i]);
5375 
5376   return Result;
5377 }
5378 
5379 template<typename Derived>
5380 bool TreeTransform<Derived>::TransformExceptionSpec(
5381     SourceLocation Loc, FunctionProtoType::ExceptionSpecInfo &ESI,
5382     SmallVectorImpl<QualType> &Exceptions, bool &Changed) {
5383   assert(ESI.Type != EST_Uninstantiated && ESI.Type != EST_Unevaluated);
5384 
5385   // Instantiate a dynamic noexcept expression, if any.
5386   if (isComputedNoexcept(ESI.Type)) {
5387     EnterExpressionEvaluationContext Unevaluated(
5388         getSema(), Sema::ExpressionEvaluationContext::ConstantEvaluated);
5389     ExprResult NoexceptExpr = getDerived().TransformExpr(ESI.NoexceptExpr);
5390     if (NoexceptExpr.isInvalid())
5391       return true;
5392 
5393     ExceptionSpecificationType EST = ESI.Type;
5394     NoexceptExpr =
5395         getSema().ActOnNoexceptSpec(Loc, NoexceptExpr.get(), EST);
5396     if (NoexceptExpr.isInvalid())
5397       return true;
5398 
5399     if (ESI.NoexceptExpr != NoexceptExpr.get() || EST != ESI.Type)
5400       Changed = true;
5401     ESI.NoexceptExpr = NoexceptExpr.get();
5402     ESI.Type = EST;
5403   }
5404 
5405   if (ESI.Type != EST_Dynamic)
5406     return false;
5407 
5408   // Instantiate a dynamic exception specification's type.
5409   for (QualType T : ESI.Exceptions) {
5410     if (const PackExpansionType *PackExpansion =
5411             T->getAs<PackExpansionType>()) {
5412       Changed = true;
5413 
5414       // We have a pack expansion. Instantiate it.
5415       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
5416       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
5417                                               Unexpanded);
5418       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
5419 
5420       // Determine whether the set of unexpanded parameter packs can and
5421       // should
5422       // be expanded.
5423       bool Expand = false;
5424       bool RetainExpansion = false;
5425       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
5426       // FIXME: Track the location of the ellipsis (and track source location
5427       // information for the types in the exception specification in general).
5428       if (getDerived().TryExpandParameterPacks(
5429               Loc, SourceRange(), Unexpanded, Expand,
5430               RetainExpansion, NumExpansions))
5431         return true;
5432 
5433       if (!Expand) {
5434         // We can't expand this pack expansion into separate arguments yet;
5435         // just substitute into the pattern and create a new pack expansion
5436         // type.
5437         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
5438         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5439         if (U.isNull())
5440           return true;
5441 
5442         U = SemaRef.Context.getPackExpansionType(U, NumExpansions);
5443         Exceptions.push_back(U);
5444         continue;
5445       }
5446 
5447       // Substitute into the pack expansion pattern for each slice of the
5448       // pack.
5449       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
5450         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
5451 
5452         QualType U = getDerived().TransformType(PackExpansion->getPattern());
5453         if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5454           return true;
5455 
5456         Exceptions.push_back(U);
5457       }
5458     } else {
5459       QualType U = getDerived().TransformType(T);
5460       if (U.isNull() || SemaRef.CheckSpecifiedExceptionType(U, Loc))
5461         return true;
5462       if (T != U)
5463         Changed = true;
5464 
5465       Exceptions.push_back(U);
5466     }
5467   }
5468 
5469   ESI.Exceptions = Exceptions;
5470   if (ESI.Exceptions.empty())
5471     ESI.Type = EST_DynamicNone;
5472   return false;
5473 }
5474 
5475 template<typename Derived>
5476 QualType TreeTransform<Derived>::TransformFunctionNoProtoType(
5477                                                  TypeLocBuilder &TLB,
5478                                                  FunctionNoProtoTypeLoc TL) {
5479   const FunctionNoProtoType *T = TL.getTypePtr();
5480   QualType ResultType = getDerived().TransformType(TLB, TL.getReturnLoc());
5481   if (ResultType.isNull())
5482     return QualType();
5483 
5484   QualType Result = TL.getType();
5485   if (getDerived().AlwaysRebuild() || ResultType != T->getReturnType())
5486     Result = getDerived().RebuildFunctionNoProtoType(ResultType);
5487 
5488   FunctionNoProtoTypeLoc NewTL = TLB.push<FunctionNoProtoTypeLoc>(Result);
5489   NewTL.setLocalRangeBegin(TL.getLocalRangeBegin());
5490   NewTL.setLParenLoc(TL.getLParenLoc());
5491   NewTL.setRParenLoc(TL.getRParenLoc());
5492   NewTL.setLocalRangeEnd(TL.getLocalRangeEnd());
5493 
5494   return Result;
5495 }
5496 
5497 template<typename Derived> QualType
5498 TreeTransform<Derived>::TransformUnresolvedUsingType(TypeLocBuilder &TLB,
5499                                                  UnresolvedUsingTypeLoc TL) {
5500   const UnresolvedUsingType *T = TL.getTypePtr();
5501   Decl *D = getDerived().TransformDecl(TL.getNameLoc(), T->getDecl());
5502   if (!D)
5503     return QualType();
5504 
5505   QualType Result = TL.getType();
5506   if (getDerived().AlwaysRebuild() || D != T->getDecl()) {
5507     Result = getDerived().RebuildUnresolvedUsingType(TL.getNameLoc(), D);
5508     if (Result.isNull())
5509       return QualType();
5510   }
5511 
5512   // We might get an arbitrary type spec type back.  We should at
5513   // least always get a type spec type, though.
5514   TypeSpecTypeLoc NewTL = TLB.pushTypeSpec(Result);
5515   NewTL.setNameLoc(TL.getNameLoc());
5516 
5517   return Result;
5518 }
5519 
5520 template<typename Derived>
5521 QualType TreeTransform<Derived>::TransformTypedefType(TypeLocBuilder &TLB,
5522                                                       TypedefTypeLoc TL) {
5523   const TypedefType *T = TL.getTypePtr();
5524   TypedefNameDecl *Typedef
5525     = cast_or_null<TypedefNameDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5526                                                                T->getDecl()));
5527   if (!Typedef)
5528     return QualType();
5529 
5530   QualType Result = TL.getType();
5531   if (getDerived().AlwaysRebuild() ||
5532       Typedef != T->getDecl()) {
5533     Result = getDerived().RebuildTypedefType(Typedef);
5534     if (Result.isNull())
5535       return QualType();
5536   }
5537 
5538   TypedefTypeLoc NewTL = TLB.push<TypedefTypeLoc>(Result);
5539   NewTL.setNameLoc(TL.getNameLoc());
5540 
5541   return Result;
5542 }
5543 
5544 template<typename Derived>
5545 QualType TreeTransform<Derived>::TransformTypeOfExprType(TypeLocBuilder &TLB,
5546                                                       TypeOfExprTypeLoc TL) {
5547   // typeof expressions are not potentially evaluated contexts
5548   EnterExpressionEvaluationContext Unevaluated(
5549       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
5550       Sema::ReuseLambdaContextDecl);
5551 
5552   ExprResult E = getDerived().TransformExpr(TL.getUnderlyingExpr());
5553   if (E.isInvalid())
5554     return QualType();
5555 
5556   E = SemaRef.HandleExprEvaluationContextForTypeof(E.get());
5557   if (E.isInvalid())
5558     return QualType();
5559 
5560   QualType Result = TL.getType();
5561   if (getDerived().AlwaysRebuild() ||
5562       E.get() != TL.getUnderlyingExpr()) {
5563     Result = getDerived().RebuildTypeOfExprType(E.get(), TL.getTypeofLoc());
5564     if (Result.isNull())
5565       return QualType();
5566   }
5567   else E.get();
5568 
5569   TypeOfExprTypeLoc NewTL = TLB.push<TypeOfExprTypeLoc>(Result);
5570   NewTL.setTypeofLoc(TL.getTypeofLoc());
5571   NewTL.setLParenLoc(TL.getLParenLoc());
5572   NewTL.setRParenLoc(TL.getRParenLoc());
5573 
5574   return Result;
5575 }
5576 
5577 template<typename Derived>
5578 QualType TreeTransform<Derived>::TransformTypeOfType(TypeLocBuilder &TLB,
5579                                                      TypeOfTypeLoc TL) {
5580   TypeSourceInfo* Old_Under_TI = TL.getUnderlyingTInfo();
5581   TypeSourceInfo* New_Under_TI = getDerived().TransformType(Old_Under_TI);
5582   if (!New_Under_TI)
5583     return QualType();
5584 
5585   QualType Result = TL.getType();
5586   if (getDerived().AlwaysRebuild() || New_Under_TI != Old_Under_TI) {
5587     Result = getDerived().RebuildTypeOfType(New_Under_TI->getType());
5588     if (Result.isNull())
5589       return QualType();
5590   }
5591 
5592   TypeOfTypeLoc NewTL = TLB.push<TypeOfTypeLoc>(Result);
5593   NewTL.setTypeofLoc(TL.getTypeofLoc());
5594   NewTL.setLParenLoc(TL.getLParenLoc());
5595   NewTL.setRParenLoc(TL.getRParenLoc());
5596   NewTL.setUnderlyingTInfo(New_Under_TI);
5597 
5598   return Result;
5599 }
5600 
5601 template<typename Derived>
5602 QualType TreeTransform<Derived>::TransformDecltypeType(TypeLocBuilder &TLB,
5603                                                        DecltypeTypeLoc TL) {
5604   const DecltypeType *T = TL.getTypePtr();
5605 
5606   // decltype expressions are not potentially evaluated contexts
5607   EnterExpressionEvaluationContext Unevaluated(
5608       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated, nullptr,
5609       Sema::ExpressionEvaluationContextRecord::EK_Decltype);
5610 
5611   ExprResult E = getDerived().TransformExpr(T->getUnderlyingExpr());
5612   if (E.isInvalid())
5613     return QualType();
5614 
5615   E = getSema().ActOnDecltypeExpression(E.get());
5616   if (E.isInvalid())
5617     return QualType();
5618 
5619   QualType Result = TL.getType();
5620   if (getDerived().AlwaysRebuild() ||
5621       E.get() != T->getUnderlyingExpr()) {
5622     Result = getDerived().RebuildDecltypeType(E.get(), TL.getNameLoc());
5623     if (Result.isNull())
5624       return QualType();
5625   }
5626   else E.get();
5627 
5628   DecltypeTypeLoc NewTL = TLB.push<DecltypeTypeLoc>(Result);
5629   NewTL.setNameLoc(TL.getNameLoc());
5630 
5631   return Result;
5632 }
5633 
5634 template<typename Derived>
5635 QualType TreeTransform<Derived>::TransformUnaryTransformType(
5636                                                             TypeLocBuilder &TLB,
5637                                                      UnaryTransformTypeLoc TL) {
5638   QualType Result = TL.getType();
5639   if (Result->isDependentType()) {
5640     const UnaryTransformType *T = TL.getTypePtr();
5641     QualType NewBase =
5642       getDerived().TransformType(TL.getUnderlyingTInfo())->getType();
5643     Result = getDerived().RebuildUnaryTransformType(NewBase,
5644                                                     T->getUTTKind(),
5645                                                     TL.getKWLoc());
5646     if (Result.isNull())
5647       return QualType();
5648   }
5649 
5650   UnaryTransformTypeLoc NewTL = TLB.push<UnaryTransformTypeLoc>(Result);
5651   NewTL.setKWLoc(TL.getKWLoc());
5652   NewTL.setParensRange(TL.getParensRange());
5653   NewTL.setUnderlyingTInfo(TL.getUnderlyingTInfo());
5654   return Result;
5655 }
5656 
5657 template<typename Derived>
5658 QualType TreeTransform<Derived>::TransformAutoType(TypeLocBuilder &TLB,
5659                                                    AutoTypeLoc TL) {
5660   const AutoType *T = TL.getTypePtr();
5661   QualType OldDeduced = T->getDeducedType();
5662   QualType NewDeduced;
5663   if (!OldDeduced.isNull()) {
5664     NewDeduced = getDerived().TransformType(OldDeduced);
5665     if (NewDeduced.isNull())
5666       return QualType();
5667   }
5668 
5669   QualType Result = TL.getType();
5670   if (getDerived().AlwaysRebuild() || NewDeduced != OldDeduced ||
5671       T->isDependentType()) {
5672     Result = getDerived().RebuildAutoType(NewDeduced, T->getKeyword());
5673     if (Result.isNull())
5674       return QualType();
5675   }
5676 
5677   AutoTypeLoc NewTL = TLB.push<AutoTypeLoc>(Result);
5678   NewTL.setNameLoc(TL.getNameLoc());
5679 
5680   return Result;
5681 }
5682 
5683 template<typename Derived>
5684 QualType TreeTransform<Derived>::TransformDeducedTemplateSpecializationType(
5685     TypeLocBuilder &TLB, DeducedTemplateSpecializationTypeLoc TL) {
5686   const DeducedTemplateSpecializationType *T = TL.getTypePtr();
5687 
5688   CXXScopeSpec SS;
5689   TemplateName TemplateName = getDerived().TransformTemplateName(
5690       SS, T->getTemplateName(), TL.getTemplateNameLoc());
5691   if (TemplateName.isNull())
5692     return QualType();
5693 
5694   QualType OldDeduced = T->getDeducedType();
5695   QualType NewDeduced;
5696   if (!OldDeduced.isNull()) {
5697     NewDeduced = getDerived().TransformType(OldDeduced);
5698     if (NewDeduced.isNull())
5699       return QualType();
5700   }
5701 
5702   QualType Result = getDerived().RebuildDeducedTemplateSpecializationType(
5703       TemplateName, NewDeduced);
5704   if (Result.isNull())
5705     return QualType();
5706 
5707   DeducedTemplateSpecializationTypeLoc NewTL =
5708       TLB.push<DeducedTemplateSpecializationTypeLoc>(Result);
5709   NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5710 
5711   return Result;
5712 }
5713 
5714 template<typename Derived>
5715 QualType TreeTransform<Derived>::TransformRecordType(TypeLocBuilder &TLB,
5716                                                      RecordTypeLoc TL) {
5717   const RecordType *T = TL.getTypePtr();
5718   RecordDecl *Record
5719     = cast_or_null<RecordDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5720                                                           T->getDecl()));
5721   if (!Record)
5722     return QualType();
5723 
5724   QualType Result = TL.getType();
5725   if (getDerived().AlwaysRebuild() ||
5726       Record != T->getDecl()) {
5727     Result = getDerived().RebuildRecordType(Record);
5728     if (Result.isNull())
5729       return QualType();
5730   }
5731 
5732   RecordTypeLoc NewTL = TLB.push<RecordTypeLoc>(Result);
5733   NewTL.setNameLoc(TL.getNameLoc());
5734 
5735   return Result;
5736 }
5737 
5738 template<typename Derived>
5739 QualType TreeTransform<Derived>::TransformEnumType(TypeLocBuilder &TLB,
5740                                                    EnumTypeLoc TL) {
5741   const EnumType *T = TL.getTypePtr();
5742   EnumDecl *Enum
5743     = cast_or_null<EnumDecl>(getDerived().TransformDecl(TL.getNameLoc(),
5744                                                         T->getDecl()));
5745   if (!Enum)
5746     return QualType();
5747 
5748   QualType Result = TL.getType();
5749   if (getDerived().AlwaysRebuild() ||
5750       Enum != T->getDecl()) {
5751     Result = getDerived().RebuildEnumType(Enum);
5752     if (Result.isNull())
5753       return QualType();
5754   }
5755 
5756   EnumTypeLoc NewTL = TLB.push<EnumTypeLoc>(Result);
5757   NewTL.setNameLoc(TL.getNameLoc());
5758 
5759   return Result;
5760 }
5761 
5762 template<typename Derived>
5763 QualType TreeTransform<Derived>::TransformInjectedClassNameType(
5764                                          TypeLocBuilder &TLB,
5765                                          InjectedClassNameTypeLoc TL) {
5766   Decl *D = getDerived().TransformDecl(TL.getNameLoc(),
5767                                        TL.getTypePtr()->getDecl());
5768   if (!D) return QualType();
5769 
5770   QualType T = SemaRef.Context.getTypeDeclType(cast<TypeDecl>(D));
5771   TLB.pushTypeSpec(T).setNameLoc(TL.getNameLoc());
5772   return T;
5773 }
5774 
5775 template<typename Derived>
5776 QualType TreeTransform<Derived>::TransformTemplateTypeParmType(
5777                                                 TypeLocBuilder &TLB,
5778                                                 TemplateTypeParmTypeLoc TL) {
5779   return TransformTypeSpecType(TLB, TL);
5780 }
5781 
5782 template<typename Derived>
5783 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmType(
5784                                          TypeLocBuilder &TLB,
5785                                          SubstTemplateTypeParmTypeLoc TL) {
5786   const SubstTemplateTypeParmType *T = TL.getTypePtr();
5787 
5788   // Substitute into the replacement type, which itself might involve something
5789   // that needs to be transformed. This only tends to occur with default
5790   // template arguments of template template parameters.
5791   TemporaryBase Rebase(*this, TL.getNameLoc(), DeclarationName());
5792   QualType Replacement = getDerived().TransformType(T->getReplacementType());
5793   if (Replacement.isNull())
5794     return QualType();
5795 
5796   // Always canonicalize the replacement type.
5797   Replacement = SemaRef.Context.getCanonicalType(Replacement);
5798   QualType Result
5799     = SemaRef.Context.getSubstTemplateTypeParmType(T->getReplacedParameter(),
5800                                                    Replacement);
5801 
5802   // Propagate type-source information.
5803   SubstTemplateTypeParmTypeLoc NewTL
5804     = TLB.push<SubstTemplateTypeParmTypeLoc>(Result);
5805   NewTL.setNameLoc(TL.getNameLoc());
5806   return Result;
5807 
5808 }
5809 
5810 template<typename Derived>
5811 QualType TreeTransform<Derived>::TransformSubstTemplateTypeParmPackType(
5812                                           TypeLocBuilder &TLB,
5813                                           SubstTemplateTypeParmPackTypeLoc TL) {
5814   return TransformTypeSpecType(TLB, TL);
5815 }
5816 
5817 template<typename Derived>
5818 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5819                                                         TypeLocBuilder &TLB,
5820                                            TemplateSpecializationTypeLoc TL) {
5821   const TemplateSpecializationType *T = TL.getTypePtr();
5822 
5823   // The nested-name-specifier never matters in a TemplateSpecializationType,
5824   // because we can't have a dependent nested-name-specifier anyway.
5825   CXXScopeSpec SS;
5826   TemplateName Template
5827     = getDerived().TransformTemplateName(SS, T->getTemplateName(),
5828                                          TL.getTemplateNameLoc());
5829   if (Template.isNull())
5830     return QualType();
5831 
5832   return getDerived().TransformTemplateSpecializationType(TLB, TL, Template);
5833 }
5834 
5835 template<typename Derived>
5836 QualType TreeTransform<Derived>::TransformAtomicType(TypeLocBuilder &TLB,
5837                                                      AtomicTypeLoc TL) {
5838   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5839   if (ValueType.isNull())
5840     return QualType();
5841 
5842   QualType Result = TL.getType();
5843   if (getDerived().AlwaysRebuild() ||
5844       ValueType != TL.getValueLoc().getType()) {
5845     Result = getDerived().RebuildAtomicType(ValueType, TL.getKWLoc());
5846     if (Result.isNull())
5847       return QualType();
5848   }
5849 
5850   AtomicTypeLoc NewTL = TLB.push<AtomicTypeLoc>(Result);
5851   NewTL.setKWLoc(TL.getKWLoc());
5852   NewTL.setLParenLoc(TL.getLParenLoc());
5853   NewTL.setRParenLoc(TL.getRParenLoc());
5854 
5855   return Result;
5856 }
5857 
5858 template <typename Derived>
5859 QualType TreeTransform<Derived>::TransformPipeType(TypeLocBuilder &TLB,
5860                                                    PipeTypeLoc TL) {
5861   QualType ValueType = getDerived().TransformType(TLB, TL.getValueLoc());
5862   if (ValueType.isNull())
5863     return QualType();
5864 
5865   QualType Result = TL.getType();
5866   if (getDerived().AlwaysRebuild() || ValueType != TL.getValueLoc().getType()) {
5867     const PipeType *PT = Result->getAs<PipeType>();
5868     bool isReadPipe = PT->isReadOnly();
5869     Result = getDerived().RebuildPipeType(ValueType, TL.getKWLoc(), isReadPipe);
5870     if (Result.isNull())
5871       return QualType();
5872   }
5873 
5874   PipeTypeLoc NewTL = TLB.push<PipeTypeLoc>(Result);
5875   NewTL.setKWLoc(TL.getKWLoc());
5876 
5877   return Result;
5878 }
5879 
5880   /// Simple iterator that traverses the template arguments in a
5881   /// container that provides a \c getArgLoc() member function.
5882   ///
5883   /// This iterator is intended to be used with the iterator form of
5884   /// \c TreeTransform<Derived>::TransformTemplateArguments().
5885   template<typename ArgLocContainer>
5886   class TemplateArgumentLocContainerIterator {
5887     ArgLocContainer *Container;
5888     unsigned Index;
5889 
5890   public:
5891     typedef TemplateArgumentLoc value_type;
5892     typedef TemplateArgumentLoc reference;
5893     typedef int difference_type;
5894     typedef std::input_iterator_tag iterator_category;
5895 
5896     class pointer {
5897       TemplateArgumentLoc Arg;
5898 
5899     public:
5900       explicit pointer(TemplateArgumentLoc Arg) : Arg(Arg) { }
5901 
5902       const TemplateArgumentLoc *operator->() const {
5903         return &Arg;
5904       }
5905     };
5906 
5907 
5908     TemplateArgumentLocContainerIterator() {}
5909 
5910     TemplateArgumentLocContainerIterator(ArgLocContainer &Container,
5911                                  unsigned Index)
5912       : Container(&Container), Index(Index) { }
5913 
5914     TemplateArgumentLocContainerIterator &operator++() {
5915       ++Index;
5916       return *this;
5917     }
5918 
5919     TemplateArgumentLocContainerIterator operator++(int) {
5920       TemplateArgumentLocContainerIterator Old(*this);
5921       ++(*this);
5922       return Old;
5923     }
5924 
5925     TemplateArgumentLoc operator*() const {
5926       return Container->getArgLoc(Index);
5927     }
5928 
5929     pointer operator->() const {
5930       return pointer(Container->getArgLoc(Index));
5931     }
5932 
5933     friend bool operator==(const TemplateArgumentLocContainerIterator &X,
5934                            const TemplateArgumentLocContainerIterator &Y) {
5935       return X.Container == Y.Container && X.Index == Y.Index;
5936     }
5937 
5938     friend bool operator!=(const TemplateArgumentLocContainerIterator &X,
5939                            const TemplateArgumentLocContainerIterator &Y) {
5940       return !(X == Y);
5941     }
5942   };
5943 
5944 
5945 template <typename Derived>
5946 QualType TreeTransform<Derived>::TransformTemplateSpecializationType(
5947                                                         TypeLocBuilder &TLB,
5948                                            TemplateSpecializationTypeLoc TL,
5949                                                       TemplateName Template) {
5950   TemplateArgumentListInfo NewTemplateArgs;
5951   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
5952   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
5953   typedef TemplateArgumentLocContainerIterator<TemplateSpecializationTypeLoc>
5954     ArgIterator;
5955   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
5956                                               ArgIterator(TL, TL.getNumArgs()),
5957                                               NewTemplateArgs))
5958     return QualType();
5959 
5960   // FIXME: maybe don't rebuild if all the template arguments are the same.
5961 
5962   QualType Result =
5963     getDerived().RebuildTemplateSpecializationType(Template,
5964                                                    TL.getTemplateNameLoc(),
5965                                                    NewTemplateArgs);
5966 
5967   if (!Result.isNull()) {
5968     // Specializations of template template parameters are represented as
5969     // TemplateSpecializationTypes, and substitution of type alias templates
5970     // within a dependent context can transform them into
5971     // DependentTemplateSpecializationTypes.
5972     if (isa<DependentTemplateSpecializationType>(Result)) {
5973       DependentTemplateSpecializationTypeLoc NewTL
5974         = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
5975       NewTL.setElaboratedKeywordLoc(SourceLocation());
5976       NewTL.setQualifierLoc(NestedNameSpecifierLoc());
5977       NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5978       NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5979       NewTL.setLAngleLoc(TL.getLAngleLoc());
5980       NewTL.setRAngleLoc(TL.getRAngleLoc());
5981       for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5982         NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5983       return Result;
5984     }
5985 
5986     TemplateSpecializationTypeLoc NewTL
5987       = TLB.push<TemplateSpecializationTypeLoc>(Result);
5988     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
5989     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
5990     NewTL.setLAngleLoc(TL.getLAngleLoc());
5991     NewTL.setRAngleLoc(TL.getRAngleLoc());
5992     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
5993       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
5994   }
5995 
5996   return Result;
5997 }
5998 
5999 template <typename Derived>
6000 QualType TreeTransform<Derived>::TransformDependentTemplateSpecializationType(
6001                                      TypeLocBuilder &TLB,
6002                                      DependentTemplateSpecializationTypeLoc TL,
6003                                      TemplateName Template,
6004                                      CXXScopeSpec &SS) {
6005   TemplateArgumentListInfo NewTemplateArgs;
6006   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6007   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6008   typedef TemplateArgumentLocContainerIterator<
6009             DependentTemplateSpecializationTypeLoc> ArgIterator;
6010   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6011                                               ArgIterator(TL, TL.getNumArgs()),
6012                                               NewTemplateArgs))
6013     return QualType();
6014 
6015   // FIXME: maybe don't rebuild if all the template arguments are the same.
6016 
6017   if (DependentTemplateName *DTN = Template.getAsDependentTemplateName()) {
6018     QualType Result
6019       = getSema().Context.getDependentTemplateSpecializationType(
6020                                                 TL.getTypePtr()->getKeyword(),
6021                                                          DTN->getQualifier(),
6022                                                          DTN->getIdentifier(),
6023                                                                NewTemplateArgs);
6024 
6025     DependentTemplateSpecializationTypeLoc NewTL
6026       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6027     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6028     NewTL.setQualifierLoc(SS.getWithLocInContext(SemaRef.Context));
6029     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6030     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6031     NewTL.setLAngleLoc(TL.getLAngleLoc());
6032     NewTL.setRAngleLoc(TL.getRAngleLoc());
6033     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6034       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6035     return Result;
6036   }
6037 
6038   QualType Result
6039     = getDerived().RebuildTemplateSpecializationType(Template,
6040                                                      TL.getTemplateNameLoc(),
6041                                                      NewTemplateArgs);
6042 
6043   if (!Result.isNull()) {
6044     /// FIXME: Wrap this in an elaborated-type-specifier?
6045     TemplateSpecializationTypeLoc NewTL
6046       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6047     NewTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6048     NewTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6049     NewTL.setLAngleLoc(TL.getLAngleLoc());
6050     NewTL.setRAngleLoc(TL.getRAngleLoc());
6051     for (unsigned i = 0, e = NewTemplateArgs.size(); i != e; ++i)
6052       NewTL.setArgLocInfo(i, NewTemplateArgs[i].getLocInfo());
6053   }
6054 
6055   return Result;
6056 }
6057 
6058 template<typename Derived>
6059 QualType
6060 TreeTransform<Derived>::TransformElaboratedType(TypeLocBuilder &TLB,
6061                                                 ElaboratedTypeLoc TL) {
6062   const ElaboratedType *T = TL.getTypePtr();
6063 
6064   NestedNameSpecifierLoc QualifierLoc;
6065   // NOTE: the qualifier in an ElaboratedType is optional.
6066   if (TL.getQualifierLoc()) {
6067     QualifierLoc
6068       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6069     if (!QualifierLoc)
6070       return QualType();
6071   }
6072 
6073   QualType NamedT = getDerived().TransformType(TLB, TL.getNamedTypeLoc());
6074   if (NamedT.isNull())
6075     return QualType();
6076 
6077   // C++0x [dcl.type.elab]p2:
6078   //   If the identifier resolves to a typedef-name or the simple-template-id
6079   //   resolves to an alias template specialization, the
6080   //   elaborated-type-specifier is ill-formed.
6081   if (T->getKeyword() != ETK_None && T->getKeyword() != ETK_Typename) {
6082     if (const TemplateSpecializationType *TST =
6083           NamedT->getAs<TemplateSpecializationType>()) {
6084       TemplateName Template = TST->getTemplateName();
6085       if (TypeAliasTemplateDecl *TAT = dyn_cast_or_null<TypeAliasTemplateDecl>(
6086               Template.getAsTemplateDecl())) {
6087         SemaRef.Diag(TL.getNamedTypeLoc().getBeginLoc(),
6088                      diag::err_tag_reference_non_tag)
6089             << TAT << Sema::NTK_TypeAliasTemplate
6090             << ElaboratedType::getTagTypeKindForKeyword(T->getKeyword());
6091         SemaRef.Diag(TAT->getLocation(), diag::note_declared_at);
6092       }
6093     }
6094   }
6095 
6096   QualType Result = TL.getType();
6097   if (getDerived().AlwaysRebuild() ||
6098       QualifierLoc != TL.getQualifierLoc() ||
6099       NamedT != T->getNamedType()) {
6100     Result = getDerived().RebuildElaboratedType(TL.getElaboratedKeywordLoc(),
6101                                                 T->getKeyword(),
6102                                                 QualifierLoc, NamedT);
6103     if (Result.isNull())
6104       return QualType();
6105   }
6106 
6107   ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6108   NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6109   NewTL.setQualifierLoc(QualifierLoc);
6110   return Result;
6111 }
6112 
6113 template<typename Derived>
6114 QualType TreeTransform<Derived>::TransformAttributedType(
6115                                                 TypeLocBuilder &TLB,
6116                                                 AttributedTypeLoc TL) {
6117   const AttributedType *oldType = TL.getTypePtr();
6118   QualType modifiedType = getDerived().TransformType(TLB, TL.getModifiedLoc());
6119   if (modifiedType.isNull())
6120     return QualType();
6121 
6122   // oldAttr can be null if we started with a QualType rather than a TypeLoc.
6123   const Attr *oldAttr = TL.getAttr();
6124   const Attr *newAttr = oldAttr ? getDerived().TransformAttr(oldAttr) : nullptr;
6125   if (oldAttr && !newAttr)
6126     return QualType();
6127 
6128   QualType result = TL.getType();
6129 
6130   // FIXME: dependent operand expressions?
6131   if (getDerived().AlwaysRebuild() ||
6132       modifiedType != oldType->getModifiedType()) {
6133     // TODO: this is really lame; we should really be rebuilding the
6134     // equivalent type from first principles.
6135     QualType equivalentType
6136       = getDerived().TransformType(oldType->getEquivalentType());
6137     if (equivalentType.isNull())
6138       return QualType();
6139 
6140     // Check whether we can add nullability; it is only represented as
6141     // type sugar, and therefore cannot be diagnosed in any other way.
6142     if (auto nullability = oldType->getImmediateNullability()) {
6143       if (!modifiedType->canHaveNullability()) {
6144         SemaRef.Diag(TL.getAttr()->getLocation(),
6145                      diag::err_nullability_nonpointer)
6146             << DiagNullabilityKind(*nullability, false) << modifiedType;
6147         return QualType();
6148       }
6149     }
6150 
6151     result = SemaRef.Context.getAttributedType(TL.getAttrKind(),
6152                                                modifiedType,
6153                                                equivalentType);
6154   }
6155 
6156   AttributedTypeLoc newTL = TLB.push<AttributedTypeLoc>(result);
6157   newTL.setAttr(newAttr);
6158   return result;
6159 }
6160 
6161 template<typename Derived>
6162 QualType
6163 TreeTransform<Derived>::TransformParenType(TypeLocBuilder &TLB,
6164                                            ParenTypeLoc TL) {
6165   QualType Inner = getDerived().TransformType(TLB, TL.getInnerLoc());
6166   if (Inner.isNull())
6167     return QualType();
6168 
6169   QualType Result = TL.getType();
6170   if (getDerived().AlwaysRebuild() ||
6171       Inner != TL.getInnerLoc().getType()) {
6172     Result = getDerived().RebuildParenType(Inner);
6173     if (Result.isNull())
6174       return QualType();
6175   }
6176 
6177   ParenTypeLoc NewTL = TLB.push<ParenTypeLoc>(Result);
6178   NewTL.setLParenLoc(TL.getLParenLoc());
6179   NewTL.setRParenLoc(TL.getRParenLoc());
6180   return Result;
6181 }
6182 
6183 template<typename Derived>
6184 QualType TreeTransform<Derived>::TransformDependentNameType(
6185     TypeLocBuilder &TLB, DependentNameTypeLoc TL) {
6186   return TransformDependentNameType(TLB, TL, false);
6187 }
6188 
6189 template<typename Derived>
6190 QualType TreeTransform<Derived>::TransformDependentNameType(
6191     TypeLocBuilder &TLB, DependentNameTypeLoc TL, bool DeducedTSTContext) {
6192   const DependentNameType *T = TL.getTypePtr();
6193 
6194   NestedNameSpecifierLoc QualifierLoc
6195     = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6196   if (!QualifierLoc)
6197     return QualType();
6198 
6199   QualType Result
6200     = getDerived().RebuildDependentNameType(T->getKeyword(),
6201                                             TL.getElaboratedKeywordLoc(),
6202                                             QualifierLoc,
6203                                             T->getIdentifier(),
6204                                             TL.getNameLoc(),
6205                                             DeducedTSTContext);
6206   if (Result.isNull())
6207     return QualType();
6208 
6209   if (const ElaboratedType* ElabT = Result->getAs<ElaboratedType>()) {
6210     QualType NamedT = ElabT->getNamedType();
6211     TLB.pushTypeSpec(NamedT).setNameLoc(TL.getNameLoc());
6212 
6213     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6214     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6215     NewTL.setQualifierLoc(QualifierLoc);
6216   } else {
6217     DependentNameTypeLoc NewTL = TLB.push<DependentNameTypeLoc>(Result);
6218     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6219     NewTL.setQualifierLoc(QualifierLoc);
6220     NewTL.setNameLoc(TL.getNameLoc());
6221   }
6222   return Result;
6223 }
6224 
6225 template<typename Derived>
6226 QualType TreeTransform<Derived>::
6227           TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6228                                  DependentTemplateSpecializationTypeLoc TL) {
6229   NestedNameSpecifierLoc QualifierLoc;
6230   if (TL.getQualifierLoc()) {
6231     QualifierLoc
6232       = getDerived().TransformNestedNameSpecifierLoc(TL.getQualifierLoc());
6233     if (!QualifierLoc)
6234       return QualType();
6235   }
6236 
6237   return getDerived()
6238            .TransformDependentTemplateSpecializationType(TLB, TL, QualifierLoc);
6239 }
6240 
6241 template<typename Derived>
6242 QualType TreeTransform<Derived>::
6243 TransformDependentTemplateSpecializationType(TypeLocBuilder &TLB,
6244                                    DependentTemplateSpecializationTypeLoc TL,
6245                                        NestedNameSpecifierLoc QualifierLoc) {
6246   const DependentTemplateSpecializationType *T = TL.getTypePtr();
6247 
6248   TemplateArgumentListInfo NewTemplateArgs;
6249   NewTemplateArgs.setLAngleLoc(TL.getLAngleLoc());
6250   NewTemplateArgs.setRAngleLoc(TL.getRAngleLoc());
6251 
6252   typedef TemplateArgumentLocContainerIterator<
6253   DependentTemplateSpecializationTypeLoc> ArgIterator;
6254   if (getDerived().TransformTemplateArguments(ArgIterator(TL, 0),
6255                                               ArgIterator(TL, TL.getNumArgs()),
6256                                               NewTemplateArgs))
6257     return QualType();
6258 
6259   QualType Result = getDerived().RebuildDependentTemplateSpecializationType(
6260       T->getKeyword(), QualifierLoc, TL.getTemplateKeywordLoc(),
6261       T->getIdentifier(), TL.getTemplateNameLoc(), NewTemplateArgs,
6262       /*AllowInjectedClassName*/ false);
6263   if (Result.isNull())
6264     return QualType();
6265 
6266   if (const ElaboratedType *ElabT = dyn_cast<ElaboratedType>(Result)) {
6267     QualType NamedT = ElabT->getNamedType();
6268 
6269     // Copy information relevant to the template specialization.
6270     TemplateSpecializationTypeLoc NamedTL
6271       = TLB.push<TemplateSpecializationTypeLoc>(NamedT);
6272     NamedTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6273     NamedTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6274     NamedTL.setLAngleLoc(TL.getLAngleLoc());
6275     NamedTL.setRAngleLoc(TL.getRAngleLoc());
6276     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6277       NamedTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6278 
6279     // Copy information relevant to the elaborated type.
6280     ElaboratedTypeLoc NewTL = TLB.push<ElaboratedTypeLoc>(Result);
6281     NewTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6282     NewTL.setQualifierLoc(QualifierLoc);
6283   } else if (isa<DependentTemplateSpecializationType>(Result)) {
6284     DependentTemplateSpecializationTypeLoc SpecTL
6285       = TLB.push<DependentTemplateSpecializationTypeLoc>(Result);
6286     SpecTL.setElaboratedKeywordLoc(TL.getElaboratedKeywordLoc());
6287     SpecTL.setQualifierLoc(QualifierLoc);
6288     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6289     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6290     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6291     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6292     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6293       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6294   } else {
6295     TemplateSpecializationTypeLoc SpecTL
6296       = TLB.push<TemplateSpecializationTypeLoc>(Result);
6297     SpecTL.setTemplateKeywordLoc(TL.getTemplateKeywordLoc());
6298     SpecTL.setTemplateNameLoc(TL.getTemplateNameLoc());
6299     SpecTL.setLAngleLoc(TL.getLAngleLoc());
6300     SpecTL.setRAngleLoc(TL.getRAngleLoc());
6301     for (unsigned I = 0, E = NewTemplateArgs.size(); I != E; ++I)
6302       SpecTL.setArgLocInfo(I, NewTemplateArgs[I].getLocInfo());
6303   }
6304   return Result;
6305 }
6306 
6307 template<typename Derived>
6308 QualType TreeTransform<Derived>::TransformPackExpansionType(TypeLocBuilder &TLB,
6309                                                       PackExpansionTypeLoc TL) {
6310   QualType Pattern
6311     = getDerived().TransformType(TLB, TL.getPatternLoc());
6312   if (Pattern.isNull())
6313     return QualType();
6314 
6315   QualType Result = TL.getType();
6316   if (getDerived().AlwaysRebuild() ||
6317       Pattern != TL.getPatternLoc().getType()) {
6318     Result = getDerived().RebuildPackExpansionType(Pattern,
6319                                            TL.getPatternLoc().getSourceRange(),
6320                                                    TL.getEllipsisLoc(),
6321                                            TL.getTypePtr()->getNumExpansions());
6322     if (Result.isNull())
6323       return QualType();
6324   }
6325 
6326   PackExpansionTypeLoc NewT = TLB.push<PackExpansionTypeLoc>(Result);
6327   NewT.setEllipsisLoc(TL.getEllipsisLoc());
6328   return Result;
6329 }
6330 
6331 template<typename Derived>
6332 QualType
6333 TreeTransform<Derived>::TransformObjCInterfaceType(TypeLocBuilder &TLB,
6334                                                    ObjCInterfaceTypeLoc TL) {
6335   // ObjCInterfaceType is never dependent.
6336   TLB.pushFullCopy(TL);
6337   return TL.getType();
6338 }
6339 
6340 template<typename Derived>
6341 QualType
6342 TreeTransform<Derived>::TransformObjCTypeParamType(TypeLocBuilder &TLB,
6343                                                    ObjCTypeParamTypeLoc TL) {
6344   const ObjCTypeParamType *T = TL.getTypePtr();
6345   ObjCTypeParamDecl *OTP = cast_or_null<ObjCTypeParamDecl>(
6346       getDerived().TransformDecl(T->getDecl()->getLocation(), T->getDecl()));
6347   if (!OTP)
6348     return QualType();
6349 
6350   QualType Result = TL.getType();
6351   if (getDerived().AlwaysRebuild() ||
6352       OTP != T->getDecl()) {
6353     Result = getDerived().RebuildObjCTypeParamType(OTP,
6354                  TL.getProtocolLAngleLoc(),
6355                  llvm::makeArrayRef(TL.getTypePtr()->qual_begin(),
6356                                     TL.getNumProtocols()),
6357                  TL.getProtocolLocs(),
6358                  TL.getProtocolRAngleLoc());
6359     if (Result.isNull())
6360       return QualType();
6361   }
6362 
6363   ObjCTypeParamTypeLoc NewTL = TLB.push<ObjCTypeParamTypeLoc>(Result);
6364   if (TL.getNumProtocols()) {
6365     NewTL.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6366     for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6367       NewTL.setProtocolLoc(i, TL.getProtocolLoc(i));
6368     NewTL.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6369   }
6370   return Result;
6371 }
6372 
6373 template<typename Derived>
6374 QualType
6375 TreeTransform<Derived>::TransformObjCObjectType(TypeLocBuilder &TLB,
6376                                                 ObjCObjectTypeLoc TL) {
6377   // Transform base type.
6378   QualType BaseType = getDerived().TransformType(TLB, TL.getBaseLoc());
6379   if (BaseType.isNull())
6380     return QualType();
6381 
6382   bool AnyChanged = BaseType != TL.getBaseLoc().getType();
6383 
6384   // Transform type arguments.
6385   SmallVector<TypeSourceInfo *, 4> NewTypeArgInfos;
6386   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i) {
6387     TypeSourceInfo *TypeArgInfo = TL.getTypeArgTInfo(i);
6388     TypeLoc TypeArgLoc = TypeArgInfo->getTypeLoc();
6389     QualType TypeArg = TypeArgInfo->getType();
6390     if (auto PackExpansionLoc = TypeArgLoc.getAs<PackExpansionTypeLoc>()) {
6391       AnyChanged = true;
6392 
6393       // We have a pack expansion. Instantiate it.
6394       const auto *PackExpansion = PackExpansionLoc.getType()
6395                                     ->castAs<PackExpansionType>();
6396       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
6397       SemaRef.collectUnexpandedParameterPacks(PackExpansion->getPattern(),
6398                                               Unexpanded);
6399       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
6400 
6401       // Determine whether the set of unexpanded parameter packs can
6402       // and should be expanded.
6403       TypeLoc PatternLoc = PackExpansionLoc.getPatternLoc();
6404       bool Expand = false;
6405       bool RetainExpansion = false;
6406       Optional<unsigned> NumExpansions = PackExpansion->getNumExpansions();
6407       if (getDerived().TryExpandParameterPacks(
6408             PackExpansionLoc.getEllipsisLoc(), PatternLoc.getSourceRange(),
6409             Unexpanded, Expand, RetainExpansion, NumExpansions))
6410         return QualType();
6411 
6412       if (!Expand) {
6413         // We can't expand this pack expansion into separate arguments yet;
6414         // just substitute into the pattern and create a new pack expansion
6415         // type.
6416         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
6417 
6418         TypeLocBuilder TypeArgBuilder;
6419         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6420         QualType NewPatternType = getDerived().TransformType(TypeArgBuilder,
6421                                                              PatternLoc);
6422         if (NewPatternType.isNull())
6423           return QualType();
6424 
6425         QualType NewExpansionType = SemaRef.Context.getPackExpansionType(
6426                                       NewPatternType, NumExpansions);
6427         auto NewExpansionLoc = TLB.push<PackExpansionTypeLoc>(NewExpansionType);
6428         NewExpansionLoc.setEllipsisLoc(PackExpansionLoc.getEllipsisLoc());
6429         NewTypeArgInfos.push_back(
6430           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewExpansionType));
6431         continue;
6432       }
6433 
6434       // Substitute into the pack expansion pattern for each slice of the
6435       // pack.
6436       for (unsigned ArgIdx = 0; ArgIdx != *NumExpansions; ++ArgIdx) {
6437         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), ArgIdx);
6438 
6439         TypeLocBuilder TypeArgBuilder;
6440         TypeArgBuilder.reserve(PatternLoc.getFullDataSize());
6441 
6442         QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder,
6443                                                          PatternLoc);
6444         if (NewTypeArg.isNull())
6445           return QualType();
6446 
6447         NewTypeArgInfos.push_back(
6448           TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6449       }
6450 
6451       continue;
6452     }
6453 
6454     TypeLocBuilder TypeArgBuilder;
6455     TypeArgBuilder.reserve(TypeArgLoc.getFullDataSize());
6456     QualType NewTypeArg = getDerived().TransformType(TypeArgBuilder, TypeArgLoc);
6457     if (NewTypeArg.isNull())
6458       return QualType();
6459 
6460     // If nothing changed, just keep the old TypeSourceInfo.
6461     if (NewTypeArg == TypeArg) {
6462       NewTypeArgInfos.push_back(TypeArgInfo);
6463       continue;
6464     }
6465 
6466     NewTypeArgInfos.push_back(
6467       TypeArgBuilder.getTypeSourceInfo(SemaRef.Context, NewTypeArg));
6468     AnyChanged = true;
6469   }
6470 
6471   QualType Result = TL.getType();
6472   if (getDerived().AlwaysRebuild() || AnyChanged) {
6473     // Rebuild the type.
6474     Result = getDerived().RebuildObjCObjectType(
6475         BaseType, TL.getBeginLoc(), TL.getTypeArgsLAngleLoc(), NewTypeArgInfos,
6476         TL.getTypeArgsRAngleLoc(), TL.getProtocolLAngleLoc(),
6477         llvm::makeArrayRef(TL.getTypePtr()->qual_begin(), TL.getNumProtocols()),
6478         TL.getProtocolLocs(), TL.getProtocolRAngleLoc());
6479 
6480     if (Result.isNull())
6481       return QualType();
6482   }
6483 
6484   ObjCObjectTypeLoc NewT = TLB.push<ObjCObjectTypeLoc>(Result);
6485   NewT.setHasBaseTypeAsWritten(true);
6486   NewT.setTypeArgsLAngleLoc(TL.getTypeArgsLAngleLoc());
6487   for (unsigned i = 0, n = TL.getNumTypeArgs(); i != n; ++i)
6488     NewT.setTypeArgTInfo(i, NewTypeArgInfos[i]);
6489   NewT.setTypeArgsRAngleLoc(TL.getTypeArgsRAngleLoc());
6490   NewT.setProtocolLAngleLoc(TL.getProtocolLAngleLoc());
6491   for (unsigned i = 0, n = TL.getNumProtocols(); i != n; ++i)
6492     NewT.setProtocolLoc(i, TL.getProtocolLoc(i));
6493   NewT.setProtocolRAngleLoc(TL.getProtocolRAngleLoc());
6494   return Result;
6495 }
6496 
6497 template<typename Derived>
6498 QualType
6499 TreeTransform<Derived>::TransformObjCObjectPointerType(TypeLocBuilder &TLB,
6500                                                ObjCObjectPointerTypeLoc TL) {
6501   QualType PointeeType = getDerived().TransformType(TLB, TL.getPointeeLoc());
6502   if (PointeeType.isNull())
6503     return QualType();
6504 
6505   QualType Result = TL.getType();
6506   if (getDerived().AlwaysRebuild() ||
6507       PointeeType != TL.getPointeeLoc().getType()) {
6508     Result = getDerived().RebuildObjCObjectPointerType(PointeeType,
6509                                                        TL.getStarLoc());
6510     if (Result.isNull())
6511       return QualType();
6512   }
6513 
6514   ObjCObjectPointerTypeLoc NewT = TLB.push<ObjCObjectPointerTypeLoc>(Result);
6515   NewT.setStarLoc(TL.getStarLoc());
6516   return Result;
6517 }
6518 
6519 //===----------------------------------------------------------------------===//
6520 // Statement transformation
6521 //===----------------------------------------------------------------------===//
6522 template<typename Derived>
6523 StmtResult
6524 TreeTransform<Derived>::TransformNullStmt(NullStmt *S) {
6525   return S;
6526 }
6527 
6528 template<typename Derived>
6529 StmtResult
6530 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S) {
6531   return getDerived().TransformCompoundStmt(S, false);
6532 }
6533 
6534 template<typename Derived>
6535 StmtResult
6536 TreeTransform<Derived>::TransformCompoundStmt(CompoundStmt *S,
6537                                               bool IsStmtExpr) {
6538   Sema::CompoundScopeRAII CompoundScope(getSema());
6539 
6540   bool SubStmtInvalid = false;
6541   bool SubStmtChanged = false;
6542   SmallVector<Stmt*, 8> Statements;
6543   for (auto *B : S->body()) {
6544     StmtResult Result = getDerived().TransformStmt(
6545         B,
6546         IsStmtExpr && B == S->body_back() ? SDK_StmtExprResult : SDK_Discarded);
6547 
6548     if (Result.isInvalid()) {
6549       // Immediately fail if this was a DeclStmt, since it's very
6550       // likely that this will cause problems for future statements.
6551       if (isa<DeclStmt>(B))
6552         return StmtError();
6553 
6554       // Otherwise, just keep processing substatements and fail later.
6555       SubStmtInvalid = true;
6556       continue;
6557     }
6558 
6559     SubStmtChanged = SubStmtChanged || Result.get() != B;
6560     Statements.push_back(Result.getAs<Stmt>());
6561   }
6562 
6563   if (SubStmtInvalid)
6564     return StmtError();
6565 
6566   if (!getDerived().AlwaysRebuild() &&
6567       !SubStmtChanged)
6568     return S;
6569 
6570   return getDerived().RebuildCompoundStmt(S->getLBracLoc(),
6571                                           Statements,
6572                                           S->getRBracLoc(),
6573                                           IsStmtExpr);
6574 }
6575 
6576 template<typename Derived>
6577 StmtResult
6578 TreeTransform<Derived>::TransformCaseStmt(CaseStmt *S) {
6579   ExprResult LHS, RHS;
6580   {
6581     EnterExpressionEvaluationContext Unevaluated(
6582         SemaRef, Sema::ExpressionEvaluationContext::ConstantEvaluated);
6583 
6584     // Transform the left-hand case value.
6585     LHS = getDerived().TransformExpr(S->getLHS());
6586     LHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), LHS);
6587     if (LHS.isInvalid())
6588       return StmtError();
6589 
6590     // Transform the right-hand case value (for the GNU case-range extension).
6591     RHS = getDerived().TransformExpr(S->getRHS());
6592     RHS = SemaRef.ActOnCaseExpr(S->getCaseLoc(), RHS);
6593     if (RHS.isInvalid())
6594       return StmtError();
6595   }
6596 
6597   // Build the case statement.
6598   // Case statements are always rebuilt so that they will attached to their
6599   // transformed switch statement.
6600   StmtResult Case = getDerived().RebuildCaseStmt(S->getCaseLoc(),
6601                                                        LHS.get(),
6602                                                        S->getEllipsisLoc(),
6603                                                        RHS.get(),
6604                                                        S->getColonLoc());
6605   if (Case.isInvalid())
6606     return StmtError();
6607 
6608   // Transform the statement following the case
6609   StmtResult SubStmt =
6610       getDerived().TransformStmt(S->getSubStmt());
6611   if (SubStmt.isInvalid())
6612     return StmtError();
6613 
6614   // Attach the body to the case statement
6615   return getDerived().RebuildCaseStmtBody(Case.get(), SubStmt.get());
6616 }
6617 
6618 template <typename Derived>
6619 StmtResult TreeTransform<Derived>::TransformDefaultStmt(DefaultStmt *S) {
6620   // Transform the statement following the default case
6621   StmtResult SubStmt =
6622       getDerived().TransformStmt(S->getSubStmt());
6623   if (SubStmt.isInvalid())
6624     return StmtError();
6625 
6626   // Default statements are always rebuilt
6627   return getDerived().RebuildDefaultStmt(S->getDefaultLoc(), S->getColonLoc(),
6628                                          SubStmt.get());
6629 }
6630 
6631 template<typename Derived>
6632 StmtResult
6633 TreeTransform<Derived>::TransformLabelStmt(LabelStmt *S, StmtDiscardKind SDK) {
6634   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6635   if (SubStmt.isInvalid())
6636     return StmtError();
6637 
6638   Decl *LD = getDerived().TransformDecl(S->getDecl()->getLocation(),
6639                                         S->getDecl());
6640   if (!LD)
6641     return StmtError();
6642 
6643   // If we're transforming "in-place" (we're not creating new local
6644   // declarations), assume we're replacing the old label statement
6645   // and clear out the reference to it.
6646   if (LD == S->getDecl())
6647     S->getDecl()->setStmt(nullptr);
6648 
6649   // FIXME: Pass the real colon location in.
6650   return getDerived().RebuildLabelStmt(S->getIdentLoc(),
6651                                        cast<LabelDecl>(LD), SourceLocation(),
6652                                        SubStmt.get());
6653 }
6654 
6655 template <typename Derived>
6656 const Attr *TreeTransform<Derived>::TransformAttr(const Attr *R) {
6657   if (!R)
6658     return R;
6659 
6660   switch (R->getKind()) {
6661 // Transform attributes with a pragma spelling by calling TransformXXXAttr.
6662 #define ATTR(X)
6663 #define PRAGMA_SPELLING_ATTR(X)                                                \
6664   case attr::X:                                                                \
6665     return getDerived().Transform##X##Attr(cast<X##Attr>(R));
6666 #include "clang/Basic/AttrList.inc"
6667   default:
6668     return R;
6669   }
6670 }
6671 
6672 template <typename Derived>
6673 StmtResult
6674 TreeTransform<Derived>::TransformAttributedStmt(AttributedStmt *S,
6675                                                 StmtDiscardKind SDK) {
6676   bool AttrsChanged = false;
6677   SmallVector<const Attr *, 1> Attrs;
6678 
6679   // Visit attributes and keep track if any are transformed.
6680   for (const auto *I : S->getAttrs()) {
6681     const Attr *R = getDerived().TransformAttr(I);
6682     AttrsChanged |= (I != R);
6683     Attrs.push_back(R);
6684   }
6685 
6686   StmtResult SubStmt = getDerived().TransformStmt(S->getSubStmt(), SDK);
6687   if (SubStmt.isInvalid())
6688     return StmtError();
6689 
6690   if (SubStmt.get() == S->getSubStmt() && !AttrsChanged)
6691     return S;
6692 
6693   return getDerived().RebuildAttributedStmt(S->getAttrLoc(), Attrs,
6694                                             SubStmt.get());
6695 }
6696 
6697 template<typename Derived>
6698 StmtResult
6699 TreeTransform<Derived>::TransformIfStmt(IfStmt *S) {
6700   // Transform the initialization statement
6701   StmtResult Init = getDerived().TransformStmt(S->getInit());
6702   if (Init.isInvalid())
6703     return StmtError();
6704 
6705   // Transform the condition
6706   Sema::ConditionResult Cond = getDerived().TransformCondition(
6707       S->getIfLoc(), S->getConditionVariable(), S->getCond(),
6708       S->isConstexpr() ? Sema::ConditionKind::ConstexprIf
6709                        : Sema::ConditionKind::Boolean);
6710   if (Cond.isInvalid())
6711     return StmtError();
6712 
6713   // If this is a constexpr if, determine which arm we should instantiate.
6714   llvm::Optional<bool> ConstexprConditionValue;
6715   if (S->isConstexpr())
6716     ConstexprConditionValue = Cond.getKnownValue();
6717 
6718   // Transform the "then" branch.
6719   StmtResult Then;
6720   if (!ConstexprConditionValue || *ConstexprConditionValue) {
6721     Then = getDerived().TransformStmt(S->getThen());
6722     if (Then.isInvalid())
6723       return StmtError();
6724   } else {
6725     Then = new (getSema().Context) NullStmt(S->getThen()->getBeginLoc());
6726   }
6727 
6728   // Transform the "else" branch.
6729   StmtResult Else;
6730   if (!ConstexprConditionValue || !*ConstexprConditionValue) {
6731     Else = getDerived().TransformStmt(S->getElse());
6732     if (Else.isInvalid())
6733       return StmtError();
6734   }
6735 
6736   if (!getDerived().AlwaysRebuild() &&
6737       Init.get() == S->getInit() &&
6738       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6739       Then.get() == S->getThen() &&
6740       Else.get() == S->getElse())
6741     return S;
6742 
6743   return getDerived().RebuildIfStmt(S->getIfLoc(), S->isConstexpr(), Cond,
6744                                     Init.get(), Then.get(), S->getElseLoc(),
6745                                     Else.get());
6746 }
6747 
6748 template<typename Derived>
6749 StmtResult
6750 TreeTransform<Derived>::TransformSwitchStmt(SwitchStmt *S) {
6751   // Transform the initialization statement
6752   StmtResult Init = getDerived().TransformStmt(S->getInit());
6753   if (Init.isInvalid())
6754     return StmtError();
6755 
6756   // Transform the condition.
6757   Sema::ConditionResult Cond = getDerived().TransformCondition(
6758       S->getSwitchLoc(), S->getConditionVariable(), S->getCond(),
6759       Sema::ConditionKind::Switch);
6760   if (Cond.isInvalid())
6761     return StmtError();
6762 
6763   // Rebuild the switch statement.
6764   StmtResult Switch
6765     = getDerived().RebuildSwitchStmtStart(S->getSwitchLoc(), Init.get(), Cond);
6766   if (Switch.isInvalid())
6767     return StmtError();
6768 
6769   // Transform the body of the switch statement.
6770   StmtResult Body = getDerived().TransformStmt(S->getBody());
6771   if (Body.isInvalid())
6772     return StmtError();
6773 
6774   // Complete the switch statement.
6775   return getDerived().RebuildSwitchStmtBody(S->getSwitchLoc(), Switch.get(),
6776                                             Body.get());
6777 }
6778 
6779 template<typename Derived>
6780 StmtResult
6781 TreeTransform<Derived>::TransformWhileStmt(WhileStmt *S) {
6782   // Transform the condition
6783   Sema::ConditionResult Cond = getDerived().TransformCondition(
6784       S->getWhileLoc(), S->getConditionVariable(), S->getCond(),
6785       Sema::ConditionKind::Boolean);
6786   if (Cond.isInvalid())
6787     return StmtError();
6788 
6789   // Transform the body
6790   StmtResult Body = getDerived().TransformStmt(S->getBody());
6791   if (Body.isInvalid())
6792     return StmtError();
6793 
6794   if (!getDerived().AlwaysRebuild() &&
6795       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6796       Body.get() == S->getBody())
6797     return Owned(S);
6798 
6799   return getDerived().RebuildWhileStmt(S->getWhileLoc(), Cond, Body.get());
6800 }
6801 
6802 template<typename Derived>
6803 StmtResult
6804 TreeTransform<Derived>::TransformDoStmt(DoStmt *S) {
6805   // Transform the body
6806   StmtResult Body = getDerived().TransformStmt(S->getBody());
6807   if (Body.isInvalid())
6808     return StmtError();
6809 
6810   // Transform the condition
6811   ExprResult Cond = getDerived().TransformExpr(S->getCond());
6812   if (Cond.isInvalid())
6813     return StmtError();
6814 
6815   if (!getDerived().AlwaysRebuild() &&
6816       Cond.get() == S->getCond() &&
6817       Body.get() == S->getBody())
6818     return S;
6819 
6820   return getDerived().RebuildDoStmt(S->getDoLoc(), Body.get(), S->getWhileLoc(),
6821                                     /*FIXME:*/S->getWhileLoc(), Cond.get(),
6822                                     S->getRParenLoc());
6823 }
6824 
6825 template<typename Derived>
6826 StmtResult
6827 TreeTransform<Derived>::TransformForStmt(ForStmt *S) {
6828   if (getSema().getLangOpts().OpenMP)
6829     getSema().startOpenMPLoop();
6830 
6831   // Transform the initialization statement
6832   StmtResult Init = getDerived().TransformStmt(S->getInit());
6833   if (Init.isInvalid())
6834     return StmtError();
6835 
6836   // In OpenMP loop region loop control variable must be captured and be
6837   // private. Perform analysis of first part (if any).
6838   if (getSema().getLangOpts().OpenMP && Init.isUsable())
6839     getSema().ActOnOpenMPLoopInitialization(S->getForLoc(), Init.get());
6840 
6841   // Transform the condition
6842   Sema::ConditionResult Cond = getDerived().TransformCondition(
6843       S->getForLoc(), S->getConditionVariable(), S->getCond(),
6844       Sema::ConditionKind::Boolean);
6845   if (Cond.isInvalid())
6846     return StmtError();
6847 
6848   // Transform the increment
6849   ExprResult Inc = getDerived().TransformExpr(S->getInc());
6850   if (Inc.isInvalid())
6851     return StmtError();
6852 
6853   Sema::FullExprArg FullInc(getSema().MakeFullDiscardedValueExpr(Inc.get()));
6854   if (S->getInc() && !FullInc.get())
6855     return StmtError();
6856 
6857   // Transform the body
6858   StmtResult Body = getDerived().TransformStmt(S->getBody());
6859   if (Body.isInvalid())
6860     return StmtError();
6861 
6862   if (!getDerived().AlwaysRebuild() &&
6863       Init.get() == S->getInit() &&
6864       Cond.get() == std::make_pair(S->getConditionVariable(), S->getCond()) &&
6865       Inc.get() == S->getInc() &&
6866       Body.get() == S->getBody())
6867     return S;
6868 
6869   return getDerived().RebuildForStmt(S->getForLoc(), S->getLParenLoc(),
6870                                      Init.get(), Cond, FullInc,
6871                                      S->getRParenLoc(), Body.get());
6872 }
6873 
6874 template<typename Derived>
6875 StmtResult
6876 TreeTransform<Derived>::TransformGotoStmt(GotoStmt *S) {
6877   Decl *LD = getDerived().TransformDecl(S->getLabel()->getLocation(),
6878                                         S->getLabel());
6879   if (!LD)
6880     return StmtError();
6881 
6882   // Goto statements must always be rebuilt, to resolve the label.
6883   return getDerived().RebuildGotoStmt(S->getGotoLoc(), S->getLabelLoc(),
6884                                       cast<LabelDecl>(LD));
6885 }
6886 
6887 template<typename Derived>
6888 StmtResult
6889 TreeTransform<Derived>::TransformIndirectGotoStmt(IndirectGotoStmt *S) {
6890   ExprResult Target = getDerived().TransformExpr(S->getTarget());
6891   if (Target.isInvalid())
6892     return StmtError();
6893   Target = SemaRef.MaybeCreateExprWithCleanups(Target.get());
6894 
6895   if (!getDerived().AlwaysRebuild() &&
6896       Target.get() == S->getTarget())
6897     return S;
6898 
6899   return getDerived().RebuildIndirectGotoStmt(S->getGotoLoc(), S->getStarLoc(),
6900                                               Target.get());
6901 }
6902 
6903 template<typename Derived>
6904 StmtResult
6905 TreeTransform<Derived>::TransformContinueStmt(ContinueStmt *S) {
6906   return S;
6907 }
6908 
6909 template<typename Derived>
6910 StmtResult
6911 TreeTransform<Derived>::TransformBreakStmt(BreakStmt *S) {
6912   return S;
6913 }
6914 
6915 template<typename Derived>
6916 StmtResult
6917 TreeTransform<Derived>::TransformReturnStmt(ReturnStmt *S) {
6918   ExprResult Result = getDerived().TransformInitializer(S->getRetValue(),
6919                                                         /*NotCopyInit*/false);
6920   if (Result.isInvalid())
6921     return StmtError();
6922 
6923   // FIXME: We always rebuild the return statement because there is no way
6924   // to tell whether the return type of the function has changed.
6925   return getDerived().RebuildReturnStmt(S->getReturnLoc(), Result.get());
6926 }
6927 
6928 template<typename Derived>
6929 StmtResult
6930 TreeTransform<Derived>::TransformDeclStmt(DeclStmt *S) {
6931   bool DeclChanged = false;
6932   SmallVector<Decl *, 4> Decls;
6933   for (auto *D : S->decls()) {
6934     Decl *Transformed = getDerived().TransformDefinition(D->getLocation(), D);
6935     if (!Transformed)
6936       return StmtError();
6937 
6938     if (Transformed != D)
6939       DeclChanged = true;
6940 
6941     Decls.push_back(Transformed);
6942   }
6943 
6944   if (!getDerived().AlwaysRebuild() && !DeclChanged)
6945     return S;
6946 
6947   return getDerived().RebuildDeclStmt(Decls, S->getBeginLoc(), S->getEndLoc());
6948 }
6949 
6950 template<typename Derived>
6951 StmtResult
6952 TreeTransform<Derived>::TransformGCCAsmStmt(GCCAsmStmt *S) {
6953 
6954   SmallVector<Expr*, 8> Constraints;
6955   SmallVector<Expr*, 8> Exprs;
6956   SmallVector<IdentifierInfo *, 4> Names;
6957 
6958   ExprResult AsmString;
6959   SmallVector<Expr*, 8> Clobbers;
6960 
6961   bool ExprsChanged = false;
6962 
6963   // Go through the outputs.
6964   for (unsigned I = 0, E = S->getNumOutputs(); I != E; ++I) {
6965     Names.push_back(S->getOutputIdentifier(I));
6966 
6967     // No need to transform the constraint literal.
6968     Constraints.push_back(S->getOutputConstraintLiteral(I));
6969 
6970     // Transform the output expr.
6971     Expr *OutputExpr = S->getOutputExpr(I);
6972     ExprResult Result = getDerived().TransformExpr(OutputExpr);
6973     if (Result.isInvalid())
6974       return StmtError();
6975 
6976     ExprsChanged |= Result.get() != OutputExpr;
6977 
6978     Exprs.push_back(Result.get());
6979   }
6980 
6981   // Go through the inputs.
6982   for (unsigned I = 0, E = S->getNumInputs(); I != E; ++I) {
6983     Names.push_back(S->getInputIdentifier(I));
6984 
6985     // No need to transform the constraint literal.
6986     Constraints.push_back(S->getInputConstraintLiteral(I));
6987 
6988     // Transform the input expr.
6989     Expr *InputExpr = S->getInputExpr(I);
6990     ExprResult Result = getDerived().TransformExpr(InputExpr);
6991     if (Result.isInvalid())
6992       return StmtError();
6993 
6994     ExprsChanged |= Result.get() != InputExpr;
6995 
6996     Exprs.push_back(Result.get());
6997   }
6998 
6999   if (!getDerived().AlwaysRebuild() && !ExprsChanged)
7000     return S;
7001 
7002   // Go through the clobbers.
7003   for (unsigned I = 0, E = S->getNumClobbers(); I != E; ++I)
7004     Clobbers.push_back(S->getClobberStringLiteral(I));
7005 
7006   // No need to transform the asm string literal.
7007   AsmString = S->getAsmString();
7008   return getDerived().RebuildGCCAsmStmt(S->getAsmLoc(), S->isSimple(),
7009                                         S->isVolatile(), S->getNumOutputs(),
7010                                         S->getNumInputs(), Names.data(),
7011                                         Constraints, Exprs, AsmString.get(),
7012                                         Clobbers, S->getRParenLoc());
7013 }
7014 
7015 template<typename Derived>
7016 StmtResult
7017 TreeTransform<Derived>::TransformMSAsmStmt(MSAsmStmt *S) {
7018   ArrayRef<Token> AsmToks =
7019     llvm::makeArrayRef(S->getAsmToks(), S->getNumAsmToks());
7020 
7021   bool HadError = false, HadChange = false;
7022 
7023   ArrayRef<Expr*> SrcExprs = S->getAllExprs();
7024   SmallVector<Expr*, 8> TransformedExprs;
7025   TransformedExprs.reserve(SrcExprs.size());
7026   for (unsigned i = 0, e = SrcExprs.size(); i != e; ++i) {
7027     ExprResult Result = getDerived().TransformExpr(SrcExprs[i]);
7028     if (!Result.isUsable()) {
7029       HadError = true;
7030     } else {
7031       HadChange |= (Result.get() != SrcExprs[i]);
7032       TransformedExprs.push_back(Result.get());
7033     }
7034   }
7035 
7036   if (HadError) return StmtError();
7037   if (!HadChange && !getDerived().AlwaysRebuild())
7038     return Owned(S);
7039 
7040   return getDerived().RebuildMSAsmStmt(S->getAsmLoc(), S->getLBraceLoc(),
7041                                        AsmToks, S->getAsmString(),
7042                                        S->getNumOutputs(), S->getNumInputs(),
7043                                        S->getAllConstraints(), S->getClobbers(),
7044                                        TransformedExprs, S->getEndLoc());
7045 }
7046 
7047 // C++ Coroutines TS
7048 
7049 template<typename Derived>
7050 StmtResult
7051 TreeTransform<Derived>::TransformCoroutineBodyStmt(CoroutineBodyStmt *S) {
7052   auto *ScopeInfo = SemaRef.getCurFunction();
7053   auto *FD = cast<FunctionDecl>(SemaRef.CurContext);
7054   assert(FD && ScopeInfo && !ScopeInfo->CoroutinePromise &&
7055          ScopeInfo->NeedsCoroutineSuspends &&
7056          ScopeInfo->CoroutineSuspends.first == nullptr &&
7057          ScopeInfo->CoroutineSuspends.second == nullptr &&
7058          "expected clean scope info");
7059 
7060   // Set that we have (possibly-invalid) suspend points before we do anything
7061   // that may fail.
7062   ScopeInfo->setNeedsCoroutineSuspends(false);
7063 
7064   // The new CoroutinePromise object needs to be built and put into the current
7065   // FunctionScopeInfo before any transformations or rebuilding occurs.
7066   if (!SemaRef.buildCoroutineParameterMoves(FD->getLocation()))
7067     return StmtError();
7068   auto *Promise = SemaRef.buildCoroutinePromise(FD->getLocation());
7069   if (!Promise)
7070     return StmtError();
7071   getDerived().transformedLocalDecl(S->getPromiseDecl(), Promise);
7072   ScopeInfo->CoroutinePromise = Promise;
7073 
7074   // Transform the implicit coroutine statements we built during the initial
7075   // parse.
7076   StmtResult InitSuspend = getDerived().TransformStmt(S->getInitSuspendStmt());
7077   if (InitSuspend.isInvalid())
7078     return StmtError();
7079   StmtResult FinalSuspend =
7080       getDerived().TransformStmt(S->getFinalSuspendStmt());
7081   if (FinalSuspend.isInvalid())
7082     return StmtError();
7083   ScopeInfo->setCoroutineSuspends(InitSuspend.get(), FinalSuspend.get());
7084   assert(isa<Expr>(InitSuspend.get()) && isa<Expr>(FinalSuspend.get()));
7085 
7086   StmtResult BodyRes = getDerived().TransformStmt(S->getBody());
7087   if (BodyRes.isInvalid())
7088     return StmtError();
7089 
7090   CoroutineStmtBuilder Builder(SemaRef, *FD, *ScopeInfo, BodyRes.get());
7091   if (Builder.isInvalid())
7092     return StmtError();
7093 
7094   Expr *ReturnObject = S->getReturnValueInit();
7095   assert(ReturnObject && "the return object is expected to be valid");
7096   ExprResult Res = getDerived().TransformInitializer(ReturnObject,
7097                                                      /*NoCopyInit*/ false);
7098   if (Res.isInvalid())
7099     return StmtError();
7100   Builder.ReturnValue = Res.get();
7101 
7102   if (S->hasDependentPromiseType()) {
7103     assert(!Promise->getType()->isDependentType() &&
7104            "the promise type must no longer be dependent");
7105     assert(!S->getFallthroughHandler() && !S->getExceptionHandler() &&
7106            !S->getReturnStmtOnAllocFailure() && !S->getDeallocate() &&
7107            "these nodes should not have been built yet");
7108     if (!Builder.buildDependentStatements())
7109       return StmtError();
7110   } else {
7111     if (auto *OnFallthrough = S->getFallthroughHandler()) {
7112       StmtResult Res = getDerived().TransformStmt(OnFallthrough);
7113       if (Res.isInvalid())
7114         return StmtError();
7115       Builder.OnFallthrough = Res.get();
7116     }
7117 
7118     if (auto *OnException = S->getExceptionHandler()) {
7119       StmtResult Res = getDerived().TransformStmt(OnException);
7120       if (Res.isInvalid())
7121         return StmtError();
7122       Builder.OnException = Res.get();
7123     }
7124 
7125     if (auto *OnAllocFailure = S->getReturnStmtOnAllocFailure()) {
7126       StmtResult Res = getDerived().TransformStmt(OnAllocFailure);
7127       if (Res.isInvalid())
7128         return StmtError();
7129       Builder.ReturnStmtOnAllocFailure = Res.get();
7130     }
7131 
7132     // Transform any additional statements we may have already built
7133     assert(S->getAllocate() && S->getDeallocate() &&
7134            "allocation and deallocation calls must already be built");
7135     ExprResult AllocRes = getDerived().TransformExpr(S->getAllocate());
7136     if (AllocRes.isInvalid())
7137       return StmtError();
7138     Builder.Allocate = AllocRes.get();
7139 
7140     ExprResult DeallocRes = getDerived().TransformExpr(S->getDeallocate());
7141     if (DeallocRes.isInvalid())
7142       return StmtError();
7143     Builder.Deallocate = DeallocRes.get();
7144 
7145     assert(S->getResultDecl() && "ResultDecl must already be built");
7146     StmtResult ResultDecl = getDerived().TransformStmt(S->getResultDecl());
7147     if (ResultDecl.isInvalid())
7148       return StmtError();
7149     Builder.ResultDecl = ResultDecl.get();
7150 
7151     if (auto *ReturnStmt = S->getReturnStmt()) {
7152       StmtResult Res = getDerived().TransformStmt(ReturnStmt);
7153       if (Res.isInvalid())
7154         return StmtError();
7155       Builder.ReturnStmt = Res.get();
7156     }
7157   }
7158 
7159   return getDerived().RebuildCoroutineBodyStmt(Builder);
7160 }
7161 
7162 template<typename Derived>
7163 StmtResult
7164 TreeTransform<Derived>::TransformCoreturnStmt(CoreturnStmt *S) {
7165   ExprResult Result = getDerived().TransformInitializer(S->getOperand(),
7166                                                         /*NotCopyInit*/false);
7167   if (Result.isInvalid())
7168     return StmtError();
7169 
7170   // Always rebuild; we don't know if this needs to be injected into a new
7171   // context or if the promise type has changed.
7172   return getDerived().RebuildCoreturnStmt(S->getKeywordLoc(), Result.get(),
7173                                           S->isImplicit());
7174 }
7175 
7176 template<typename Derived>
7177 ExprResult
7178 TreeTransform<Derived>::TransformCoawaitExpr(CoawaitExpr *E) {
7179   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7180                                                         /*NotCopyInit*/false);
7181   if (Result.isInvalid())
7182     return ExprError();
7183 
7184   // Always rebuild; we don't know if this needs to be injected into a new
7185   // context or if the promise type has changed.
7186   return getDerived().RebuildCoawaitExpr(E->getKeywordLoc(), Result.get(),
7187                                          E->isImplicit());
7188 }
7189 
7190 template <typename Derived>
7191 ExprResult
7192 TreeTransform<Derived>::TransformDependentCoawaitExpr(DependentCoawaitExpr *E) {
7193   ExprResult OperandResult = getDerived().TransformInitializer(E->getOperand(),
7194                                                         /*NotCopyInit*/ false);
7195   if (OperandResult.isInvalid())
7196     return ExprError();
7197 
7198   ExprResult LookupResult = getDerived().TransformUnresolvedLookupExpr(
7199           E->getOperatorCoawaitLookup());
7200 
7201   if (LookupResult.isInvalid())
7202     return ExprError();
7203 
7204   // Always rebuild; we don't know if this needs to be injected into a new
7205   // context or if the promise type has changed.
7206   return getDerived().RebuildDependentCoawaitExpr(
7207       E->getKeywordLoc(), OperandResult.get(),
7208       cast<UnresolvedLookupExpr>(LookupResult.get()));
7209 }
7210 
7211 template<typename Derived>
7212 ExprResult
7213 TreeTransform<Derived>::TransformCoyieldExpr(CoyieldExpr *E) {
7214   ExprResult Result = getDerived().TransformInitializer(E->getOperand(),
7215                                                         /*NotCopyInit*/false);
7216   if (Result.isInvalid())
7217     return ExprError();
7218 
7219   // Always rebuild; we don't know if this needs to be injected into a new
7220   // context or if the promise type has changed.
7221   return getDerived().RebuildCoyieldExpr(E->getKeywordLoc(), Result.get());
7222 }
7223 
7224 // Objective-C Statements.
7225 
7226 template<typename Derived>
7227 StmtResult
7228 TreeTransform<Derived>::TransformObjCAtTryStmt(ObjCAtTryStmt *S) {
7229   // Transform the body of the @try.
7230   StmtResult TryBody = getDerived().TransformStmt(S->getTryBody());
7231   if (TryBody.isInvalid())
7232     return StmtError();
7233 
7234   // Transform the @catch statements (if present).
7235   bool AnyCatchChanged = false;
7236   SmallVector<Stmt*, 8> CatchStmts;
7237   for (unsigned I = 0, N = S->getNumCatchStmts(); I != N; ++I) {
7238     StmtResult Catch = getDerived().TransformStmt(S->getCatchStmt(I));
7239     if (Catch.isInvalid())
7240       return StmtError();
7241     if (Catch.get() != S->getCatchStmt(I))
7242       AnyCatchChanged = true;
7243     CatchStmts.push_back(Catch.get());
7244   }
7245 
7246   // Transform the @finally statement (if present).
7247   StmtResult Finally;
7248   if (S->getFinallyStmt()) {
7249     Finally = getDerived().TransformStmt(S->getFinallyStmt());
7250     if (Finally.isInvalid())
7251       return StmtError();
7252   }
7253 
7254   // If nothing changed, just retain this statement.
7255   if (!getDerived().AlwaysRebuild() &&
7256       TryBody.get() == S->getTryBody() &&
7257       !AnyCatchChanged &&
7258       Finally.get() == S->getFinallyStmt())
7259     return S;
7260 
7261   // Build a new statement.
7262   return getDerived().RebuildObjCAtTryStmt(S->getAtTryLoc(), TryBody.get(),
7263                                            CatchStmts, Finally.get());
7264 }
7265 
7266 template<typename Derived>
7267 StmtResult
7268 TreeTransform<Derived>::TransformObjCAtCatchStmt(ObjCAtCatchStmt *S) {
7269   // Transform the @catch parameter, if there is one.
7270   VarDecl *Var = nullptr;
7271   if (VarDecl *FromVar = S->getCatchParamDecl()) {
7272     TypeSourceInfo *TSInfo = nullptr;
7273     if (FromVar->getTypeSourceInfo()) {
7274       TSInfo = getDerived().TransformType(FromVar->getTypeSourceInfo());
7275       if (!TSInfo)
7276         return StmtError();
7277     }
7278 
7279     QualType T;
7280     if (TSInfo)
7281       T = TSInfo->getType();
7282     else {
7283       T = getDerived().TransformType(FromVar->getType());
7284       if (T.isNull())
7285         return StmtError();
7286     }
7287 
7288     Var = getDerived().RebuildObjCExceptionDecl(FromVar, TSInfo, T);
7289     if (!Var)
7290       return StmtError();
7291   }
7292 
7293   StmtResult Body = getDerived().TransformStmt(S->getCatchBody());
7294   if (Body.isInvalid())
7295     return StmtError();
7296 
7297   return getDerived().RebuildObjCAtCatchStmt(S->getAtCatchLoc(),
7298                                              S->getRParenLoc(),
7299                                              Var, Body.get());
7300 }
7301 
7302 template<typename Derived>
7303 StmtResult
7304 TreeTransform<Derived>::TransformObjCAtFinallyStmt(ObjCAtFinallyStmt *S) {
7305   // Transform the body.
7306   StmtResult Body = getDerived().TransformStmt(S->getFinallyBody());
7307   if (Body.isInvalid())
7308     return StmtError();
7309 
7310   // If nothing changed, just retain this statement.
7311   if (!getDerived().AlwaysRebuild() &&
7312       Body.get() == S->getFinallyBody())
7313     return S;
7314 
7315   // Build a new statement.
7316   return getDerived().RebuildObjCAtFinallyStmt(S->getAtFinallyLoc(),
7317                                                Body.get());
7318 }
7319 
7320 template<typename Derived>
7321 StmtResult
7322 TreeTransform<Derived>::TransformObjCAtThrowStmt(ObjCAtThrowStmt *S) {
7323   ExprResult Operand;
7324   if (S->getThrowExpr()) {
7325     Operand = getDerived().TransformExpr(S->getThrowExpr());
7326     if (Operand.isInvalid())
7327       return StmtError();
7328   }
7329 
7330   if (!getDerived().AlwaysRebuild() &&
7331       Operand.get() == S->getThrowExpr())
7332     return S;
7333 
7334   return getDerived().RebuildObjCAtThrowStmt(S->getThrowLoc(), Operand.get());
7335 }
7336 
7337 template<typename Derived>
7338 StmtResult
7339 TreeTransform<Derived>::TransformObjCAtSynchronizedStmt(
7340                                                   ObjCAtSynchronizedStmt *S) {
7341   // Transform the object we are locking.
7342   ExprResult Object = getDerived().TransformExpr(S->getSynchExpr());
7343   if (Object.isInvalid())
7344     return StmtError();
7345   Object =
7346     getDerived().RebuildObjCAtSynchronizedOperand(S->getAtSynchronizedLoc(),
7347                                                   Object.get());
7348   if (Object.isInvalid())
7349     return StmtError();
7350 
7351   // Transform the body.
7352   StmtResult Body = getDerived().TransformStmt(S->getSynchBody());
7353   if (Body.isInvalid())
7354     return StmtError();
7355 
7356   // If nothing change, just retain the current statement.
7357   if (!getDerived().AlwaysRebuild() &&
7358       Object.get() == S->getSynchExpr() &&
7359       Body.get() == S->getSynchBody())
7360     return S;
7361 
7362   // Build a new statement.
7363   return getDerived().RebuildObjCAtSynchronizedStmt(S->getAtSynchronizedLoc(),
7364                                                     Object.get(), Body.get());
7365 }
7366 
7367 template<typename Derived>
7368 StmtResult
7369 TreeTransform<Derived>::TransformObjCAutoreleasePoolStmt(
7370                                               ObjCAutoreleasePoolStmt *S) {
7371   // Transform the body.
7372   StmtResult Body = getDerived().TransformStmt(S->getSubStmt());
7373   if (Body.isInvalid())
7374     return StmtError();
7375 
7376   // If nothing changed, just retain this statement.
7377   if (!getDerived().AlwaysRebuild() &&
7378       Body.get() == S->getSubStmt())
7379     return S;
7380 
7381   // Build a new statement.
7382   return getDerived().RebuildObjCAutoreleasePoolStmt(
7383                         S->getAtLoc(), Body.get());
7384 }
7385 
7386 template<typename Derived>
7387 StmtResult
7388 TreeTransform<Derived>::TransformObjCForCollectionStmt(
7389                                                   ObjCForCollectionStmt *S) {
7390   // Transform the element statement.
7391   StmtResult Element =
7392       getDerived().TransformStmt(S->getElement(), SDK_NotDiscarded);
7393   if (Element.isInvalid())
7394     return StmtError();
7395 
7396   // Transform the collection expression.
7397   ExprResult Collection = getDerived().TransformExpr(S->getCollection());
7398   if (Collection.isInvalid())
7399     return StmtError();
7400 
7401   // Transform the body.
7402   StmtResult Body = getDerived().TransformStmt(S->getBody());
7403   if (Body.isInvalid())
7404     return StmtError();
7405 
7406   // If nothing changed, just retain this statement.
7407   if (!getDerived().AlwaysRebuild() &&
7408       Element.get() == S->getElement() &&
7409       Collection.get() == S->getCollection() &&
7410       Body.get() == S->getBody())
7411     return S;
7412 
7413   // Build a new statement.
7414   return getDerived().RebuildObjCForCollectionStmt(S->getForLoc(),
7415                                                    Element.get(),
7416                                                    Collection.get(),
7417                                                    S->getRParenLoc(),
7418                                                    Body.get());
7419 }
7420 
7421 template <typename Derived>
7422 StmtResult TreeTransform<Derived>::TransformCXXCatchStmt(CXXCatchStmt *S) {
7423   // Transform the exception declaration, if any.
7424   VarDecl *Var = nullptr;
7425   if (VarDecl *ExceptionDecl = S->getExceptionDecl()) {
7426     TypeSourceInfo *T =
7427         getDerived().TransformType(ExceptionDecl->getTypeSourceInfo());
7428     if (!T)
7429       return StmtError();
7430 
7431     Var = getDerived().RebuildExceptionDecl(
7432         ExceptionDecl, T, ExceptionDecl->getInnerLocStart(),
7433         ExceptionDecl->getLocation(), ExceptionDecl->getIdentifier());
7434     if (!Var || Var->isInvalidDecl())
7435       return StmtError();
7436   }
7437 
7438   // Transform the actual exception handler.
7439   StmtResult Handler = getDerived().TransformStmt(S->getHandlerBlock());
7440   if (Handler.isInvalid())
7441     return StmtError();
7442 
7443   if (!getDerived().AlwaysRebuild() && !Var &&
7444       Handler.get() == S->getHandlerBlock())
7445     return S;
7446 
7447   return getDerived().RebuildCXXCatchStmt(S->getCatchLoc(), Var, Handler.get());
7448 }
7449 
7450 template <typename Derived>
7451 StmtResult TreeTransform<Derived>::TransformCXXTryStmt(CXXTryStmt *S) {
7452   // Transform the try block itself.
7453   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7454   if (TryBlock.isInvalid())
7455     return StmtError();
7456 
7457   // Transform the handlers.
7458   bool HandlerChanged = false;
7459   SmallVector<Stmt *, 8> Handlers;
7460   for (unsigned I = 0, N = S->getNumHandlers(); I != N; ++I) {
7461     StmtResult Handler = getDerived().TransformCXXCatchStmt(S->getHandler(I));
7462     if (Handler.isInvalid())
7463       return StmtError();
7464 
7465     HandlerChanged = HandlerChanged || Handler.get() != S->getHandler(I);
7466     Handlers.push_back(Handler.getAs<Stmt>());
7467   }
7468 
7469   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7470       !HandlerChanged)
7471     return S;
7472 
7473   return getDerived().RebuildCXXTryStmt(S->getTryLoc(), TryBlock.get(),
7474                                         Handlers);
7475 }
7476 
7477 template<typename Derived>
7478 StmtResult
7479 TreeTransform<Derived>::TransformCXXForRangeStmt(CXXForRangeStmt *S) {
7480   StmtResult Init =
7481       S->getInit() ? getDerived().TransformStmt(S->getInit()) : StmtResult();
7482   if (Init.isInvalid())
7483     return StmtError();
7484 
7485   StmtResult Range = getDerived().TransformStmt(S->getRangeStmt());
7486   if (Range.isInvalid())
7487     return StmtError();
7488 
7489   StmtResult Begin = getDerived().TransformStmt(S->getBeginStmt());
7490   if (Begin.isInvalid())
7491     return StmtError();
7492   StmtResult End = getDerived().TransformStmt(S->getEndStmt());
7493   if (End.isInvalid())
7494     return StmtError();
7495 
7496   ExprResult Cond = getDerived().TransformExpr(S->getCond());
7497   if (Cond.isInvalid())
7498     return StmtError();
7499   if (Cond.get())
7500     Cond = SemaRef.CheckBooleanCondition(S->getColonLoc(), Cond.get());
7501   if (Cond.isInvalid())
7502     return StmtError();
7503   if (Cond.get())
7504     Cond = SemaRef.MaybeCreateExprWithCleanups(Cond.get());
7505 
7506   ExprResult Inc = getDerived().TransformExpr(S->getInc());
7507   if (Inc.isInvalid())
7508     return StmtError();
7509   if (Inc.get())
7510     Inc = SemaRef.MaybeCreateExprWithCleanups(Inc.get());
7511 
7512   StmtResult LoopVar = getDerived().TransformStmt(S->getLoopVarStmt());
7513   if (LoopVar.isInvalid())
7514     return StmtError();
7515 
7516   StmtResult NewStmt = S;
7517   if (getDerived().AlwaysRebuild() ||
7518       Init.get() != S->getInit() ||
7519       Range.get() != S->getRangeStmt() ||
7520       Begin.get() != S->getBeginStmt() ||
7521       End.get() != S->getEndStmt() ||
7522       Cond.get() != S->getCond() ||
7523       Inc.get() != S->getInc() ||
7524       LoopVar.get() != S->getLoopVarStmt()) {
7525     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7526                                                   S->getCoawaitLoc(), Init.get(),
7527                                                   S->getColonLoc(), Range.get(),
7528                                                   Begin.get(), End.get(),
7529                                                   Cond.get(),
7530                                                   Inc.get(), LoopVar.get(),
7531                                                   S->getRParenLoc());
7532     if (NewStmt.isInvalid())
7533       return StmtError();
7534   }
7535 
7536   StmtResult Body = getDerived().TransformStmt(S->getBody());
7537   if (Body.isInvalid())
7538     return StmtError();
7539 
7540   // Body has changed but we didn't rebuild the for-range statement. Rebuild
7541   // it now so we have a new statement to attach the body to.
7542   if (Body.get() != S->getBody() && NewStmt.get() == S) {
7543     NewStmt = getDerived().RebuildCXXForRangeStmt(S->getForLoc(),
7544                                                   S->getCoawaitLoc(), Init.get(),
7545                                                   S->getColonLoc(), Range.get(),
7546                                                   Begin.get(), End.get(),
7547                                                   Cond.get(),
7548                                                   Inc.get(), LoopVar.get(),
7549                                                   S->getRParenLoc());
7550     if (NewStmt.isInvalid())
7551       return StmtError();
7552   }
7553 
7554   if (NewStmt.get() == S)
7555     return S;
7556 
7557   return FinishCXXForRangeStmt(NewStmt.get(), Body.get());
7558 }
7559 
7560 template<typename Derived>
7561 StmtResult
7562 TreeTransform<Derived>::TransformMSDependentExistsStmt(
7563                                                     MSDependentExistsStmt *S) {
7564   // Transform the nested-name-specifier, if any.
7565   NestedNameSpecifierLoc QualifierLoc;
7566   if (S->getQualifierLoc()) {
7567     QualifierLoc
7568       = getDerived().TransformNestedNameSpecifierLoc(S->getQualifierLoc());
7569     if (!QualifierLoc)
7570       return StmtError();
7571   }
7572 
7573   // Transform the declaration name.
7574   DeclarationNameInfo NameInfo = S->getNameInfo();
7575   if (NameInfo.getName()) {
7576     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
7577     if (!NameInfo.getName())
7578       return StmtError();
7579   }
7580 
7581   // Check whether anything changed.
7582   if (!getDerived().AlwaysRebuild() &&
7583       QualifierLoc == S->getQualifierLoc() &&
7584       NameInfo.getName() == S->getNameInfo().getName())
7585     return S;
7586 
7587   // Determine whether this name exists, if we can.
7588   CXXScopeSpec SS;
7589   SS.Adopt(QualifierLoc);
7590   bool Dependent = false;
7591   switch (getSema().CheckMicrosoftIfExistsSymbol(/*S=*/nullptr, SS, NameInfo)) {
7592   case Sema::IER_Exists:
7593     if (S->isIfExists())
7594       break;
7595 
7596     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7597 
7598   case Sema::IER_DoesNotExist:
7599     if (S->isIfNotExists())
7600       break;
7601 
7602     return new (getSema().Context) NullStmt(S->getKeywordLoc());
7603 
7604   case Sema::IER_Dependent:
7605     Dependent = true;
7606     break;
7607 
7608   case Sema::IER_Error:
7609     return StmtError();
7610   }
7611 
7612   // We need to continue with the instantiation, so do so now.
7613   StmtResult SubStmt = getDerived().TransformCompoundStmt(S->getSubStmt());
7614   if (SubStmt.isInvalid())
7615     return StmtError();
7616 
7617   // If we have resolved the name, just transform to the substatement.
7618   if (!Dependent)
7619     return SubStmt;
7620 
7621   // The name is still dependent, so build a dependent expression again.
7622   return getDerived().RebuildMSDependentExistsStmt(S->getKeywordLoc(),
7623                                                    S->isIfExists(),
7624                                                    QualifierLoc,
7625                                                    NameInfo,
7626                                                    SubStmt.get());
7627 }
7628 
7629 template<typename Derived>
7630 ExprResult
7631 TreeTransform<Derived>::TransformMSPropertyRefExpr(MSPropertyRefExpr *E) {
7632   NestedNameSpecifierLoc QualifierLoc;
7633   if (E->getQualifierLoc()) {
7634     QualifierLoc
7635     = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
7636     if (!QualifierLoc)
7637       return ExprError();
7638   }
7639 
7640   MSPropertyDecl *PD = cast_or_null<MSPropertyDecl>(
7641     getDerived().TransformDecl(E->getMemberLoc(), E->getPropertyDecl()));
7642   if (!PD)
7643     return ExprError();
7644 
7645   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
7646   if (Base.isInvalid())
7647     return ExprError();
7648 
7649   return new (SemaRef.getASTContext())
7650       MSPropertyRefExpr(Base.get(), PD, E->isArrow(),
7651                         SemaRef.getASTContext().PseudoObjectTy, VK_LValue,
7652                         QualifierLoc, E->getMemberLoc());
7653 }
7654 
7655 template <typename Derived>
7656 ExprResult TreeTransform<Derived>::TransformMSPropertySubscriptExpr(
7657     MSPropertySubscriptExpr *E) {
7658   auto BaseRes = getDerived().TransformExpr(E->getBase());
7659   if (BaseRes.isInvalid())
7660     return ExprError();
7661   auto IdxRes = getDerived().TransformExpr(E->getIdx());
7662   if (IdxRes.isInvalid())
7663     return ExprError();
7664 
7665   if (!getDerived().AlwaysRebuild() &&
7666       BaseRes.get() == E->getBase() &&
7667       IdxRes.get() == E->getIdx())
7668     return E;
7669 
7670   return getDerived().RebuildArraySubscriptExpr(
7671       BaseRes.get(), SourceLocation(), IdxRes.get(), E->getRBracketLoc());
7672 }
7673 
7674 template <typename Derived>
7675 StmtResult TreeTransform<Derived>::TransformSEHTryStmt(SEHTryStmt *S) {
7676   StmtResult TryBlock = getDerived().TransformCompoundStmt(S->getTryBlock());
7677   if (TryBlock.isInvalid())
7678     return StmtError();
7679 
7680   StmtResult Handler = getDerived().TransformSEHHandler(S->getHandler());
7681   if (Handler.isInvalid())
7682     return StmtError();
7683 
7684   if (!getDerived().AlwaysRebuild() && TryBlock.get() == S->getTryBlock() &&
7685       Handler.get() == S->getHandler())
7686     return S;
7687 
7688   return getDerived().RebuildSEHTryStmt(S->getIsCXXTry(), S->getTryLoc(),
7689                                         TryBlock.get(), Handler.get());
7690 }
7691 
7692 template <typename Derived>
7693 StmtResult TreeTransform<Derived>::TransformSEHFinallyStmt(SEHFinallyStmt *S) {
7694   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7695   if (Block.isInvalid())
7696     return StmtError();
7697 
7698   return getDerived().RebuildSEHFinallyStmt(S->getFinallyLoc(), Block.get());
7699 }
7700 
7701 template <typename Derived>
7702 StmtResult TreeTransform<Derived>::TransformSEHExceptStmt(SEHExceptStmt *S) {
7703   ExprResult FilterExpr = getDerived().TransformExpr(S->getFilterExpr());
7704   if (FilterExpr.isInvalid())
7705     return StmtError();
7706 
7707   StmtResult Block = getDerived().TransformCompoundStmt(S->getBlock());
7708   if (Block.isInvalid())
7709     return StmtError();
7710 
7711   return getDerived().RebuildSEHExceptStmt(S->getExceptLoc(), FilterExpr.get(),
7712                                            Block.get());
7713 }
7714 
7715 template <typename Derived>
7716 StmtResult TreeTransform<Derived>::TransformSEHHandler(Stmt *Handler) {
7717   if (isa<SEHFinallyStmt>(Handler))
7718     return getDerived().TransformSEHFinallyStmt(cast<SEHFinallyStmt>(Handler));
7719   else
7720     return getDerived().TransformSEHExceptStmt(cast<SEHExceptStmt>(Handler));
7721 }
7722 
7723 template<typename Derived>
7724 StmtResult
7725 TreeTransform<Derived>::TransformSEHLeaveStmt(SEHLeaveStmt *S) {
7726   return S;
7727 }
7728 
7729 //===----------------------------------------------------------------------===//
7730 // OpenMP directive transformation
7731 //===----------------------------------------------------------------------===//
7732 template <typename Derived>
7733 StmtResult TreeTransform<Derived>::TransformOMPExecutableDirective(
7734     OMPExecutableDirective *D) {
7735 
7736   // Transform the clauses
7737   llvm::SmallVector<OMPClause *, 16> TClauses;
7738   ArrayRef<OMPClause *> Clauses = D->clauses();
7739   TClauses.reserve(Clauses.size());
7740   for (ArrayRef<OMPClause *>::iterator I = Clauses.begin(), E = Clauses.end();
7741        I != E; ++I) {
7742     if (*I) {
7743       getDerived().getSema().StartOpenMPClause((*I)->getClauseKind());
7744       OMPClause *Clause = getDerived().TransformOMPClause(*I);
7745       getDerived().getSema().EndOpenMPClause();
7746       if (Clause)
7747         TClauses.push_back(Clause);
7748     } else {
7749       TClauses.push_back(nullptr);
7750     }
7751   }
7752   StmtResult AssociatedStmt;
7753   if (D->hasAssociatedStmt() && D->getAssociatedStmt()) {
7754     getDerived().getSema().ActOnOpenMPRegionStart(D->getDirectiveKind(),
7755                                                   /*CurScope=*/nullptr);
7756     StmtResult Body;
7757     {
7758       Sema::CompoundScopeRAII CompoundScope(getSema());
7759       Stmt *CS = D->getInnermostCapturedStmt()->getCapturedStmt();
7760       Body = getDerived().TransformStmt(CS);
7761     }
7762     AssociatedStmt =
7763         getDerived().getSema().ActOnOpenMPRegionEnd(Body, TClauses);
7764     if (AssociatedStmt.isInvalid()) {
7765       return StmtError();
7766     }
7767   }
7768   if (TClauses.size() != Clauses.size()) {
7769     return StmtError();
7770   }
7771 
7772   // Transform directive name for 'omp critical' directive.
7773   DeclarationNameInfo DirName;
7774   if (D->getDirectiveKind() == OMPD_critical) {
7775     DirName = cast<OMPCriticalDirective>(D)->getDirectiveName();
7776     DirName = getDerived().TransformDeclarationNameInfo(DirName);
7777   }
7778   OpenMPDirectiveKind CancelRegion = OMPD_unknown;
7779   if (D->getDirectiveKind() == OMPD_cancellation_point) {
7780     CancelRegion = cast<OMPCancellationPointDirective>(D)->getCancelRegion();
7781   } else if (D->getDirectiveKind() == OMPD_cancel) {
7782     CancelRegion = cast<OMPCancelDirective>(D)->getCancelRegion();
7783   }
7784 
7785   return getDerived().RebuildOMPExecutableDirective(
7786       D->getDirectiveKind(), DirName, CancelRegion, TClauses,
7787       AssociatedStmt.get(), D->getBeginLoc(), D->getEndLoc());
7788 }
7789 
7790 template <typename Derived>
7791 StmtResult
7792 TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) {
7793   DeclarationNameInfo DirName;
7794   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel, DirName, nullptr,
7795                                              D->getBeginLoc());
7796   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7797   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7798   return Res;
7799 }
7800 
7801 template <typename Derived>
7802 StmtResult
7803 TreeTransform<Derived>::TransformOMPSimdDirective(OMPSimdDirective *D) {
7804   DeclarationNameInfo DirName;
7805   getDerived().getSema().StartOpenMPDSABlock(OMPD_simd, DirName, nullptr,
7806                                              D->getBeginLoc());
7807   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7808   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7809   return Res;
7810 }
7811 
7812 template <typename Derived>
7813 StmtResult
7814 TreeTransform<Derived>::TransformOMPForDirective(OMPForDirective *D) {
7815   DeclarationNameInfo DirName;
7816   getDerived().getSema().StartOpenMPDSABlock(OMPD_for, DirName, nullptr,
7817                                              D->getBeginLoc());
7818   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7819   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7820   return Res;
7821 }
7822 
7823 template <typename Derived>
7824 StmtResult
7825 TreeTransform<Derived>::TransformOMPForSimdDirective(OMPForSimdDirective *D) {
7826   DeclarationNameInfo DirName;
7827   getDerived().getSema().StartOpenMPDSABlock(OMPD_for_simd, DirName, nullptr,
7828                                              D->getBeginLoc());
7829   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7830   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7831   return Res;
7832 }
7833 
7834 template <typename Derived>
7835 StmtResult
7836 TreeTransform<Derived>::TransformOMPSectionsDirective(OMPSectionsDirective *D) {
7837   DeclarationNameInfo DirName;
7838   getDerived().getSema().StartOpenMPDSABlock(OMPD_sections, DirName, nullptr,
7839                                              D->getBeginLoc());
7840   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7841   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7842   return Res;
7843 }
7844 
7845 template <typename Derived>
7846 StmtResult
7847 TreeTransform<Derived>::TransformOMPSectionDirective(OMPSectionDirective *D) {
7848   DeclarationNameInfo DirName;
7849   getDerived().getSema().StartOpenMPDSABlock(OMPD_section, DirName, nullptr,
7850                                              D->getBeginLoc());
7851   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7852   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7853   return Res;
7854 }
7855 
7856 template <typename Derived>
7857 StmtResult
7858 TreeTransform<Derived>::TransformOMPSingleDirective(OMPSingleDirective *D) {
7859   DeclarationNameInfo DirName;
7860   getDerived().getSema().StartOpenMPDSABlock(OMPD_single, DirName, nullptr,
7861                                              D->getBeginLoc());
7862   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7863   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7864   return Res;
7865 }
7866 
7867 template <typename Derived>
7868 StmtResult
7869 TreeTransform<Derived>::TransformOMPMasterDirective(OMPMasterDirective *D) {
7870   DeclarationNameInfo DirName;
7871   getDerived().getSema().StartOpenMPDSABlock(OMPD_master, DirName, nullptr,
7872                                              D->getBeginLoc());
7873   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7874   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7875   return Res;
7876 }
7877 
7878 template <typename Derived>
7879 StmtResult
7880 TreeTransform<Derived>::TransformOMPCriticalDirective(OMPCriticalDirective *D) {
7881   getDerived().getSema().StartOpenMPDSABlock(
7882       OMPD_critical, D->getDirectiveName(), nullptr, D->getBeginLoc());
7883   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7884   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7885   return Res;
7886 }
7887 
7888 template <typename Derived>
7889 StmtResult TreeTransform<Derived>::TransformOMPParallelForDirective(
7890     OMPParallelForDirective *D) {
7891   DeclarationNameInfo DirName;
7892   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for, DirName,
7893                                              nullptr, D->getBeginLoc());
7894   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7895   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7896   return Res;
7897 }
7898 
7899 template <typename Derived>
7900 StmtResult TreeTransform<Derived>::TransformOMPParallelForSimdDirective(
7901     OMPParallelForSimdDirective *D) {
7902   DeclarationNameInfo DirName;
7903   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_for_simd, DirName,
7904                                              nullptr, D->getBeginLoc());
7905   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7906   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7907   return Res;
7908 }
7909 
7910 template <typename Derived>
7911 StmtResult TreeTransform<Derived>::TransformOMPParallelSectionsDirective(
7912     OMPParallelSectionsDirective *D) {
7913   DeclarationNameInfo DirName;
7914   getDerived().getSema().StartOpenMPDSABlock(OMPD_parallel_sections, DirName,
7915                                              nullptr, D->getBeginLoc());
7916   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7917   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7918   return Res;
7919 }
7920 
7921 template <typename Derived>
7922 StmtResult
7923 TreeTransform<Derived>::TransformOMPTaskDirective(OMPTaskDirective *D) {
7924   DeclarationNameInfo DirName;
7925   getDerived().getSema().StartOpenMPDSABlock(OMPD_task, DirName, nullptr,
7926                                              D->getBeginLoc());
7927   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7928   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7929   return Res;
7930 }
7931 
7932 template <typename Derived>
7933 StmtResult TreeTransform<Derived>::TransformOMPTaskyieldDirective(
7934     OMPTaskyieldDirective *D) {
7935   DeclarationNameInfo DirName;
7936   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskyield, DirName, nullptr,
7937                                              D->getBeginLoc());
7938   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7939   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7940   return Res;
7941 }
7942 
7943 template <typename Derived>
7944 StmtResult
7945 TreeTransform<Derived>::TransformOMPBarrierDirective(OMPBarrierDirective *D) {
7946   DeclarationNameInfo DirName;
7947   getDerived().getSema().StartOpenMPDSABlock(OMPD_barrier, DirName, nullptr,
7948                                              D->getBeginLoc());
7949   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7950   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7951   return Res;
7952 }
7953 
7954 template <typename Derived>
7955 StmtResult
7956 TreeTransform<Derived>::TransformOMPTaskwaitDirective(OMPTaskwaitDirective *D) {
7957   DeclarationNameInfo DirName;
7958   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskwait, DirName, nullptr,
7959                                              D->getBeginLoc());
7960   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7961   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7962   return Res;
7963 }
7964 
7965 template <typename Derived>
7966 StmtResult TreeTransform<Derived>::TransformOMPTaskgroupDirective(
7967     OMPTaskgroupDirective *D) {
7968   DeclarationNameInfo DirName;
7969   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskgroup, DirName, nullptr,
7970                                              D->getBeginLoc());
7971   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7972   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7973   return Res;
7974 }
7975 
7976 template <typename Derived>
7977 StmtResult
7978 TreeTransform<Derived>::TransformOMPFlushDirective(OMPFlushDirective *D) {
7979   DeclarationNameInfo DirName;
7980   getDerived().getSema().StartOpenMPDSABlock(OMPD_flush, DirName, nullptr,
7981                                              D->getBeginLoc());
7982   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7983   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7984   return Res;
7985 }
7986 
7987 template <typename Derived>
7988 StmtResult
7989 TreeTransform<Derived>::TransformOMPOrderedDirective(OMPOrderedDirective *D) {
7990   DeclarationNameInfo DirName;
7991   getDerived().getSema().StartOpenMPDSABlock(OMPD_ordered, DirName, nullptr,
7992                                              D->getBeginLoc());
7993   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
7994   getDerived().getSema().EndOpenMPDSABlock(Res.get());
7995   return Res;
7996 }
7997 
7998 template <typename Derived>
7999 StmtResult
8000 TreeTransform<Derived>::TransformOMPAtomicDirective(OMPAtomicDirective *D) {
8001   DeclarationNameInfo DirName;
8002   getDerived().getSema().StartOpenMPDSABlock(OMPD_atomic, DirName, nullptr,
8003                                              D->getBeginLoc());
8004   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8005   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8006   return Res;
8007 }
8008 
8009 template <typename Derived>
8010 StmtResult
8011 TreeTransform<Derived>::TransformOMPTargetDirective(OMPTargetDirective *D) {
8012   DeclarationNameInfo DirName;
8013   getDerived().getSema().StartOpenMPDSABlock(OMPD_target, DirName, nullptr,
8014                                              D->getBeginLoc());
8015   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8016   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8017   return Res;
8018 }
8019 
8020 template <typename Derived>
8021 StmtResult TreeTransform<Derived>::TransformOMPTargetDataDirective(
8022     OMPTargetDataDirective *D) {
8023   DeclarationNameInfo DirName;
8024   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_data, DirName, nullptr,
8025                                              D->getBeginLoc());
8026   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8027   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8028   return Res;
8029 }
8030 
8031 template <typename Derived>
8032 StmtResult TreeTransform<Derived>::TransformOMPTargetEnterDataDirective(
8033     OMPTargetEnterDataDirective *D) {
8034   DeclarationNameInfo DirName;
8035   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_enter_data, DirName,
8036                                              nullptr, D->getBeginLoc());
8037   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8038   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8039   return Res;
8040 }
8041 
8042 template <typename Derived>
8043 StmtResult TreeTransform<Derived>::TransformOMPTargetExitDataDirective(
8044     OMPTargetExitDataDirective *D) {
8045   DeclarationNameInfo DirName;
8046   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_exit_data, DirName,
8047                                              nullptr, D->getBeginLoc());
8048   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8049   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8050   return Res;
8051 }
8052 
8053 template <typename Derived>
8054 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelDirective(
8055     OMPTargetParallelDirective *D) {
8056   DeclarationNameInfo DirName;
8057   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel, DirName,
8058                                              nullptr, D->getBeginLoc());
8059   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8060   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8061   return Res;
8062 }
8063 
8064 template <typename Derived>
8065 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForDirective(
8066     OMPTargetParallelForDirective *D) {
8067   DeclarationNameInfo DirName;
8068   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_parallel_for, DirName,
8069                                              nullptr, D->getBeginLoc());
8070   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8071   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8072   return Res;
8073 }
8074 
8075 template <typename Derived>
8076 StmtResult TreeTransform<Derived>::TransformOMPTargetUpdateDirective(
8077     OMPTargetUpdateDirective *D) {
8078   DeclarationNameInfo DirName;
8079   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_update, DirName,
8080                                              nullptr, D->getBeginLoc());
8081   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8082   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8083   return Res;
8084 }
8085 
8086 template <typename Derived>
8087 StmtResult
8088 TreeTransform<Derived>::TransformOMPTeamsDirective(OMPTeamsDirective *D) {
8089   DeclarationNameInfo DirName;
8090   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams, DirName, nullptr,
8091                                              D->getBeginLoc());
8092   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8093   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8094   return Res;
8095 }
8096 
8097 template <typename Derived>
8098 StmtResult TreeTransform<Derived>::TransformOMPCancellationPointDirective(
8099     OMPCancellationPointDirective *D) {
8100   DeclarationNameInfo DirName;
8101   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancellation_point, DirName,
8102                                              nullptr, D->getBeginLoc());
8103   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8104   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8105   return Res;
8106 }
8107 
8108 template <typename Derived>
8109 StmtResult
8110 TreeTransform<Derived>::TransformOMPCancelDirective(OMPCancelDirective *D) {
8111   DeclarationNameInfo DirName;
8112   getDerived().getSema().StartOpenMPDSABlock(OMPD_cancel, DirName, nullptr,
8113                                              D->getBeginLoc());
8114   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8115   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8116   return Res;
8117 }
8118 
8119 template <typename Derived>
8120 StmtResult
8121 TreeTransform<Derived>::TransformOMPTaskLoopDirective(OMPTaskLoopDirective *D) {
8122   DeclarationNameInfo DirName;
8123   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop, DirName, nullptr,
8124                                              D->getBeginLoc());
8125   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8126   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8127   return Res;
8128 }
8129 
8130 template <typename Derived>
8131 StmtResult TreeTransform<Derived>::TransformOMPTaskLoopSimdDirective(
8132     OMPTaskLoopSimdDirective *D) {
8133   DeclarationNameInfo DirName;
8134   getDerived().getSema().StartOpenMPDSABlock(OMPD_taskloop_simd, DirName,
8135                                              nullptr, D->getBeginLoc());
8136   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8137   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8138   return Res;
8139 }
8140 
8141 template <typename Derived>
8142 StmtResult TreeTransform<Derived>::TransformOMPDistributeDirective(
8143     OMPDistributeDirective *D) {
8144   DeclarationNameInfo DirName;
8145   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute, DirName, nullptr,
8146                                              D->getBeginLoc());
8147   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8148   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8149   return Res;
8150 }
8151 
8152 template <typename Derived>
8153 StmtResult TreeTransform<Derived>::TransformOMPDistributeParallelForDirective(
8154     OMPDistributeParallelForDirective *D) {
8155   DeclarationNameInfo DirName;
8156   getDerived().getSema().StartOpenMPDSABlock(
8157       OMPD_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8158   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8159   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8160   return Res;
8161 }
8162 
8163 template <typename Derived>
8164 StmtResult
8165 TreeTransform<Derived>::TransformOMPDistributeParallelForSimdDirective(
8166     OMPDistributeParallelForSimdDirective *D) {
8167   DeclarationNameInfo DirName;
8168   getDerived().getSema().StartOpenMPDSABlock(
8169       OMPD_distribute_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8170   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8171   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8172   return Res;
8173 }
8174 
8175 template <typename Derived>
8176 StmtResult TreeTransform<Derived>::TransformOMPDistributeSimdDirective(
8177     OMPDistributeSimdDirective *D) {
8178   DeclarationNameInfo DirName;
8179   getDerived().getSema().StartOpenMPDSABlock(OMPD_distribute_simd, DirName,
8180                                              nullptr, D->getBeginLoc());
8181   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8182   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8183   return Res;
8184 }
8185 
8186 template <typename Derived>
8187 StmtResult TreeTransform<Derived>::TransformOMPTargetParallelForSimdDirective(
8188     OMPTargetParallelForSimdDirective *D) {
8189   DeclarationNameInfo DirName;
8190   getDerived().getSema().StartOpenMPDSABlock(
8191       OMPD_target_parallel_for_simd, DirName, nullptr, D->getBeginLoc());
8192   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8193   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8194   return Res;
8195 }
8196 
8197 template <typename Derived>
8198 StmtResult TreeTransform<Derived>::TransformOMPTargetSimdDirective(
8199     OMPTargetSimdDirective *D) {
8200   DeclarationNameInfo DirName;
8201   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_simd, DirName, nullptr,
8202                                              D->getBeginLoc());
8203   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8204   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8205   return Res;
8206 }
8207 
8208 template <typename Derived>
8209 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeDirective(
8210     OMPTeamsDistributeDirective *D) {
8211   DeclarationNameInfo DirName;
8212   getDerived().getSema().StartOpenMPDSABlock(OMPD_teams_distribute, DirName,
8213                                              nullptr, D->getBeginLoc());
8214   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8215   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8216   return Res;
8217 }
8218 
8219 template <typename Derived>
8220 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeSimdDirective(
8221     OMPTeamsDistributeSimdDirective *D) {
8222   DeclarationNameInfo DirName;
8223   getDerived().getSema().StartOpenMPDSABlock(
8224       OMPD_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8225   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8226   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8227   return Res;
8228 }
8229 
8230 template <typename Derived>
8231 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForSimdDirective(
8232     OMPTeamsDistributeParallelForSimdDirective *D) {
8233   DeclarationNameInfo DirName;
8234   getDerived().getSema().StartOpenMPDSABlock(
8235       OMPD_teams_distribute_parallel_for_simd, DirName, nullptr,
8236       D->getBeginLoc());
8237   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8238   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8239   return Res;
8240 }
8241 
8242 template <typename Derived>
8243 StmtResult TreeTransform<Derived>::TransformOMPTeamsDistributeParallelForDirective(
8244     OMPTeamsDistributeParallelForDirective *D) {
8245   DeclarationNameInfo DirName;
8246   getDerived().getSema().StartOpenMPDSABlock(
8247       OMPD_teams_distribute_parallel_for, DirName, nullptr, D->getBeginLoc());
8248   StmtResult Res = getDerived().TransformOMPExecutableDirective(D);
8249   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8250   return Res;
8251 }
8252 
8253 template <typename Derived>
8254 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDirective(
8255     OMPTargetTeamsDirective *D) {
8256   DeclarationNameInfo DirName;
8257   getDerived().getSema().StartOpenMPDSABlock(OMPD_target_teams, DirName,
8258                                              nullptr, D->getBeginLoc());
8259   auto Res = getDerived().TransformOMPExecutableDirective(D);
8260   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8261   return Res;
8262 }
8263 
8264 template <typename Derived>
8265 StmtResult TreeTransform<Derived>::TransformOMPTargetTeamsDistributeDirective(
8266     OMPTargetTeamsDistributeDirective *D) {
8267   DeclarationNameInfo DirName;
8268   getDerived().getSema().StartOpenMPDSABlock(
8269       OMPD_target_teams_distribute, DirName, nullptr, D->getBeginLoc());
8270   auto Res = getDerived().TransformOMPExecutableDirective(D);
8271   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8272   return Res;
8273 }
8274 
8275 template <typename Derived>
8276 StmtResult
8277 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeParallelForDirective(
8278     OMPTargetTeamsDistributeParallelForDirective *D) {
8279   DeclarationNameInfo DirName;
8280   getDerived().getSema().StartOpenMPDSABlock(
8281       OMPD_target_teams_distribute_parallel_for, DirName, nullptr,
8282       D->getBeginLoc());
8283   auto Res = getDerived().TransformOMPExecutableDirective(D);
8284   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8285   return Res;
8286 }
8287 
8288 template <typename Derived>
8289 StmtResult TreeTransform<Derived>::
8290     TransformOMPTargetTeamsDistributeParallelForSimdDirective(
8291         OMPTargetTeamsDistributeParallelForSimdDirective *D) {
8292   DeclarationNameInfo DirName;
8293   getDerived().getSema().StartOpenMPDSABlock(
8294       OMPD_target_teams_distribute_parallel_for_simd, DirName, nullptr,
8295       D->getBeginLoc());
8296   auto Res = getDerived().TransformOMPExecutableDirective(D);
8297   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8298   return Res;
8299 }
8300 
8301 template <typename Derived>
8302 StmtResult
8303 TreeTransform<Derived>::TransformOMPTargetTeamsDistributeSimdDirective(
8304     OMPTargetTeamsDistributeSimdDirective *D) {
8305   DeclarationNameInfo DirName;
8306   getDerived().getSema().StartOpenMPDSABlock(
8307       OMPD_target_teams_distribute_simd, DirName, nullptr, D->getBeginLoc());
8308   auto Res = getDerived().TransformOMPExecutableDirective(D);
8309   getDerived().getSema().EndOpenMPDSABlock(Res.get());
8310   return Res;
8311 }
8312 
8313 
8314 //===----------------------------------------------------------------------===//
8315 // OpenMP clause transformation
8316 //===----------------------------------------------------------------------===//
8317 template <typename Derived>
8318 OMPClause *TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) {
8319   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8320   if (Cond.isInvalid())
8321     return nullptr;
8322   return getDerived().RebuildOMPIfClause(
8323       C->getNameModifier(), Cond.get(), C->getBeginLoc(), C->getLParenLoc(),
8324       C->getNameModifierLoc(), C->getColonLoc(), C->getEndLoc());
8325 }
8326 
8327 template <typename Derived>
8328 OMPClause *TreeTransform<Derived>::TransformOMPFinalClause(OMPFinalClause *C) {
8329   ExprResult Cond = getDerived().TransformExpr(C->getCondition());
8330   if (Cond.isInvalid())
8331     return nullptr;
8332   return getDerived().RebuildOMPFinalClause(Cond.get(), C->getBeginLoc(),
8333                                             C->getLParenLoc(), C->getEndLoc());
8334 }
8335 
8336 template <typename Derived>
8337 OMPClause *
8338 TreeTransform<Derived>::TransformOMPNumThreadsClause(OMPNumThreadsClause *C) {
8339   ExprResult NumThreads = getDerived().TransformExpr(C->getNumThreads());
8340   if (NumThreads.isInvalid())
8341     return nullptr;
8342   return getDerived().RebuildOMPNumThreadsClause(
8343       NumThreads.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8344 }
8345 
8346 template <typename Derived>
8347 OMPClause *
8348 TreeTransform<Derived>::TransformOMPSafelenClause(OMPSafelenClause *C) {
8349   ExprResult E = getDerived().TransformExpr(C->getSafelen());
8350   if (E.isInvalid())
8351     return nullptr;
8352   return getDerived().RebuildOMPSafelenClause(
8353       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8354 }
8355 
8356 template <typename Derived>
8357 OMPClause *
8358 TreeTransform<Derived>::TransformOMPAllocatorClause(OMPAllocatorClause *C) {
8359   ExprResult E = getDerived().TransformExpr(C->getAllocator());
8360   if (E.isInvalid())
8361     return nullptr;
8362   return getDerived().RebuildOMPAllocatorClause(
8363       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8364 }
8365 
8366 template <typename Derived>
8367 OMPClause *
8368 TreeTransform<Derived>::TransformOMPSimdlenClause(OMPSimdlenClause *C) {
8369   ExprResult E = getDerived().TransformExpr(C->getSimdlen());
8370   if (E.isInvalid())
8371     return nullptr;
8372   return getDerived().RebuildOMPSimdlenClause(
8373       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8374 }
8375 
8376 template <typename Derived>
8377 OMPClause *
8378 TreeTransform<Derived>::TransformOMPCollapseClause(OMPCollapseClause *C) {
8379   ExprResult E = getDerived().TransformExpr(C->getNumForLoops());
8380   if (E.isInvalid())
8381     return nullptr;
8382   return getDerived().RebuildOMPCollapseClause(
8383       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8384 }
8385 
8386 template <typename Derived>
8387 OMPClause *
8388 TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) {
8389   return getDerived().RebuildOMPDefaultClause(
8390       C->getDefaultKind(), C->getDefaultKindKwLoc(), C->getBeginLoc(),
8391       C->getLParenLoc(), C->getEndLoc());
8392 }
8393 
8394 template <typename Derived>
8395 OMPClause *
8396 TreeTransform<Derived>::TransformOMPProcBindClause(OMPProcBindClause *C) {
8397   return getDerived().RebuildOMPProcBindClause(
8398       C->getProcBindKind(), C->getProcBindKindKwLoc(), C->getBeginLoc(),
8399       C->getLParenLoc(), C->getEndLoc());
8400 }
8401 
8402 template <typename Derived>
8403 OMPClause *
8404 TreeTransform<Derived>::TransformOMPScheduleClause(OMPScheduleClause *C) {
8405   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8406   if (E.isInvalid())
8407     return nullptr;
8408   return getDerived().RebuildOMPScheduleClause(
8409       C->getFirstScheduleModifier(), C->getSecondScheduleModifier(),
8410       C->getScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8411       C->getFirstScheduleModifierLoc(), C->getSecondScheduleModifierLoc(),
8412       C->getScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8413 }
8414 
8415 template <typename Derived>
8416 OMPClause *
8417 TreeTransform<Derived>::TransformOMPOrderedClause(OMPOrderedClause *C) {
8418   ExprResult E;
8419   if (auto *Num = C->getNumForLoops()) {
8420     E = getDerived().TransformExpr(Num);
8421     if (E.isInvalid())
8422       return nullptr;
8423   }
8424   return getDerived().RebuildOMPOrderedClause(C->getBeginLoc(), C->getEndLoc(),
8425                                               C->getLParenLoc(), E.get());
8426 }
8427 
8428 template <typename Derived>
8429 OMPClause *
8430 TreeTransform<Derived>::TransformOMPNowaitClause(OMPNowaitClause *C) {
8431   // No need to rebuild this clause, no template-dependent parameters.
8432   return C;
8433 }
8434 
8435 template <typename Derived>
8436 OMPClause *
8437 TreeTransform<Derived>::TransformOMPUntiedClause(OMPUntiedClause *C) {
8438   // No need to rebuild this clause, no template-dependent parameters.
8439   return C;
8440 }
8441 
8442 template <typename Derived>
8443 OMPClause *
8444 TreeTransform<Derived>::TransformOMPMergeableClause(OMPMergeableClause *C) {
8445   // No need to rebuild this clause, no template-dependent parameters.
8446   return C;
8447 }
8448 
8449 template <typename Derived>
8450 OMPClause *TreeTransform<Derived>::TransformOMPReadClause(OMPReadClause *C) {
8451   // No need to rebuild this clause, no template-dependent parameters.
8452   return C;
8453 }
8454 
8455 template <typename Derived>
8456 OMPClause *TreeTransform<Derived>::TransformOMPWriteClause(OMPWriteClause *C) {
8457   // No need to rebuild this clause, no template-dependent parameters.
8458   return C;
8459 }
8460 
8461 template <typename Derived>
8462 OMPClause *
8463 TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
8464   // No need to rebuild this clause, no template-dependent parameters.
8465   return C;
8466 }
8467 
8468 template <typename Derived>
8469 OMPClause *
8470 TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
8471   // No need to rebuild this clause, no template-dependent parameters.
8472   return C;
8473 }
8474 
8475 template <typename Derived>
8476 OMPClause *
8477 TreeTransform<Derived>::TransformOMPSeqCstClause(OMPSeqCstClause *C) {
8478   // No need to rebuild this clause, no template-dependent parameters.
8479   return C;
8480 }
8481 
8482 template <typename Derived>
8483 OMPClause *
8484 TreeTransform<Derived>::TransformOMPThreadsClause(OMPThreadsClause *C) {
8485   // No need to rebuild this clause, no template-dependent parameters.
8486   return C;
8487 }
8488 
8489 template <typename Derived>
8490 OMPClause *TreeTransform<Derived>::TransformOMPSIMDClause(OMPSIMDClause *C) {
8491   // No need to rebuild this clause, no template-dependent parameters.
8492   return C;
8493 }
8494 
8495 template <typename Derived>
8496 OMPClause *
8497 TreeTransform<Derived>::TransformOMPNogroupClause(OMPNogroupClause *C) {
8498   // No need to rebuild this clause, no template-dependent parameters.
8499   return C;
8500 }
8501 
8502 template <typename Derived>
8503 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedAddressClause(
8504     OMPUnifiedAddressClause *C) {
8505   llvm_unreachable("unified_address clause cannot appear in dependent context");
8506 }
8507 
8508 template <typename Derived>
8509 OMPClause *TreeTransform<Derived>::TransformOMPUnifiedSharedMemoryClause(
8510     OMPUnifiedSharedMemoryClause *C) {
8511   llvm_unreachable(
8512       "unified_shared_memory clause cannot appear in dependent context");
8513 }
8514 
8515 template <typename Derived>
8516 OMPClause *TreeTransform<Derived>::TransformOMPReverseOffloadClause(
8517     OMPReverseOffloadClause *C) {
8518   llvm_unreachable("reverse_offload clause cannot appear in dependent context");
8519 }
8520 
8521 template <typename Derived>
8522 OMPClause *TreeTransform<Derived>::TransformOMPDynamicAllocatorsClause(
8523     OMPDynamicAllocatorsClause *C) {
8524   llvm_unreachable(
8525       "dynamic_allocators clause cannot appear in dependent context");
8526 }
8527 
8528 template <typename Derived>
8529 OMPClause *TreeTransform<Derived>::TransformOMPAtomicDefaultMemOrderClause(
8530     OMPAtomicDefaultMemOrderClause *C) {
8531   llvm_unreachable(
8532       "atomic_default_mem_order clause cannot appear in dependent context");
8533 }
8534 
8535 template <typename Derived>
8536 OMPClause *
8537 TreeTransform<Derived>::TransformOMPPrivateClause(OMPPrivateClause *C) {
8538   llvm::SmallVector<Expr *, 16> Vars;
8539   Vars.reserve(C->varlist_size());
8540   for (auto *VE : C->varlists()) {
8541     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8542     if (EVar.isInvalid())
8543       return nullptr;
8544     Vars.push_back(EVar.get());
8545   }
8546   return getDerived().RebuildOMPPrivateClause(
8547       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8548 }
8549 
8550 template <typename Derived>
8551 OMPClause *TreeTransform<Derived>::TransformOMPFirstprivateClause(
8552     OMPFirstprivateClause *C) {
8553   llvm::SmallVector<Expr *, 16> Vars;
8554   Vars.reserve(C->varlist_size());
8555   for (auto *VE : C->varlists()) {
8556     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8557     if (EVar.isInvalid())
8558       return nullptr;
8559     Vars.push_back(EVar.get());
8560   }
8561   return getDerived().RebuildOMPFirstprivateClause(
8562       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8563 }
8564 
8565 template <typename Derived>
8566 OMPClause *
8567 TreeTransform<Derived>::TransformOMPLastprivateClause(OMPLastprivateClause *C) {
8568   llvm::SmallVector<Expr *, 16> Vars;
8569   Vars.reserve(C->varlist_size());
8570   for (auto *VE : C->varlists()) {
8571     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8572     if (EVar.isInvalid())
8573       return nullptr;
8574     Vars.push_back(EVar.get());
8575   }
8576   return getDerived().RebuildOMPLastprivateClause(
8577       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8578 }
8579 
8580 template <typename Derived>
8581 OMPClause *
8582 TreeTransform<Derived>::TransformOMPSharedClause(OMPSharedClause *C) {
8583   llvm::SmallVector<Expr *, 16> Vars;
8584   Vars.reserve(C->varlist_size());
8585   for (auto *VE : C->varlists()) {
8586     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8587     if (EVar.isInvalid())
8588       return nullptr;
8589     Vars.push_back(EVar.get());
8590   }
8591   return getDerived().RebuildOMPSharedClause(Vars, C->getBeginLoc(),
8592                                              C->getLParenLoc(), C->getEndLoc());
8593 }
8594 
8595 template <typename Derived>
8596 OMPClause *
8597 TreeTransform<Derived>::TransformOMPReductionClause(OMPReductionClause *C) {
8598   llvm::SmallVector<Expr *, 16> Vars;
8599   Vars.reserve(C->varlist_size());
8600   for (auto *VE : C->varlists()) {
8601     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8602     if (EVar.isInvalid())
8603       return nullptr;
8604     Vars.push_back(EVar.get());
8605   }
8606   CXXScopeSpec ReductionIdScopeSpec;
8607   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8608 
8609   DeclarationNameInfo NameInfo = C->getNameInfo();
8610   if (NameInfo.getName()) {
8611     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8612     if (!NameInfo.getName())
8613       return nullptr;
8614   }
8615   // Build a list of all UDR decls with the same names ranged by the Scopes.
8616   // The Scope boundary is a duplication of the previous decl.
8617   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8618   for (auto *E : C->reduction_ops()) {
8619     // Transform all the decls.
8620     if (E) {
8621       auto *ULE = cast<UnresolvedLookupExpr>(E);
8622       UnresolvedSet<8> Decls;
8623       for (auto *D : ULE->decls()) {
8624         NamedDecl *InstD =
8625             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8626         Decls.addDecl(InstD, InstD->getAccess());
8627       }
8628       UnresolvedReductions.push_back(
8629        UnresolvedLookupExpr::Create(
8630           SemaRef.Context, /*NamingClass=*/nullptr,
8631           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context),
8632           NameInfo, /*ADL=*/true, ULE->isOverloaded(),
8633           Decls.begin(), Decls.end()));
8634     } else
8635       UnresolvedReductions.push_back(nullptr);
8636   }
8637   return getDerived().RebuildOMPReductionClause(
8638       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8639       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8640 }
8641 
8642 template <typename Derived>
8643 OMPClause *TreeTransform<Derived>::TransformOMPTaskReductionClause(
8644     OMPTaskReductionClause *C) {
8645   llvm::SmallVector<Expr *, 16> Vars;
8646   Vars.reserve(C->varlist_size());
8647   for (auto *VE : C->varlists()) {
8648     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8649     if (EVar.isInvalid())
8650       return nullptr;
8651     Vars.push_back(EVar.get());
8652   }
8653   CXXScopeSpec ReductionIdScopeSpec;
8654   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8655 
8656   DeclarationNameInfo NameInfo = C->getNameInfo();
8657   if (NameInfo.getName()) {
8658     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8659     if (!NameInfo.getName())
8660       return nullptr;
8661   }
8662   // Build a list of all UDR decls with the same names ranged by the Scopes.
8663   // The Scope boundary is a duplication of the previous decl.
8664   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8665   for (auto *E : C->reduction_ops()) {
8666     // Transform all the decls.
8667     if (E) {
8668       auto *ULE = cast<UnresolvedLookupExpr>(E);
8669       UnresolvedSet<8> Decls;
8670       for (auto *D : ULE->decls()) {
8671         NamedDecl *InstD =
8672             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8673         Decls.addDecl(InstD, InstD->getAccess());
8674       }
8675       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8676           SemaRef.Context, /*NamingClass=*/nullptr,
8677           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8678           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8679     } else
8680       UnresolvedReductions.push_back(nullptr);
8681   }
8682   return getDerived().RebuildOMPTaskReductionClause(
8683       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8684       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8685 }
8686 
8687 template <typename Derived>
8688 OMPClause *
8689 TreeTransform<Derived>::TransformOMPInReductionClause(OMPInReductionClause *C) {
8690   llvm::SmallVector<Expr *, 16> Vars;
8691   Vars.reserve(C->varlist_size());
8692   for (auto *VE : C->varlists()) {
8693     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8694     if (EVar.isInvalid())
8695       return nullptr;
8696     Vars.push_back(EVar.get());
8697   }
8698   CXXScopeSpec ReductionIdScopeSpec;
8699   ReductionIdScopeSpec.Adopt(C->getQualifierLoc());
8700 
8701   DeclarationNameInfo NameInfo = C->getNameInfo();
8702   if (NameInfo.getName()) {
8703     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
8704     if (!NameInfo.getName())
8705       return nullptr;
8706   }
8707   // Build a list of all UDR decls with the same names ranged by the Scopes.
8708   // The Scope boundary is a duplication of the previous decl.
8709   llvm::SmallVector<Expr *, 16> UnresolvedReductions;
8710   for (auto *E : C->reduction_ops()) {
8711     // Transform all the decls.
8712     if (E) {
8713       auto *ULE = cast<UnresolvedLookupExpr>(E);
8714       UnresolvedSet<8> Decls;
8715       for (auto *D : ULE->decls()) {
8716         NamedDecl *InstD =
8717             cast<NamedDecl>(getDerived().TransformDecl(E->getExprLoc(), D));
8718         Decls.addDecl(InstD, InstD->getAccess());
8719       }
8720       UnresolvedReductions.push_back(UnresolvedLookupExpr::Create(
8721           SemaRef.Context, /*NamingClass=*/nullptr,
8722           ReductionIdScopeSpec.getWithLocInContext(SemaRef.Context), NameInfo,
8723           /*ADL=*/true, ULE->isOverloaded(), Decls.begin(), Decls.end()));
8724     } else
8725       UnresolvedReductions.push_back(nullptr);
8726   }
8727   return getDerived().RebuildOMPInReductionClause(
8728       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getColonLoc(),
8729       C->getEndLoc(), ReductionIdScopeSpec, NameInfo, UnresolvedReductions);
8730 }
8731 
8732 template <typename Derived>
8733 OMPClause *
8734 TreeTransform<Derived>::TransformOMPLinearClause(OMPLinearClause *C) {
8735   llvm::SmallVector<Expr *, 16> Vars;
8736   Vars.reserve(C->varlist_size());
8737   for (auto *VE : C->varlists()) {
8738     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8739     if (EVar.isInvalid())
8740       return nullptr;
8741     Vars.push_back(EVar.get());
8742   }
8743   ExprResult Step = getDerived().TransformExpr(C->getStep());
8744   if (Step.isInvalid())
8745     return nullptr;
8746   return getDerived().RebuildOMPLinearClause(
8747       Vars, Step.get(), C->getBeginLoc(), C->getLParenLoc(), C->getModifier(),
8748       C->getModifierLoc(), C->getColonLoc(), C->getEndLoc());
8749 }
8750 
8751 template <typename Derived>
8752 OMPClause *
8753 TreeTransform<Derived>::TransformOMPAlignedClause(OMPAlignedClause *C) {
8754   llvm::SmallVector<Expr *, 16> Vars;
8755   Vars.reserve(C->varlist_size());
8756   for (auto *VE : C->varlists()) {
8757     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8758     if (EVar.isInvalid())
8759       return nullptr;
8760     Vars.push_back(EVar.get());
8761   }
8762   ExprResult Alignment = getDerived().TransformExpr(C->getAlignment());
8763   if (Alignment.isInvalid())
8764     return nullptr;
8765   return getDerived().RebuildOMPAlignedClause(
8766       Vars, Alignment.get(), C->getBeginLoc(), C->getLParenLoc(),
8767       C->getColonLoc(), C->getEndLoc());
8768 }
8769 
8770 template <typename Derived>
8771 OMPClause *
8772 TreeTransform<Derived>::TransformOMPCopyinClause(OMPCopyinClause *C) {
8773   llvm::SmallVector<Expr *, 16> Vars;
8774   Vars.reserve(C->varlist_size());
8775   for (auto *VE : C->varlists()) {
8776     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8777     if (EVar.isInvalid())
8778       return nullptr;
8779     Vars.push_back(EVar.get());
8780   }
8781   return getDerived().RebuildOMPCopyinClause(Vars, C->getBeginLoc(),
8782                                              C->getLParenLoc(), C->getEndLoc());
8783 }
8784 
8785 template <typename Derived>
8786 OMPClause *
8787 TreeTransform<Derived>::TransformOMPCopyprivateClause(OMPCopyprivateClause *C) {
8788   llvm::SmallVector<Expr *, 16> Vars;
8789   Vars.reserve(C->varlist_size());
8790   for (auto *VE : C->varlists()) {
8791     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8792     if (EVar.isInvalid())
8793       return nullptr;
8794     Vars.push_back(EVar.get());
8795   }
8796   return getDerived().RebuildOMPCopyprivateClause(
8797       Vars, C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8798 }
8799 
8800 template <typename Derived>
8801 OMPClause *TreeTransform<Derived>::TransformOMPFlushClause(OMPFlushClause *C) {
8802   llvm::SmallVector<Expr *, 16> Vars;
8803   Vars.reserve(C->varlist_size());
8804   for (auto *VE : C->varlists()) {
8805     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8806     if (EVar.isInvalid())
8807       return nullptr;
8808     Vars.push_back(EVar.get());
8809   }
8810   return getDerived().RebuildOMPFlushClause(Vars, C->getBeginLoc(),
8811                                             C->getLParenLoc(), C->getEndLoc());
8812 }
8813 
8814 template <typename Derived>
8815 OMPClause *
8816 TreeTransform<Derived>::TransformOMPDependClause(OMPDependClause *C) {
8817   llvm::SmallVector<Expr *, 16> Vars;
8818   Vars.reserve(C->varlist_size());
8819   for (auto *VE : C->varlists()) {
8820     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
8821     if (EVar.isInvalid())
8822       return nullptr;
8823     Vars.push_back(EVar.get());
8824   }
8825   return getDerived().RebuildOMPDependClause(
8826       C->getDependencyKind(), C->getDependencyLoc(), C->getColonLoc(), Vars,
8827       C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8828 }
8829 
8830 template <typename Derived>
8831 OMPClause *
8832 TreeTransform<Derived>::TransformOMPDeviceClause(OMPDeviceClause *C) {
8833   ExprResult E = getDerived().TransformExpr(C->getDevice());
8834   if (E.isInvalid())
8835     return nullptr;
8836   return getDerived().RebuildOMPDeviceClause(E.get(), C->getBeginLoc(),
8837                                              C->getLParenLoc(), C->getEndLoc());
8838 }
8839 
8840 template <typename Derived, class T>
8841 bool transformOMPMappableExprListClause(
8842     TreeTransform<Derived> &TT, OMPMappableExprListClause<T> *C,
8843     llvm::SmallVectorImpl<Expr *> &Vars, CXXScopeSpec &MapperIdScopeSpec,
8844     DeclarationNameInfo &MapperIdInfo,
8845     llvm::SmallVectorImpl<Expr *> &UnresolvedMappers) {
8846   // Transform expressions in the list.
8847   Vars.reserve(C->varlist_size());
8848   for (auto *VE : C->varlists()) {
8849     ExprResult EVar = TT.getDerived().TransformExpr(cast<Expr>(VE));
8850     if (EVar.isInvalid())
8851       return true;
8852     Vars.push_back(EVar.get());
8853   }
8854   // Transform mapper scope specifier and identifier.
8855   NestedNameSpecifierLoc QualifierLoc;
8856   if (C->getMapperQualifierLoc()) {
8857     QualifierLoc = TT.getDerived().TransformNestedNameSpecifierLoc(
8858         C->getMapperQualifierLoc());
8859     if (!QualifierLoc)
8860       return true;
8861   }
8862   MapperIdScopeSpec.Adopt(QualifierLoc);
8863   MapperIdInfo = C->getMapperIdInfo();
8864   if (MapperIdInfo.getName()) {
8865     MapperIdInfo = TT.getDerived().TransformDeclarationNameInfo(MapperIdInfo);
8866     if (!MapperIdInfo.getName())
8867       return true;
8868   }
8869   // Build a list of all candidate OMPDeclareMapperDecls, which is provided by
8870   // the previous user-defined mapper lookup in dependent environment.
8871   for (auto *E : C->mapperlists()) {
8872     // Transform all the decls.
8873     if (E) {
8874       auto *ULE = cast<UnresolvedLookupExpr>(E);
8875       UnresolvedSet<8> Decls;
8876       for (auto *D : ULE->decls()) {
8877         NamedDecl *InstD =
8878             cast<NamedDecl>(TT.getDerived().TransformDecl(E->getExprLoc(), D));
8879         Decls.addDecl(InstD, InstD->getAccess());
8880       }
8881       UnresolvedMappers.push_back(UnresolvedLookupExpr::Create(
8882           TT.getSema().Context, /*NamingClass=*/nullptr,
8883           MapperIdScopeSpec.getWithLocInContext(TT.getSema().Context),
8884           MapperIdInfo, /*ADL=*/true, ULE->isOverloaded(), Decls.begin(),
8885           Decls.end()));
8886     } else {
8887       UnresolvedMappers.push_back(nullptr);
8888     }
8889   }
8890   return false;
8891 }
8892 
8893 template <typename Derived>
8894 OMPClause *TreeTransform<Derived>::TransformOMPMapClause(OMPMapClause *C) {
8895   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8896   llvm::SmallVector<Expr *, 16> Vars;
8897   CXXScopeSpec MapperIdScopeSpec;
8898   DeclarationNameInfo MapperIdInfo;
8899   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
8900   if (transformOMPMappableExprListClause<Derived, OMPMapClause>(
8901           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
8902     return nullptr;
8903   return getDerived().RebuildOMPMapClause(
8904       C->getMapTypeModifiers(), C->getMapTypeModifiersLoc(), MapperIdScopeSpec,
8905       MapperIdInfo, C->getMapType(), C->isImplicitMapType(), C->getMapLoc(),
8906       C->getColonLoc(), Vars, Locs, UnresolvedMappers);
8907 }
8908 
8909 template <typename Derived>
8910 OMPClause *
8911 TreeTransform<Derived>::TransformOMPNumTeamsClause(OMPNumTeamsClause *C) {
8912   ExprResult E = getDerived().TransformExpr(C->getNumTeams());
8913   if (E.isInvalid())
8914     return nullptr;
8915   return getDerived().RebuildOMPNumTeamsClause(
8916       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8917 }
8918 
8919 template <typename Derived>
8920 OMPClause *
8921 TreeTransform<Derived>::TransformOMPThreadLimitClause(OMPThreadLimitClause *C) {
8922   ExprResult E = getDerived().TransformExpr(C->getThreadLimit());
8923   if (E.isInvalid())
8924     return nullptr;
8925   return getDerived().RebuildOMPThreadLimitClause(
8926       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8927 }
8928 
8929 template <typename Derived>
8930 OMPClause *
8931 TreeTransform<Derived>::TransformOMPPriorityClause(OMPPriorityClause *C) {
8932   ExprResult E = getDerived().TransformExpr(C->getPriority());
8933   if (E.isInvalid())
8934     return nullptr;
8935   return getDerived().RebuildOMPPriorityClause(
8936       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8937 }
8938 
8939 template <typename Derived>
8940 OMPClause *
8941 TreeTransform<Derived>::TransformOMPGrainsizeClause(OMPGrainsizeClause *C) {
8942   ExprResult E = getDerived().TransformExpr(C->getGrainsize());
8943   if (E.isInvalid())
8944     return nullptr;
8945   return getDerived().RebuildOMPGrainsizeClause(
8946       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8947 }
8948 
8949 template <typename Derived>
8950 OMPClause *
8951 TreeTransform<Derived>::TransformOMPNumTasksClause(OMPNumTasksClause *C) {
8952   ExprResult E = getDerived().TransformExpr(C->getNumTasks());
8953   if (E.isInvalid())
8954     return nullptr;
8955   return getDerived().RebuildOMPNumTasksClause(
8956       E.get(), C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8957 }
8958 
8959 template <typename Derived>
8960 OMPClause *TreeTransform<Derived>::TransformOMPHintClause(OMPHintClause *C) {
8961   ExprResult E = getDerived().TransformExpr(C->getHint());
8962   if (E.isInvalid())
8963     return nullptr;
8964   return getDerived().RebuildOMPHintClause(E.get(), C->getBeginLoc(),
8965                                            C->getLParenLoc(), C->getEndLoc());
8966 }
8967 
8968 template <typename Derived>
8969 OMPClause *TreeTransform<Derived>::TransformOMPDistScheduleClause(
8970     OMPDistScheduleClause *C) {
8971   ExprResult E = getDerived().TransformExpr(C->getChunkSize());
8972   if (E.isInvalid())
8973     return nullptr;
8974   return getDerived().RebuildOMPDistScheduleClause(
8975       C->getDistScheduleKind(), E.get(), C->getBeginLoc(), C->getLParenLoc(),
8976       C->getDistScheduleKindLoc(), C->getCommaLoc(), C->getEndLoc());
8977 }
8978 
8979 template <typename Derived>
8980 OMPClause *
8981 TreeTransform<Derived>::TransformOMPDefaultmapClause(OMPDefaultmapClause *C) {
8982   return C;
8983 }
8984 
8985 template <typename Derived>
8986 OMPClause *TreeTransform<Derived>::TransformOMPToClause(OMPToClause *C) {
8987   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
8988   llvm::SmallVector<Expr *, 16> Vars;
8989   CXXScopeSpec MapperIdScopeSpec;
8990   DeclarationNameInfo MapperIdInfo;
8991   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
8992   if (transformOMPMappableExprListClause<Derived, OMPToClause>(
8993           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
8994     return nullptr;
8995   return getDerived().RebuildOMPToClause(Vars, MapperIdScopeSpec, MapperIdInfo,
8996                                          Locs, UnresolvedMappers);
8997 }
8998 
8999 template <typename Derived>
9000 OMPClause *TreeTransform<Derived>::TransformOMPFromClause(OMPFromClause *C) {
9001   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9002   llvm::SmallVector<Expr *, 16> Vars;
9003   CXXScopeSpec MapperIdScopeSpec;
9004   DeclarationNameInfo MapperIdInfo;
9005   llvm::SmallVector<Expr *, 16> UnresolvedMappers;
9006   if (transformOMPMappableExprListClause<Derived, OMPFromClause>(
9007           *this, C, Vars, MapperIdScopeSpec, MapperIdInfo, UnresolvedMappers))
9008     return nullptr;
9009   return getDerived().RebuildOMPFromClause(
9010       Vars, MapperIdScopeSpec, MapperIdInfo, Locs, UnresolvedMappers);
9011 }
9012 
9013 template <typename Derived>
9014 OMPClause *TreeTransform<Derived>::TransformOMPUseDevicePtrClause(
9015     OMPUseDevicePtrClause *C) {
9016   llvm::SmallVector<Expr *, 16> Vars;
9017   Vars.reserve(C->varlist_size());
9018   for (auto *VE : C->varlists()) {
9019     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9020     if (EVar.isInvalid())
9021       return nullptr;
9022     Vars.push_back(EVar.get());
9023   }
9024   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9025   return getDerived().RebuildOMPUseDevicePtrClause(Vars, Locs);
9026 }
9027 
9028 template <typename Derived>
9029 OMPClause *
9030 TreeTransform<Derived>::TransformOMPIsDevicePtrClause(OMPIsDevicePtrClause *C) {
9031   llvm::SmallVector<Expr *, 16> Vars;
9032   Vars.reserve(C->varlist_size());
9033   for (auto *VE : C->varlists()) {
9034     ExprResult EVar = getDerived().TransformExpr(cast<Expr>(VE));
9035     if (EVar.isInvalid())
9036       return nullptr;
9037     Vars.push_back(EVar.get());
9038   }
9039   OMPVarListLocTy Locs(C->getBeginLoc(), C->getLParenLoc(), C->getEndLoc());
9040   return getDerived().RebuildOMPIsDevicePtrClause(Vars, Locs);
9041 }
9042 
9043 //===----------------------------------------------------------------------===//
9044 // Expression transformation
9045 //===----------------------------------------------------------------------===//
9046 template<typename Derived>
9047 ExprResult
9048 TreeTransform<Derived>::TransformConstantExpr(ConstantExpr *E) {
9049   return TransformExpr(E->getSubExpr());
9050 }
9051 
9052 template<typename Derived>
9053 ExprResult
9054 TreeTransform<Derived>::TransformPredefinedExpr(PredefinedExpr *E) {
9055   if (!E->isTypeDependent())
9056     return E;
9057 
9058   return getDerived().RebuildPredefinedExpr(E->getLocation(),
9059                                             E->getIdentKind());
9060 }
9061 
9062 template<typename Derived>
9063 ExprResult
9064 TreeTransform<Derived>::TransformDeclRefExpr(DeclRefExpr *E) {
9065   NestedNameSpecifierLoc QualifierLoc;
9066   if (E->getQualifierLoc()) {
9067     QualifierLoc
9068       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9069     if (!QualifierLoc)
9070       return ExprError();
9071   }
9072 
9073   ValueDecl *ND
9074     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getLocation(),
9075                                                          E->getDecl()));
9076   if (!ND)
9077     return ExprError();
9078 
9079   DeclarationNameInfo NameInfo = E->getNameInfo();
9080   if (NameInfo.getName()) {
9081     NameInfo = getDerived().TransformDeclarationNameInfo(NameInfo);
9082     if (!NameInfo.getName())
9083       return ExprError();
9084   }
9085 
9086   if (!getDerived().AlwaysRebuild() &&
9087       QualifierLoc == E->getQualifierLoc() &&
9088       ND == E->getDecl() &&
9089       NameInfo.getName() == E->getDecl()->getDeclName() &&
9090       !E->hasExplicitTemplateArgs()) {
9091 
9092     // Mark it referenced in the new context regardless.
9093     // FIXME: this is a bit instantiation-specific.
9094     SemaRef.MarkDeclRefReferenced(E);
9095 
9096     return E;
9097   }
9098 
9099   TemplateArgumentListInfo TransArgs, *TemplateArgs = nullptr;
9100   if (E->hasExplicitTemplateArgs()) {
9101     TemplateArgs = &TransArgs;
9102     TransArgs.setLAngleLoc(E->getLAngleLoc());
9103     TransArgs.setRAngleLoc(E->getRAngleLoc());
9104     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9105                                                 E->getNumTemplateArgs(),
9106                                                 TransArgs))
9107       return ExprError();
9108   }
9109 
9110   return getDerived().RebuildDeclRefExpr(QualifierLoc, ND, NameInfo,
9111                                          TemplateArgs);
9112 }
9113 
9114 template<typename Derived>
9115 ExprResult
9116 TreeTransform<Derived>::TransformIntegerLiteral(IntegerLiteral *E) {
9117   return E;
9118 }
9119 
9120 template <typename Derived>
9121 ExprResult TreeTransform<Derived>::TransformFixedPointLiteral(
9122     FixedPointLiteral *E) {
9123   return E;
9124 }
9125 
9126 template<typename Derived>
9127 ExprResult
9128 TreeTransform<Derived>::TransformFloatingLiteral(FloatingLiteral *E) {
9129   return E;
9130 }
9131 
9132 template<typename Derived>
9133 ExprResult
9134 TreeTransform<Derived>::TransformImaginaryLiteral(ImaginaryLiteral *E) {
9135   return E;
9136 }
9137 
9138 template<typename Derived>
9139 ExprResult
9140 TreeTransform<Derived>::TransformStringLiteral(StringLiteral *E) {
9141   return E;
9142 }
9143 
9144 template<typename Derived>
9145 ExprResult
9146 TreeTransform<Derived>::TransformCharacterLiteral(CharacterLiteral *E) {
9147   return E;
9148 }
9149 
9150 template<typename Derived>
9151 ExprResult
9152 TreeTransform<Derived>::TransformUserDefinedLiteral(UserDefinedLiteral *E) {
9153   if (FunctionDecl *FD = E->getDirectCallee())
9154     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), FD);
9155   return SemaRef.MaybeBindToTemporary(E);
9156 }
9157 
9158 template<typename Derived>
9159 ExprResult
9160 TreeTransform<Derived>::TransformGenericSelectionExpr(GenericSelectionExpr *E) {
9161   ExprResult ControllingExpr =
9162     getDerived().TransformExpr(E->getControllingExpr());
9163   if (ControllingExpr.isInvalid())
9164     return ExprError();
9165 
9166   SmallVector<Expr *, 4> AssocExprs;
9167   SmallVector<TypeSourceInfo *, 4> AssocTypes;
9168   for (const GenericSelectionExpr::Association &Assoc : E->associations()) {
9169     TypeSourceInfo *TSI = Assoc.getTypeSourceInfo();
9170     if (TSI) {
9171       TypeSourceInfo *AssocType = getDerived().TransformType(TSI);
9172       if (!AssocType)
9173         return ExprError();
9174       AssocTypes.push_back(AssocType);
9175     } else {
9176       AssocTypes.push_back(nullptr);
9177     }
9178 
9179     ExprResult AssocExpr =
9180         getDerived().TransformExpr(Assoc.getAssociationExpr());
9181     if (AssocExpr.isInvalid())
9182       return ExprError();
9183     AssocExprs.push_back(AssocExpr.get());
9184   }
9185 
9186   return getDerived().RebuildGenericSelectionExpr(E->getGenericLoc(),
9187                                                   E->getDefaultLoc(),
9188                                                   E->getRParenLoc(),
9189                                                   ControllingExpr.get(),
9190                                                   AssocTypes,
9191                                                   AssocExprs);
9192 }
9193 
9194 template<typename Derived>
9195 ExprResult
9196 TreeTransform<Derived>::TransformParenExpr(ParenExpr *E) {
9197   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9198   if (SubExpr.isInvalid())
9199     return ExprError();
9200 
9201   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9202     return E;
9203 
9204   return getDerived().RebuildParenExpr(SubExpr.get(), E->getLParen(),
9205                                        E->getRParen());
9206 }
9207 
9208 /// The operand of a unary address-of operator has special rules: it's
9209 /// allowed to refer to a non-static member of a class even if there's no 'this'
9210 /// object available.
9211 template<typename Derived>
9212 ExprResult
9213 TreeTransform<Derived>::TransformAddressOfOperand(Expr *E) {
9214   if (DependentScopeDeclRefExpr *DRE = dyn_cast<DependentScopeDeclRefExpr>(E))
9215     return getDerived().TransformDependentScopeDeclRefExpr(DRE, true, nullptr);
9216   else
9217     return getDerived().TransformExpr(E);
9218 }
9219 
9220 template<typename Derived>
9221 ExprResult
9222 TreeTransform<Derived>::TransformUnaryOperator(UnaryOperator *E) {
9223   ExprResult SubExpr;
9224   if (E->getOpcode() == UO_AddrOf)
9225     SubExpr = TransformAddressOfOperand(E->getSubExpr());
9226   else
9227     SubExpr = TransformExpr(E->getSubExpr());
9228   if (SubExpr.isInvalid())
9229     return ExprError();
9230 
9231   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getSubExpr())
9232     return E;
9233 
9234   return getDerived().RebuildUnaryOperator(E->getOperatorLoc(),
9235                                            E->getOpcode(),
9236                                            SubExpr.get());
9237 }
9238 
9239 template<typename Derived>
9240 ExprResult
9241 TreeTransform<Derived>::TransformOffsetOfExpr(OffsetOfExpr *E) {
9242   // Transform the type.
9243   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
9244   if (!Type)
9245     return ExprError();
9246 
9247   // Transform all of the components into components similar to what the
9248   // parser uses.
9249   // FIXME: It would be slightly more efficient in the non-dependent case to
9250   // just map FieldDecls, rather than requiring the rebuilder to look for
9251   // the fields again. However, __builtin_offsetof is rare enough in
9252   // template code that we don't care.
9253   bool ExprChanged = false;
9254   typedef Sema::OffsetOfComponent Component;
9255   SmallVector<Component, 4> Components;
9256   for (unsigned I = 0, N = E->getNumComponents(); I != N; ++I) {
9257     const OffsetOfNode &ON = E->getComponent(I);
9258     Component Comp;
9259     Comp.isBrackets = true;
9260     Comp.LocStart = ON.getSourceRange().getBegin();
9261     Comp.LocEnd = ON.getSourceRange().getEnd();
9262     switch (ON.getKind()) {
9263     case OffsetOfNode::Array: {
9264       Expr *FromIndex = E->getIndexExpr(ON.getArrayExprIndex());
9265       ExprResult Index = getDerived().TransformExpr(FromIndex);
9266       if (Index.isInvalid())
9267         return ExprError();
9268 
9269       ExprChanged = ExprChanged || Index.get() != FromIndex;
9270       Comp.isBrackets = true;
9271       Comp.U.E = Index.get();
9272       break;
9273     }
9274 
9275     case OffsetOfNode::Field:
9276     case OffsetOfNode::Identifier:
9277       Comp.isBrackets = false;
9278       Comp.U.IdentInfo = ON.getFieldName();
9279       if (!Comp.U.IdentInfo)
9280         continue;
9281 
9282       break;
9283 
9284     case OffsetOfNode::Base:
9285       // Will be recomputed during the rebuild.
9286       continue;
9287     }
9288 
9289     Components.push_back(Comp);
9290   }
9291 
9292   // If nothing changed, retain the existing expression.
9293   if (!getDerived().AlwaysRebuild() &&
9294       Type == E->getTypeSourceInfo() &&
9295       !ExprChanged)
9296     return E;
9297 
9298   // Build a new offsetof expression.
9299   return getDerived().RebuildOffsetOfExpr(E->getOperatorLoc(), Type,
9300                                           Components, E->getRParenLoc());
9301 }
9302 
9303 template<typename Derived>
9304 ExprResult
9305 TreeTransform<Derived>::TransformOpaqueValueExpr(OpaqueValueExpr *E) {
9306   assert((!E->getSourceExpr() || getDerived().AlreadyTransformed(E->getType())) &&
9307          "opaque value expression requires transformation");
9308   return E;
9309 }
9310 
9311 template<typename Derived>
9312 ExprResult
9313 TreeTransform<Derived>::TransformTypoExpr(TypoExpr *E) {
9314   return E;
9315 }
9316 
9317 template<typename Derived>
9318 ExprResult
9319 TreeTransform<Derived>::TransformPseudoObjectExpr(PseudoObjectExpr *E) {
9320   // Rebuild the syntactic form.  The original syntactic form has
9321   // opaque-value expressions in it, so strip those away and rebuild
9322   // the result.  This is a really awful way of doing this, but the
9323   // better solution (rebuilding the semantic expressions and
9324   // rebinding OVEs as necessary) doesn't work; we'd need
9325   // TreeTransform to not strip away implicit conversions.
9326   Expr *newSyntacticForm = SemaRef.recreateSyntacticForm(E);
9327   ExprResult result = getDerived().TransformExpr(newSyntacticForm);
9328   if (result.isInvalid()) return ExprError();
9329 
9330   // If that gives us a pseudo-object result back, the pseudo-object
9331   // expression must have been an lvalue-to-rvalue conversion which we
9332   // should reapply.
9333   if (result.get()->hasPlaceholderType(BuiltinType::PseudoObject))
9334     result = SemaRef.checkPseudoObjectRValue(result.get());
9335 
9336   return result;
9337 }
9338 
9339 template<typename Derived>
9340 ExprResult
9341 TreeTransform<Derived>::TransformUnaryExprOrTypeTraitExpr(
9342                                                 UnaryExprOrTypeTraitExpr *E) {
9343   if (E->isArgumentType()) {
9344     TypeSourceInfo *OldT = E->getArgumentTypeInfo();
9345 
9346     TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9347     if (!NewT)
9348       return ExprError();
9349 
9350     if (!getDerived().AlwaysRebuild() && OldT == NewT)
9351       return E;
9352 
9353     return getDerived().RebuildUnaryExprOrTypeTrait(NewT, E->getOperatorLoc(),
9354                                                     E->getKind(),
9355                                                     E->getSourceRange());
9356   }
9357 
9358   // C++0x [expr.sizeof]p1:
9359   //   The operand is either an expression, which is an unevaluated operand
9360   //   [...]
9361   EnterExpressionEvaluationContext Unevaluated(
9362       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
9363       Sema::ReuseLambdaContextDecl);
9364 
9365   // Try to recover if we have something like sizeof(T::X) where X is a type.
9366   // Notably, there must be *exactly* one set of parens if X is a type.
9367   TypeSourceInfo *RecoveryTSI = nullptr;
9368   ExprResult SubExpr;
9369   auto *PE = dyn_cast<ParenExpr>(E->getArgumentExpr());
9370   if (auto *DRE =
9371           PE ? dyn_cast<DependentScopeDeclRefExpr>(PE->getSubExpr()) : nullptr)
9372     SubExpr = getDerived().TransformParenDependentScopeDeclRefExpr(
9373         PE, DRE, false, &RecoveryTSI);
9374   else
9375     SubExpr = getDerived().TransformExpr(E->getArgumentExpr());
9376 
9377   if (RecoveryTSI) {
9378     return getDerived().RebuildUnaryExprOrTypeTrait(
9379         RecoveryTSI, E->getOperatorLoc(), E->getKind(), E->getSourceRange());
9380   } else if (SubExpr.isInvalid())
9381     return ExprError();
9382 
9383   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getArgumentExpr())
9384     return E;
9385 
9386   return getDerived().RebuildUnaryExprOrTypeTrait(SubExpr.get(),
9387                                                   E->getOperatorLoc(),
9388                                                   E->getKind(),
9389                                                   E->getSourceRange());
9390 }
9391 
9392 template<typename Derived>
9393 ExprResult
9394 TreeTransform<Derived>::TransformArraySubscriptExpr(ArraySubscriptExpr *E) {
9395   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9396   if (LHS.isInvalid())
9397     return ExprError();
9398 
9399   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9400   if (RHS.isInvalid())
9401     return ExprError();
9402 
9403 
9404   if (!getDerived().AlwaysRebuild() &&
9405       LHS.get() == E->getLHS() &&
9406       RHS.get() == E->getRHS())
9407     return E;
9408 
9409   return getDerived().RebuildArraySubscriptExpr(
9410       LHS.get(),
9411       /*FIXME:*/ E->getLHS()->getBeginLoc(), RHS.get(), E->getRBracketLoc());
9412 }
9413 
9414 template <typename Derived>
9415 ExprResult
9416 TreeTransform<Derived>::TransformOMPArraySectionExpr(OMPArraySectionExpr *E) {
9417   ExprResult Base = getDerived().TransformExpr(E->getBase());
9418   if (Base.isInvalid())
9419     return ExprError();
9420 
9421   ExprResult LowerBound;
9422   if (E->getLowerBound()) {
9423     LowerBound = getDerived().TransformExpr(E->getLowerBound());
9424     if (LowerBound.isInvalid())
9425       return ExprError();
9426   }
9427 
9428   ExprResult Length;
9429   if (E->getLength()) {
9430     Length = getDerived().TransformExpr(E->getLength());
9431     if (Length.isInvalid())
9432       return ExprError();
9433   }
9434 
9435   if (!getDerived().AlwaysRebuild() && Base.get() == E->getBase() &&
9436       LowerBound.get() == E->getLowerBound() && Length.get() == E->getLength())
9437     return E;
9438 
9439   return getDerived().RebuildOMPArraySectionExpr(
9440       Base.get(), E->getBase()->getEndLoc(), LowerBound.get(), E->getColonLoc(),
9441       Length.get(), E->getRBracketLoc());
9442 }
9443 
9444 template<typename Derived>
9445 ExprResult
9446 TreeTransform<Derived>::TransformCallExpr(CallExpr *E) {
9447   // Transform the callee.
9448   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
9449   if (Callee.isInvalid())
9450     return ExprError();
9451 
9452   // Transform arguments.
9453   bool ArgChanged = false;
9454   SmallVector<Expr*, 8> Args;
9455   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
9456                                   &ArgChanged))
9457     return ExprError();
9458 
9459   if (!getDerived().AlwaysRebuild() &&
9460       Callee.get() == E->getCallee() &&
9461       !ArgChanged)
9462     return SemaRef.MaybeBindToTemporary(E);
9463 
9464   // FIXME: Wrong source location information for the '('.
9465   SourceLocation FakeLParenLoc
9466     = ((Expr *)Callee.get())->getSourceRange().getBegin();
9467   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
9468                                       Args,
9469                                       E->getRParenLoc());
9470 }
9471 
9472 template<typename Derived>
9473 ExprResult
9474 TreeTransform<Derived>::TransformMemberExpr(MemberExpr *E) {
9475   ExprResult Base = getDerived().TransformExpr(E->getBase());
9476   if (Base.isInvalid())
9477     return ExprError();
9478 
9479   NestedNameSpecifierLoc QualifierLoc;
9480   if (E->hasQualifier()) {
9481     QualifierLoc
9482       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
9483 
9484     if (!QualifierLoc)
9485       return ExprError();
9486   }
9487   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
9488 
9489   ValueDecl *Member
9490     = cast_or_null<ValueDecl>(getDerived().TransformDecl(E->getMemberLoc(),
9491                                                          E->getMemberDecl()));
9492   if (!Member)
9493     return ExprError();
9494 
9495   NamedDecl *FoundDecl = E->getFoundDecl();
9496   if (FoundDecl == E->getMemberDecl()) {
9497     FoundDecl = Member;
9498   } else {
9499     FoundDecl = cast_or_null<NamedDecl>(
9500                    getDerived().TransformDecl(E->getMemberLoc(), FoundDecl));
9501     if (!FoundDecl)
9502       return ExprError();
9503   }
9504 
9505   if (!getDerived().AlwaysRebuild() &&
9506       Base.get() == E->getBase() &&
9507       QualifierLoc == E->getQualifierLoc() &&
9508       Member == E->getMemberDecl() &&
9509       FoundDecl == E->getFoundDecl() &&
9510       !E->hasExplicitTemplateArgs()) {
9511 
9512     // Mark it referenced in the new context regardless.
9513     // FIXME: this is a bit instantiation-specific.
9514     SemaRef.MarkMemberReferenced(E);
9515 
9516     return E;
9517   }
9518 
9519   TemplateArgumentListInfo TransArgs;
9520   if (E->hasExplicitTemplateArgs()) {
9521     TransArgs.setLAngleLoc(E->getLAngleLoc());
9522     TransArgs.setRAngleLoc(E->getRAngleLoc());
9523     if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
9524                                                 E->getNumTemplateArgs(),
9525                                                 TransArgs))
9526       return ExprError();
9527   }
9528 
9529   // FIXME: Bogus source location for the operator
9530   SourceLocation FakeOperatorLoc =
9531       SemaRef.getLocForEndOfToken(E->getBase()->getSourceRange().getEnd());
9532 
9533   // FIXME: to do this check properly, we will need to preserve the
9534   // first-qualifier-in-scope here, just in case we had a dependent
9535   // base (and therefore couldn't do the check) and a
9536   // nested-name-qualifier (and therefore could do the lookup).
9537   NamedDecl *FirstQualifierInScope = nullptr;
9538   DeclarationNameInfo MemberNameInfo = E->getMemberNameInfo();
9539   if (MemberNameInfo.getName()) {
9540     MemberNameInfo = getDerived().TransformDeclarationNameInfo(MemberNameInfo);
9541     if (!MemberNameInfo.getName())
9542       return ExprError();
9543   }
9544 
9545   return getDerived().RebuildMemberExpr(Base.get(), FakeOperatorLoc,
9546                                         E->isArrow(),
9547                                         QualifierLoc,
9548                                         TemplateKWLoc,
9549                                         MemberNameInfo,
9550                                         Member,
9551                                         FoundDecl,
9552                                         (E->hasExplicitTemplateArgs()
9553                                            ? &TransArgs : nullptr),
9554                                         FirstQualifierInScope);
9555 }
9556 
9557 template<typename Derived>
9558 ExprResult
9559 TreeTransform<Derived>::TransformBinaryOperator(BinaryOperator *E) {
9560   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9561   if (LHS.isInvalid())
9562     return ExprError();
9563 
9564   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9565   if (RHS.isInvalid())
9566     return ExprError();
9567 
9568   if (!getDerived().AlwaysRebuild() &&
9569       LHS.get() == E->getLHS() &&
9570       RHS.get() == E->getRHS())
9571     return E;
9572 
9573   Sema::FPContractStateRAII FPContractState(getSema());
9574   getSema().FPFeatures = E->getFPFeatures();
9575 
9576   return getDerived().RebuildBinaryOperator(E->getOperatorLoc(), E->getOpcode(),
9577                                             LHS.get(), RHS.get());
9578 }
9579 
9580 template<typename Derived>
9581 ExprResult
9582 TreeTransform<Derived>::TransformCompoundAssignOperator(
9583                                                       CompoundAssignOperator *E) {
9584   return getDerived().TransformBinaryOperator(E);
9585 }
9586 
9587 template<typename Derived>
9588 ExprResult TreeTransform<Derived>::
9589 TransformBinaryConditionalOperator(BinaryConditionalOperator *e) {
9590   // Just rebuild the common and RHS expressions and see whether we
9591   // get any changes.
9592 
9593   ExprResult commonExpr = getDerived().TransformExpr(e->getCommon());
9594   if (commonExpr.isInvalid())
9595     return ExprError();
9596 
9597   ExprResult rhs = getDerived().TransformExpr(e->getFalseExpr());
9598   if (rhs.isInvalid())
9599     return ExprError();
9600 
9601   if (!getDerived().AlwaysRebuild() &&
9602       commonExpr.get() == e->getCommon() &&
9603       rhs.get() == e->getFalseExpr())
9604     return e;
9605 
9606   return getDerived().RebuildConditionalOperator(commonExpr.get(),
9607                                                  e->getQuestionLoc(),
9608                                                  nullptr,
9609                                                  e->getColonLoc(),
9610                                                  rhs.get());
9611 }
9612 
9613 template<typename Derived>
9614 ExprResult
9615 TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
9616   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9617   if (Cond.isInvalid())
9618     return ExprError();
9619 
9620   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9621   if (LHS.isInvalid())
9622     return ExprError();
9623 
9624   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9625   if (RHS.isInvalid())
9626     return ExprError();
9627 
9628   if (!getDerived().AlwaysRebuild() &&
9629       Cond.get() == E->getCond() &&
9630       LHS.get() == E->getLHS() &&
9631       RHS.get() == E->getRHS())
9632     return E;
9633 
9634   return getDerived().RebuildConditionalOperator(Cond.get(),
9635                                                  E->getQuestionLoc(),
9636                                                  LHS.get(),
9637                                                  E->getColonLoc(),
9638                                                  RHS.get());
9639 }
9640 
9641 template<typename Derived>
9642 ExprResult
9643 TreeTransform<Derived>::TransformImplicitCastExpr(ImplicitCastExpr *E) {
9644   // Implicit casts are eliminated during transformation, since they
9645   // will be recomputed by semantic analysis after transformation.
9646   return getDerived().TransformExpr(E->getSubExprAsWritten());
9647 }
9648 
9649 template<typename Derived>
9650 ExprResult
9651 TreeTransform<Derived>::TransformCStyleCastExpr(CStyleCastExpr *E) {
9652   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
9653   if (!Type)
9654     return ExprError();
9655 
9656   ExprResult SubExpr
9657     = getDerived().TransformExpr(E->getSubExprAsWritten());
9658   if (SubExpr.isInvalid())
9659     return ExprError();
9660 
9661   if (!getDerived().AlwaysRebuild() &&
9662       Type == E->getTypeInfoAsWritten() &&
9663       SubExpr.get() == E->getSubExpr())
9664     return E;
9665 
9666   return getDerived().RebuildCStyleCastExpr(E->getLParenLoc(),
9667                                             Type,
9668                                             E->getRParenLoc(),
9669                                             SubExpr.get());
9670 }
9671 
9672 template<typename Derived>
9673 ExprResult
9674 TreeTransform<Derived>::TransformCompoundLiteralExpr(CompoundLiteralExpr *E) {
9675   TypeSourceInfo *OldT = E->getTypeSourceInfo();
9676   TypeSourceInfo *NewT = getDerived().TransformType(OldT);
9677   if (!NewT)
9678     return ExprError();
9679 
9680   ExprResult Init = getDerived().TransformExpr(E->getInitializer());
9681   if (Init.isInvalid())
9682     return ExprError();
9683 
9684   if (!getDerived().AlwaysRebuild() &&
9685       OldT == NewT &&
9686       Init.get() == E->getInitializer())
9687     return SemaRef.MaybeBindToTemporary(E);
9688 
9689   // Note: the expression type doesn't necessarily match the
9690   // type-as-written, but that's okay, because it should always be
9691   // derivable from the initializer.
9692 
9693   return getDerived().RebuildCompoundLiteralExpr(
9694       E->getLParenLoc(), NewT,
9695       /*FIXME:*/ E->getInitializer()->getEndLoc(), Init.get());
9696 }
9697 
9698 template<typename Derived>
9699 ExprResult
9700 TreeTransform<Derived>::TransformExtVectorElementExpr(ExtVectorElementExpr *E) {
9701   ExprResult Base = getDerived().TransformExpr(E->getBase());
9702   if (Base.isInvalid())
9703     return ExprError();
9704 
9705   if (!getDerived().AlwaysRebuild() &&
9706       Base.get() == E->getBase())
9707     return E;
9708 
9709   // FIXME: Bad source location
9710   SourceLocation FakeOperatorLoc =
9711       SemaRef.getLocForEndOfToken(E->getBase()->getEndLoc());
9712   return getDerived().RebuildExtVectorElementExpr(Base.get(), FakeOperatorLoc,
9713                                                   E->getAccessorLoc(),
9714                                                   E->getAccessor());
9715 }
9716 
9717 template<typename Derived>
9718 ExprResult
9719 TreeTransform<Derived>::TransformInitListExpr(InitListExpr *E) {
9720   if (InitListExpr *Syntactic = E->getSyntacticForm())
9721     E = Syntactic;
9722 
9723   bool InitChanged = false;
9724 
9725   EnterExpressionEvaluationContext Context(
9726       getSema(), EnterExpressionEvaluationContext::InitList);
9727 
9728   SmallVector<Expr*, 4> Inits;
9729   if (getDerived().TransformExprs(E->getInits(), E->getNumInits(), false,
9730                                   Inits, &InitChanged))
9731     return ExprError();
9732 
9733   if (!getDerived().AlwaysRebuild() && !InitChanged) {
9734     // FIXME: Attempt to reuse the existing syntactic form of the InitListExpr
9735     // in some cases. We can't reuse it in general, because the syntactic and
9736     // semantic forms are linked, and we can't know that semantic form will
9737     // match even if the syntactic form does.
9738   }
9739 
9740   return getDerived().RebuildInitList(E->getLBraceLoc(), Inits,
9741                                       E->getRBraceLoc());
9742 }
9743 
9744 template<typename Derived>
9745 ExprResult
9746 TreeTransform<Derived>::TransformDesignatedInitExpr(DesignatedInitExpr *E) {
9747   Designation Desig;
9748 
9749   // transform the initializer value
9750   ExprResult Init = getDerived().TransformExpr(E->getInit());
9751   if (Init.isInvalid())
9752     return ExprError();
9753 
9754   // transform the designators.
9755   SmallVector<Expr*, 4> ArrayExprs;
9756   bool ExprChanged = false;
9757   for (const DesignatedInitExpr::Designator &D : E->designators()) {
9758     if (D.isFieldDesignator()) {
9759       Desig.AddDesignator(Designator::getField(D.getFieldName(),
9760                                                D.getDotLoc(),
9761                                                D.getFieldLoc()));
9762       if (D.getField()) {
9763         FieldDecl *Field = cast_or_null<FieldDecl>(
9764             getDerived().TransformDecl(D.getFieldLoc(), D.getField()));
9765         if (Field != D.getField())
9766           // Rebuild the expression when the transformed FieldDecl is
9767           // different to the already assigned FieldDecl.
9768           ExprChanged = true;
9769       } else {
9770         // Ensure that the designator expression is rebuilt when there isn't
9771         // a resolved FieldDecl in the designator as we don't want to assign
9772         // a FieldDecl to a pattern designator that will be instantiated again.
9773         ExprChanged = true;
9774       }
9775       continue;
9776     }
9777 
9778     if (D.isArrayDesignator()) {
9779       ExprResult Index = getDerived().TransformExpr(E->getArrayIndex(D));
9780       if (Index.isInvalid())
9781         return ExprError();
9782 
9783       Desig.AddDesignator(
9784           Designator::getArray(Index.get(), D.getLBracketLoc()));
9785 
9786       ExprChanged = ExprChanged || Init.get() != E->getArrayIndex(D);
9787       ArrayExprs.push_back(Index.get());
9788       continue;
9789     }
9790 
9791     assert(D.isArrayRangeDesignator() && "New kind of designator?");
9792     ExprResult Start
9793       = getDerived().TransformExpr(E->getArrayRangeStart(D));
9794     if (Start.isInvalid())
9795       return ExprError();
9796 
9797     ExprResult End = getDerived().TransformExpr(E->getArrayRangeEnd(D));
9798     if (End.isInvalid())
9799       return ExprError();
9800 
9801     Desig.AddDesignator(Designator::getArrayRange(Start.get(),
9802                                                   End.get(),
9803                                                   D.getLBracketLoc(),
9804                                                   D.getEllipsisLoc()));
9805 
9806     ExprChanged = ExprChanged || Start.get() != E->getArrayRangeStart(D) ||
9807                   End.get() != E->getArrayRangeEnd(D);
9808 
9809     ArrayExprs.push_back(Start.get());
9810     ArrayExprs.push_back(End.get());
9811   }
9812 
9813   if (!getDerived().AlwaysRebuild() &&
9814       Init.get() == E->getInit() &&
9815       !ExprChanged)
9816     return E;
9817 
9818   return getDerived().RebuildDesignatedInitExpr(Desig, ArrayExprs,
9819                                                 E->getEqualOrColonLoc(),
9820                                                 E->usesGNUSyntax(), Init.get());
9821 }
9822 
9823 // Seems that if TransformInitListExpr() only works on the syntactic form of an
9824 // InitListExpr, then a DesignatedInitUpdateExpr is not encountered.
9825 template<typename Derived>
9826 ExprResult
9827 TreeTransform<Derived>::TransformDesignatedInitUpdateExpr(
9828     DesignatedInitUpdateExpr *E) {
9829   llvm_unreachable("Unexpected DesignatedInitUpdateExpr in syntactic form of "
9830                    "initializer");
9831   return ExprError();
9832 }
9833 
9834 template<typename Derived>
9835 ExprResult
9836 TreeTransform<Derived>::TransformNoInitExpr(
9837     NoInitExpr *E) {
9838   llvm_unreachable("Unexpected NoInitExpr in syntactic form of initializer");
9839   return ExprError();
9840 }
9841 
9842 template<typename Derived>
9843 ExprResult
9844 TreeTransform<Derived>::TransformArrayInitLoopExpr(ArrayInitLoopExpr *E) {
9845   llvm_unreachable("Unexpected ArrayInitLoopExpr outside of initializer");
9846   return ExprError();
9847 }
9848 
9849 template<typename Derived>
9850 ExprResult
9851 TreeTransform<Derived>::TransformArrayInitIndexExpr(ArrayInitIndexExpr *E) {
9852   llvm_unreachable("Unexpected ArrayInitIndexExpr outside of initializer");
9853   return ExprError();
9854 }
9855 
9856 template<typename Derived>
9857 ExprResult
9858 TreeTransform<Derived>::TransformImplicitValueInitExpr(
9859                                                      ImplicitValueInitExpr *E) {
9860   TemporaryBase Rebase(*this, E->getBeginLoc(), DeclarationName());
9861 
9862   // FIXME: Will we ever have proper type location here? Will we actually
9863   // need to transform the type?
9864   QualType T = getDerived().TransformType(E->getType());
9865   if (T.isNull())
9866     return ExprError();
9867 
9868   if (!getDerived().AlwaysRebuild() &&
9869       T == E->getType())
9870     return E;
9871 
9872   return getDerived().RebuildImplicitValueInitExpr(T);
9873 }
9874 
9875 template<typename Derived>
9876 ExprResult
9877 TreeTransform<Derived>::TransformVAArgExpr(VAArgExpr *E) {
9878   TypeSourceInfo *TInfo = getDerived().TransformType(E->getWrittenTypeInfo());
9879   if (!TInfo)
9880     return ExprError();
9881 
9882   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
9883   if (SubExpr.isInvalid())
9884     return ExprError();
9885 
9886   if (!getDerived().AlwaysRebuild() &&
9887       TInfo == E->getWrittenTypeInfo() &&
9888       SubExpr.get() == E->getSubExpr())
9889     return E;
9890 
9891   return getDerived().RebuildVAArgExpr(E->getBuiltinLoc(), SubExpr.get(),
9892                                        TInfo, E->getRParenLoc());
9893 }
9894 
9895 template<typename Derived>
9896 ExprResult
9897 TreeTransform<Derived>::TransformParenListExpr(ParenListExpr *E) {
9898   bool ArgumentChanged = false;
9899   SmallVector<Expr*, 4> Inits;
9900   if (TransformExprs(E->getExprs(), E->getNumExprs(), true, Inits,
9901                      &ArgumentChanged))
9902     return ExprError();
9903 
9904   return getDerived().RebuildParenListExpr(E->getLParenLoc(),
9905                                            Inits,
9906                                            E->getRParenLoc());
9907 }
9908 
9909 /// Transform an address-of-label expression.
9910 ///
9911 /// By default, the transformation of an address-of-label expression always
9912 /// rebuilds the expression, so that the label identifier can be resolved to
9913 /// the corresponding label statement by semantic analysis.
9914 template<typename Derived>
9915 ExprResult
9916 TreeTransform<Derived>::TransformAddrLabelExpr(AddrLabelExpr *E) {
9917   Decl *LD = getDerived().TransformDecl(E->getLabel()->getLocation(),
9918                                         E->getLabel());
9919   if (!LD)
9920     return ExprError();
9921 
9922   return getDerived().RebuildAddrLabelExpr(E->getAmpAmpLoc(), E->getLabelLoc(),
9923                                            cast<LabelDecl>(LD));
9924 }
9925 
9926 template<typename Derived>
9927 ExprResult
9928 TreeTransform<Derived>::TransformStmtExpr(StmtExpr *E) {
9929   SemaRef.ActOnStartStmtExpr();
9930   StmtResult SubStmt
9931     = getDerived().TransformCompoundStmt(E->getSubStmt(), true);
9932   if (SubStmt.isInvalid()) {
9933     SemaRef.ActOnStmtExprError();
9934     return ExprError();
9935   }
9936 
9937   if (!getDerived().AlwaysRebuild() &&
9938       SubStmt.get() == E->getSubStmt()) {
9939     // Calling this an 'error' is unintuitive, but it does the right thing.
9940     SemaRef.ActOnStmtExprError();
9941     return SemaRef.MaybeBindToTemporary(E);
9942   }
9943 
9944   return getDerived().RebuildStmtExpr(E->getLParenLoc(),
9945                                       SubStmt.get(),
9946                                       E->getRParenLoc());
9947 }
9948 
9949 template<typename Derived>
9950 ExprResult
9951 TreeTransform<Derived>::TransformChooseExpr(ChooseExpr *E) {
9952   ExprResult Cond = getDerived().TransformExpr(E->getCond());
9953   if (Cond.isInvalid())
9954     return ExprError();
9955 
9956   ExprResult LHS = getDerived().TransformExpr(E->getLHS());
9957   if (LHS.isInvalid())
9958     return ExprError();
9959 
9960   ExprResult RHS = getDerived().TransformExpr(E->getRHS());
9961   if (RHS.isInvalid())
9962     return ExprError();
9963 
9964   if (!getDerived().AlwaysRebuild() &&
9965       Cond.get() == E->getCond() &&
9966       LHS.get() == E->getLHS() &&
9967       RHS.get() == E->getRHS())
9968     return E;
9969 
9970   return getDerived().RebuildChooseExpr(E->getBuiltinLoc(),
9971                                         Cond.get(), LHS.get(), RHS.get(),
9972                                         E->getRParenLoc());
9973 }
9974 
9975 template<typename Derived>
9976 ExprResult
9977 TreeTransform<Derived>::TransformGNUNullExpr(GNUNullExpr *E) {
9978   return E;
9979 }
9980 
9981 template<typename Derived>
9982 ExprResult
9983 TreeTransform<Derived>::TransformCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
9984   switch (E->getOperator()) {
9985   case OO_New:
9986   case OO_Delete:
9987   case OO_Array_New:
9988   case OO_Array_Delete:
9989     llvm_unreachable("new and delete operators cannot use CXXOperatorCallExpr");
9990 
9991   case OO_Call: {
9992     // This is a call to an object's operator().
9993     assert(E->getNumArgs() >= 1 && "Object call is missing arguments");
9994 
9995     // Transform the object itself.
9996     ExprResult Object = getDerived().TransformExpr(E->getArg(0));
9997     if (Object.isInvalid())
9998       return ExprError();
9999 
10000     // FIXME: Poor location information
10001     SourceLocation FakeLParenLoc = SemaRef.getLocForEndOfToken(
10002         static_cast<Expr *>(Object.get())->getEndLoc());
10003 
10004     // Transform the call arguments.
10005     SmallVector<Expr*, 8> Args;
10006     if (getDerived().TransformExprs(E->getArgs() + 1, E->getNumArgs() - 1, true,
10007                                     Args))
10008       return ExprError();
10009 
10010     return getDerived().RebuildCallExpr(Object.get(), FakeLParenLoc, Args,
10011                                         E->getEndLoc());
10012   }
10013 
10014 #define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
10015   case OO_##Name:
10016 #define OVERLOADED_OPERATOR_MULTI(Name,Spelling,Unary,Binary,MemberOnly)
10017 #include "clang/Basic/OperatorKinds.def"
10018   case OO_Subscript:
10019     // Handled below.
10020     break;
10021 
10022   case OO_Conditional:
10023     llvm_unreachable("conditional operator is not actually overloadable");
10024 
10025   case OO_None:
10026   case NUM_OVERLOADED_OPERATORS:
10027     llvm_unreachable("not an overloaded operator?");
10028   }
10029 
10030   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10031   if (Callee.isInvalid())
10032     return ExprError();
10033 
10034   ExprResult First;
10035   if (E->getOperator() == OO_Amp)
10036     First = getDerived().TransformAddressOfOperand(E->getArg(0));
10037   else
10038     First = getDerived().TransformExpr(E->getArg(0));
10039   if (First.isInvalid())
10040     return ExprError();
10041 
10042   ExprResult Second;
10043   if (E->getNumArgs() == 2) {
10044     Second = getDerived().TransformExpr(E->getArg(1));
10045     if (Second.isInvalid())
10046       return ExprError();
10047   }
10048 
10049   if (!getDerived().AlwaysRebuild() &&
10050       Callee.get() == E->getCallee() &&
10051       First.get() == E->getArg(0) &&
10052       (E->getNumArgs() != 2 || Second.get() == E->getArg(1)))
10053     return SemaRef.MaybeBindToTemporary(E);
10054 
10055   Sema::FPContractStateRAII FPContractState(getSema());
10056   getSema().FPFeatures = E->getFPFeatures();
10057 
10058   return getDerived().RebuildCXXOperatorCallExpr(E->getOperator(),
10059                                                  E->getOperatorLoc(),
10060                                                  Callee.get(),
10061                                                  First.get(),
10062                                                  Second.get());
10063 }
10064 
10065 template<typename Derived>
10066 ExprResult
10067 TreeTransform<Derived>::TransformCXXMemberCallExpr(CXXMemberCallExpr *E) {
10068   return getDerived().TransformCallExpr(E);
10069 }
10070 
10071 template<typename Derived>
10072 ExprResult
10073 TreeTransform<Derived>::TransformCUDAKernelCallExpr(CUDAKernelCallExpr *E) {
10074   // Transform the callee.
10075   ExprResult Callee = getDerived().TransformExpr(E->getCallee());
10076   if (Callee.isInvalid())
10077     return ExprError();
10078 
10079   // Transform exec config.
10080   ExprResult EC = getDerived().TransformCallExpr(E->getConfig());
10081   if (EC.isInvalid())
10082     return ExprError();
10083 
10084   // Transform arguments.
10085   bool ArgChanged = false;
10086   SmallVector<Expr*, 8> Args;
10087   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10088                                   &ArgChanged))
10089     return ExprError();
10090 
10091   if (!getDerived().AlwaysRebuild() &&
10092       Callee.get() == E->getCallee() &&
10093       !ArgChanged)
10094     return SemaRef.MaybeBindToTemporary(E);
10095 
10096   // FIXME: Wrong source location information for the '('.
10097   SourceLocation FakeLParenLoc
10098     = ((Expr *)Callee.get())->getSourceRange().getBegin();
10099   return getDerived().RebuildCallExpr(Callee.get(), FakeLParenLoc,
10100                                       Args,
10101                                       E->getRParenLoc(), EC.get());
10102 }
10103 
10104 template<typename Derived>
10105 ExprResult
10106 TreeTransform<Derived>::TransformCXXNamedCastExpr(CXXNamedCastExpr *E) {
10107   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeInfoAsWritten());
10108   if (!Type)
10109     return ExprError();
10110 
10111   ExprResult SubExpr
10112     = getDerived().TransformExpr(E->getSubExprAsWritten());
10113   if (SubExpr.isInvalid())
10114     return ExprError();
10115 
10116   if (!getDerived().AlwaysRebuild() &&
10117       Type == E->getTypeInfoAsWritten() &&
10118       SubExpr.get() == E->getSubExpr())
10119     return E;
10120   return getDerived().RebuildCXXNamedCastExpr(
10121       E->getOperatorLoc(), E->getStmtClass(), E->getAngleBrackets().getBegin(),
10122       Type, E->getAngleBrackets().getEnd(),
10123       // FIXME. this should be '(' location
10124       E->getAngleBrackets().getEnd(), SubExpr.get(), E->getRParenLoc());
10125 }
10126 
10127 template<typename Derived>
10128 ExprResult
10129 TreeTransform<Derived>::TransformCXXStaticCastExpr(CXXStaticCastExpr *E) {
10130   return getDerived().TransformCXXNamedCastExpr(E);
10131 }
10132 
10133 template<typename Derived>
10134 ExprResult
10135 TreeTransform<Derived>::TransformCXXDynamicCastExpr(CXXDynamicCastExpr *E) {
10136   return getDerived().TransformCXXNamedCastExpr(E);
10137 }
10138 
10139 template<typename Derived>
10140 ExprResult
10141 TreeTransform<Derived>::TransformCXXReinterpretCastExpr(
10142                                                       CXXReinterpretCastExpr *E) {
10143   return getDerived().TransformCXXNamedCastExpr(E);
10144 }
10145 
10146 template<typename Derived>
10147 ExprResult
10148 TreeTransform<Derived>::TransformCXXConstCastExpr(CXXConstCastExpr *E) {
10149   return getDerived().TransformCXXNamedCastExpr(E);
10150 }
10151 
10152 template<typename Derived>
10153 ExprResult
10154 TreeTransform<Derived>::TransformCXXFunctionalCastExpr(
10155                                                      CXXFunctionalCastExpr *E) {
10156   TypeSourceInfo *Type =
10157       getDerived().TransformTypeWithDeducedTST(E->getTypeInfoAsWritten());
10158   if (!Type)
10159     return ExprError();
10160 
10161   ExprResult SubExpr
10162     = getDerived().TransformExpr(E->getSubExprAsWritten());
10163   if (SubExpr.isInvalid())
10164     return ExprError();
10165 
10166   if (!getDerived().AlwaysRebuild() &&
10167       Type == E->getTypeInfoAsWritten() &&
10168       SubExpr.get() == E->getSubExpr())
10169     return E;
10170 
10171   return getDerived().RebuildCXXFunctionalCastExpr(Type,
10172                                                    E->getLParenLoc(),
10173                                                    SubExpr.get(),
10174                                                    E->getRParenLoc(),
10175                                                    E->isListInitialization());
10176 }
10177 
10178 template<typename Derived>
10179 ExprResult
10180 TreeTransform<Derived>::TransformCXXTypeidExpr(CXXTypeidExpr *E) {
10181   if (E->isTypeOperand()) {
10182     TypeSourceInfo *TInfo
10183       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10184     if (!TInfo)
10185       return ExprError();
10186 
10187     if (!getDerived().AlwaysRebuild() &&
10188         TInfo == E->getTypeOperandSourceInfo())
10189       return E;
10190 
10191     return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10192                                              TInfo, E->getEndLoc());
10193   }
10194 
10195   // We don't know whether the subexpression is potentially evaluated until
10196   // after we perform semantic analysis.  We speculatively assume it is
10197   // unevaluated; it will get fixed later if the subexpression is in fact
10198   // potentially evaluated.
10199   EnterExpressionEvaluationContext Unevaluated(
10200       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated,
10201       Sema::ReuseLambdaContextDecl);
10202 
10203   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10204   if (SubExpr.isInvalid())
10205     return ExprError();
10206 
10207   if (!getDerived().AlwaysRebuild() &&
10208       SubExpr.get() == E->getExprOperand())
10209     return E;
10210 
10211   return getDerived().RebuildCXXTypeidExpr(E->getType(), E->getBeginLoc(),
10212                                            SubExpr.get(), E->getEndLoc());
10213 }
10214 
10215 template<typename Derived>
10216 ExprResult
10217 TreeTransform<Derived>::TransformCXXUuidofExpr(CXXUuidofExpr *E) {
10218   if (E->isTypeOperand()) {
10219     TypeSourceInfo *TInfo
10220       = getDerived().TransformType(E->getTypeOperandSourceInfo());
10221     if (!TInfo)
10222       return ExprError();
10223 
10224     if (!getDerived().AlwaysRebuild() &&
10225         TInfo == E->getTypeOperandSourceInfo())
10226       return E;
10227 
10228     return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10229                                              TInfo, E->getEndLoc());
10230   }
10231 
10232   EnterExpressionEvaluationContext Unevaluated(
10233       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10234 
10235   ExprResult SubExpr = getDerived().TransformExpr(E->getExprOperand());
10236   if (SubExpr.isInvalid())
10237     return ExprError();
10238 
10239   if (!getDerived().AlwaysRebuild() &&
10240       SubExpr.get() == E->getExprOperand())
10241     return E;
10242 
10243   return getDerived().RebuildCXXUuidofExpr(E->getType(), E->getBeginLoc(),
10244                                            SubExpr.get(), E->getEndLoc());
10245 }
10246 
10247 template<typename Derived>
10248 ExprResult
10249 TreeTransform<Derived>::TransformCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) {
10250   return E;
10251 }
10252 
10253 template<typename Derived>
10254 ExprResult
10255 TreeTransform<Derived>::TransformCXXNullPtrLiteralExpr(
10256                                                      CXXNullPtrLiteralExpr *E) {
10257   return E;
10258 }
10259 
10260 template<typename Derived>
10261 ExprResult
10262 TreeTransform<Derived>::TransformCXXThisExpr(CXXThisExpr *E) {
10263   QualType T = getSema().getCurrentThisType();
10264 
10265   if (!getDerived().AlwaysRebuild() && T == E->getType()) {
10266     // Make sure that we capture 'this'.
10267     getSema().CheckCXXThisCapture(E->getBeginLoc());
10268     return E;
10269   }
10270 
10271   return getDerived().RebuildCXXThisExpr(E->getBeginLoc(), T, E->isImplicit());
10272 }
10273 
10274 template<typename Derived>
10275 ExprResult
10276 TreeTransform<Derived>::TransformCXXThrowExpr(CXXThrowExpr *E) {
10277   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
10278   if (SubExpr.isInvalid())
10279     return ExprError();
10280 
10281   if (!getDerived().AlwaysRebuild() &&
10282       SubExpr.get() == E->getSubExpr())
10283     return E;
10284 
10285   return getDerived().RebuildCXXThrowExpr(E->getThrowLoc(), SubExpr.get(),
10286                                           E->isThrownVariableInScope());
10287 }
10288 
10289 template<typename Derived>
10290 ExprResult
10291 TreeTransform<Derived>::TransformCXXDefaultArgExpr(CXXDefaultArgExpr *E) {
10292   ParmVarDecl *Param = cast_or_null<ParmVarDecl>(
10293       getDerived().TransformDecl(E->getBeginLoc(), E->getParam()));
10294   if (!Param)
10295     return ExprError();
10296 
10297   if (!getDerived().AlwaysRebuild() &&
10298       Param == E->getParam())
10299     return E;
10300 
10301   return getDerived().RebuildCXXDefaultArgExpr(E->getUsedLocation(), Param);
10302 }
10303 
10304 template<typename Derived>
10305 ExprResult
10306 TreeTransform<Derived>::TransformCXXDefaultInitExpr(CXXDefaultInitExpr *E) {
10307   FieldDecl *Field = cast_or_null<FieldDecl>(
10308       getDerived().TransformDecl(E->getBeginLoc(), E->getField()));
10309   if (!Field)
10310     return ExprError();
10311 
10312   if (!getDerived().AlwaysRebuild() && Field == E->getField())
10313     return E;
10314 
10315   return getDerived().RebuildCXXDefaultInitExpr(E->getExprLoc(), Field);
10316 }
10317 
10318 template<typename Derived>
10319 ExprResult
10320 TreeTransform<Derived>::TransformCXXScalarValueInitExpr(
10321                                                     CXXScalarValueInitExpr *E) {
10322   TypeSourceInfo *T = getDerived().TransformType(E->getTypeSourceInfo());
10323   if (!T)
10324     return ExprError();
10325 
10326   if (!getDerived().AlwaysRebuild() &&
10327       T == E->getTypeSourceInfo())
10328     return E;
10329 
10330   return getDerived().RebuildCXXScalarValueInitExpr(T,
10331                                           /*FIXME:*/T->getTypeLoc().getEndLoc(),
10332                                                     E->getRParenLoc());
10333 }
10334 
10335 template<typename Derived>
10336 ExprResult
10337 TreeTransform<Derived>::TransformCXXNewExpr(CXXNewExpr *E) {
10338   // Transform the type that we're allocating
10339   TypeSourceInfo *AllocTypeInfo =
10340       getDerived().TransformTypeWithDeducedTST(E->getAllocatedTypeSourceInfo());
10341   if (!AllocTypeInfo)
10342     return ExprError();
10343 
10344   // Transform the size of the array we're allocating (if any).
10345   ExprResult ArraySize = getDerived().TransformExpr(E->getArraySize());
10346   if (ArraySize.isInvalid())
10347     return ExprError();
10348 
10349   // Transform the placement arguments (if any).
10350   bool ArgumentChanged = false;
10351   SmallVector<Expr*, 8> PlacementArgs;
10352   if (getDerived().TransformExprs(E->getPlacementArgs(),
10353                                   E->getNumPlacementArgs(), true,
10354                                   PlacementArgs, &ArgumentChanged))
10355     return ExprError();
10356 
10357   // Transform the initializer (if any).
10358   Expr *OldInit = E->getInitializer();
10359   ExprResult NewInit;
10360   if (OldInit)
10361     NewInit = getDerived().TransformInitializer(OldInit, true);
10362   if (NewInit.isInvalid())
10363     return ExprError();
10364 
10365   // Transform new operator and delete operator.
10366   FunctionDecl *OperatorNew = nullptr;
10367   if (E->getOperatorNew()) {
10368     OperatorNew = cast_or_null<FunctionDecl>(
10369         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorNew()));
10370     if (!OperatorNew)
10371       return ExprError();
10372   }
10373 
10374   FunctionDecl *OperatorDelete = nullptr;
10375   if (E->getOperatorDelete()) {
10376     OperatorDelete = cast_or_null<FunctionDecl>(
10377         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10378     if (!OperatorDelete)
10379       return ExprError();
10380   }
10381 
10382   if (!getDerived().AlwaysRebuild() &&
10383       AllocTypeInfo == E->getAllocatedTypeSourceInfo() &&
10384       ArraySize.get() == E->getArraySize() &&
10385       NewInit.get() == OldInit &&
10386       OperatorNew == E->getOperatorNew() &&
10387       OperatorDelete == E->getOperatorDelete() &&
10388       !ArgumentChanged) {
10389     // Mark any declarations we need as referenced.
10390     // FIXME: instantiation-specific.
10391     if (OperatorNew)
10392       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorNew);
10393     if (OperatorDelete)
10394       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10395 
10396     if (E->isArray() && !E->getAllocatedType()->isDependentType()) {
10397       QualType ElementType
10398         = SemaRef.Context.getBaseElementType(E->getAllocatedType());
10399       if (const RecordType *RecordT = ElementType->getAs<RecordType>()) {
10400         CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordT->getDecl());
10401         if (CXXDestructorDecl *Destructor = SemaRef.LookupDestructor(Record)) {
10402           SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Destructor);
10403         }
10404       }
10405     }
10406 
10407     return E;
10408   }
10409 
10410   QualType AllocType = AllocTypeInfo->getType();
10411   if (!ArraySize.get()) {
10412     // If no array size was specified, but the new expression was
10413     // instantiated with an array type (e.g., "new T" where T is
10414     // instantiated with "int[4]"), extract the outer bound from the
10415     // array type as our array size. We do this with constant and
10416     // dependently-sized array types.
10417     const ArrayType *ArrayT = SemaRef.Context.getAsArrayType(AllocType);
10418     if (!ArrayT) {
10419       // Do nothing
10420     } else if (const ConstantArrayType *ConsArrayT
10421                                      = dyn_cast<ConstantArrayType>(ArrayT)) {
10422       ArraySize = IntegerLiteral::Create(SemaRef.Context, ConsArrayT->getSize(),
10423                                          SemaRef.Context.getSizeType(),
10424                                          /*FIXME:*/ E->getBeginLoc());
10425       AllocType = ConsArrayT->getElementType();
10426     } else if (const DependentSizedArrayType *DepArrayT
10427                               = dyn_cast<DependentSizedArrayType>(ArrayT)) {
10428       if (DepArrayT->getSizeExpr()) {
10429         ArraySize = DepArrayT->getSizeExpr();
10430         AllocType = DepArrayT->getElementType();
10431       }
10432     }
10433   }
10434 
10435   return getDerived().RebuildCXXNewExpr(
10436       E->getBeginLoc(), E->isGlobalNew(),
10437       /*FIXME:*/ E->getBeginLoc(), PlacementArgs,
10438       /*FIXME:*/ E->getBeginLoc(), E->getTypeIdParens(), AllocType,
10439       AllocTypeInfo, ArraySize.get(), E->getDirectInitRange(), NewInit.get());
10440 }
10441 
10442 template<typename Derived>
10443 ExprResult
10444 TreeTransform<Derived>::TransformCXXDeleteExpr(CXXDeleteExpr *E) {
10445   ExprResult Operand = getDerived().TransformExpr(E->getArgument());
10446   if (Operand.isInvalid())
10447     return ExprError();
10448 
10449   // Transform the delete operator, if known.
10450   FunctionDecl *OperatorDelete = nullptr;
10451   if (E->getOperatorDelete()) {
10452     OperatorDelete = cast_or_null<FunctionDecl>(
10453         getDerived().TransformDecl(E->getBeginLoc(), E->getOperatorDelete()));
10454     if (!OperatorDelete)
10455       return ExprError();
10456   }
10457 
10458   if (!getDerived().AlwaysRebuild() &&
10459       Operand.get() == E->getArgument() &&
10460       OperatorDelete == E->getOperatorDelete()) {
10461     // Mark any declarations we need as referenced.
10462     // FIXME: instantiation-specific.
10463     if (OperatorDelete)
10464       SemaRef.MarkFunctionReferenced(E->getBeginLoc(), OperatorDelete);
10465 
10466     if (!E->getArgument()->isTypeDependent()) {
10467       QualType Destroyed = SemaRef.Context.getBaseElementType(
10468                                                          E->getDestroyedType());
10469       if (const RecordType *DestroyedRec = Destroyed->getAs<RecordType>()) {
10470         CXXRecordDecl *Record = cast<CXXRecordDecl>(DestroyedRec->getDecl());
10471         SemaRef.MarkFunctionReferenced(E->getBeginLoc(),
10472                                        SemaRef.LookupDestructor(Record));
10473       }
10474     }
10475 
10476     return E;
10477   }
10478 
10479   return getDerived().RebuildCXXDeleteExpr(
10480       E->getBeginLoc(), E->isGlobalDelete(), E->isArrayForm(), Operand.get());
10481 }
10482 
10483 template<typename Derived>
10484 ExprResult
10485 TreeTransform<Derived>::TransformCXXPseudoDestructorExpr(
10486                                                      CXXPseudoDestructorExpr *E) {
10487   ExprResult Base = getDerived().TransformExpr(E->getBase());
10488   if (Base.isInvalid())
10489     return ExprError();
10490 
10491   ParsedType ObjectTypePtr;
10492   bool MayBePseudoDestructor = false;
10493   Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
10494                                               E->getOperatorLoc(),
10495                                         E->isArrow()? tok::arrow : tok::period,
10496                                               ObjectTypePtr,
10497                                               MayBePseudoDestructor);
10498   if (Base.isInvalid())
10499     return ExprError();
10500 
10501   QualType ObjectType = ObjectTypePtr.get();
10502   NestedNameSpecifierLoc QualifierLoc = E->getQualifierLoc();
10503   if (QualifierLoc) {
10504     QualifierLoc
10505       = getDerived().TransformNestedNameSpecifierLoc(QualifierLoc, ObjectType);
10506     if (!QualifierLoc)
10507       return ExprError();
10508   }
10509   CXXScopeSpec SS;
10510   SS.Adopt(QualifierLoc);
10511 
10512   PseudoDestructorTypeStorage Destroyed;
10513   if (E->getDestroyedTypeInfo()) {
10514     TypeSourceInfo *DestroyedTypeInfo
10515       = getDerived().TransformTypeInObjectScope(E->getDestroyedTypeInfo(),
10516                                                 ObjectType, nullptr, SS);
10517     if (!DestroyedTypeInfo)
10518       return ExprError();
10519     Destroyed = DestroyedTypeInfo;
10520   } else if (!ObjectType.isNull() && ObjectType->isDependentType()) {
10521     // We aren't likely to be able to resolve the identifier down to a type
10522     // now anyway, so just retain the identifier.
10523     Destroyed = PseudoDestructorTypeStorage(E->getDestroyedTypeIdentifier(),
10524                                             E->getDestroyedTypeLoc());
10525   } else {
10526     // Look for a destructor known with the given name.
10527     ParsedType T = SemaRef.getDestructorName(E->getTildeLoc(),
10528                                               *E->getDestroyedTypeIdentifier(),
10529                                                 E->getDestroyedTypeLoc(),
10530                                                 /*Scope=*/nullptr,
10531                                                 SS, ObjectTypePtr,
10532                                                 false);
10533     if (!T)
10534       return ExprError();
10535 
10536     Destroyed
10537       = SemaRef.Context.getTrivialTypeSourceInfo(SemaRef.GetTypeFromParser(T),
10538                                                  E->getDestroyedTypeLoc());
10539   }
10540 
10541   TypeSourceInfo *ScopeTypeInfo = nullptr;
10542   if (E->getScopeTypeInfo()) {
10543     CXXScopeSpec EmptySS;
10544     ScopeTypeInfo = getDerived().TransformTypeInObjectScope(
10545                       E->getScopeTypeInfo(), ObjectType, nullptr, EmptySS);
10546     if (!ScopeTypeInfo)
10547       return ExprError();
10548   }
10549 
10550   return getDerived().RebuildCXXPseudoDestructorExpr(Base.get(),
10551                                                      E->getOperatorLoc(),
10552                                                      E->isArrow(),
10553                                                      SS,
10554                                                      ScopeTypeInfo,
10555                                                      E->getColonColonLoc(),
10556                                                      E->getTildeLoc(),
10557                                                      Destroyed);
10558 }
10559 
10560 template <typename Derived>
10561 bool TreeTransform<Derived>::TransformOverloadExprDecls(OverloadExpr *Old,
10562                                                         bool RequiresADL,
10563                                                         LookupResult &R) {
10564   // Transform all the decls.
10565   bool AllEmptyPacks = true;
10566   for (auto *OldD : Old->decls()) {
10567     Decl *InstD = getDerived().TransformDecl(Old->getNameLoc(), OldD);
10568     if (!InstD) {
10569       // Silently ignore these if a UsingShadowDecl instantiated to nothing.
10570       // This can happen because of dependent hiding.
10571       if (isa<UsingShadowDecl>(OldD))
10572         continue;
10573       else {
10574         R.clear();
10575         return true;
10576       }
10577     }
10578 
10579     // Expand using pack declarations.
10580     NamedDecl *SingleDecl = cast<NamedDecl>(InstD);
10581     ArrayRef<NamedDecl*> Decls = SingleDecl;
10582     if (auto *UPD = dyn_cast<UsingPackDecl>(InstD))
10583       Decls = UPD->expansions();
10584 
10585     // Expand using declarations.
10586     for (auto *D : Decls) {
10587       if (auto *UD = dyn_cast<UsingDecl>(D)) {
10588         for (auto *SD : UD->shadows())
10589           R.addDecl(SD);
10590       } else {
10591         R.addDecl(D);
10592       }
10593     }
10594 
10595     AllEmptyPacks &= Decls.empty();
10596   };
10597 
10598   // C++ [temp.res]/8.4.2:
10599   //   The program is ill-formed, no diagnostic required, if [...] lookup for
10600   //   a name in the template definition found a using-declaration, but the
10601   //   lookup in the corresponding scope in the instantiation odoes not find
10602   //   any declarations because the using-declaration was a pack expansion and
10603   //   the corresponding pack is empty
10604   if (AllEmptyPacks && !RequiresADL) {
10605     getSema().Diag(Old->getNameLoc(), diag::err_using_pack_expansion_empty)
10606         << isa<UnresolvedMemberExpr>(Old) << Old->getName();
10607     return true;
10608   }
10609 
10610   // Resolve a kind, but don't do any further analysis.  If it's
10611   // ambiguous, the callee needs to deal with it.
10612   R.resolveKind();
10613   return false;
10614 }
10615 
10616 template<typename Derived>
10617 ExprResult
10618 TreeTransform<Derived>::TransformUnresolvedLookupExpr(
10619                                                   UnresolvedLookupExpr *Old) {
10620   LookupResult R(SemaRef, Old->getName(), Old->getNameLoc(),
10621                  Sema::LookupOrdinaryName);
10622 
10623   // Transform the declaration set.
10624   if (TransformOverloadExprDecls(Old, Old->requiresADL(), R))
10625     return ExprError();
10626 
10627   // Rebuild the nested-name qualifier, if present.
10628   CXXScopeSpec SS;
10629   if (Old->getQualifierLoc()) {
10630     NestedNameSpecifierLoc QualifierLoc
10631       = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
10632     if (!QualifierLoc)
10633       return ExprError();
10634 
10635     SS.Adopt(QualifierLoc);
10636   }
10637 
10638   if (Old->getNamingClass()) {
10639     CXXRecordDecl *NamingClass
10640       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
10641                                                             Old->getNameLoc(),
10642                                                         Old->getNamingClass()));
10643     if (!NamingClass) {
10644       R.clear();
10645       return ExprError();
10646     }
10647 
10648     R.setNamingClass(NamingClass);
10649   }
10650 
10651   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
10652 
10653   // If we have neither explicit template arguments, nor the template keyword,
10654   // it's a normal declaration name or member reference.
10655   if (!Old->hasExplicitTemplateArgs() && !TemplateKWLoc.isValid()) {
10656     NamedDecl *D = R.getAsSingle<NamedDecl>();
10657     // In a C++11 unevaluated context, an UnresolvedLookupExpr might refer to an
10658     // instance member. In other contexts, BuildPossibleImplicitMemberExpr will
10659     // give a good diagnostic.
10660     if (D && D->isCXXInstanceMember()) {
10661       return SemaRef.BuildPossibleImplicitMemberExpr(SS, TemplateKWLoc, R,
10662                                                      /*TemplateArgs=*/nullptr,
10663                                                      /*Scope=*/nullptr);
10664     }
10665 
10666     return getDerived().RebuildDeclarationNameExpr(SS, R, Old->requiresADL());
10667   }
10668 
10669   // If we have template arguments, rebuild them, then rebuild the
10670   // templateid expression.
10671   TemplateArgumentListInfo TransArgs(Old->getLAngleLoc(), Old->getRAngleLoc());
10672   if (Old->hasExplicitTemplateArgs() &&
10673       getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
10674                                               Old->getNumTemplateArgs(),
10675                                               TransArgs)) {
10676     R.clear();
10677     return ExprError();
10678   }
10679 
10680   return getDerived().RebuildTemplateIdExpr(SS, TemplateKWLoc, R,
10681                                             Old->requiresADL(), &TransArgs);
10682 }
10683 
10684 template<typename Derived>
10685 ExprResult
10686 TreeTransform<Derived>::TransformTypeTraitExpr(TypeTraitExpr *E) {
10687   bool ArgChanged = false;
10688   SmallVector<TypeSourceInfo *, 4> Args;
10689   for (unsigned I = 0, N = E->getNumArgs(); I != N; ++I) {
10690     TypeSourceInfo *From = E->getArg(I);
10691     TypeLoc FromTL = From->getTypeLoc();
10692     if (!FromTL.getAs<PackExpansionTypeLoc>()) {
10693       TypeLocBuilder TLB;
10694       TLB.reserve(FromTL.getFullDataSize());
10695       QualType To = getDerived().TransformType(TLB, FromTL);
10696       if (To.isNull())
10697         return ExprError();
10698 
10699       if (To == From->getType())
10700         Args.push_back(From);
10701       else {
10702         Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10703         ArgChanged = true;
10704       }
10705       continue;
10706     }
10707 
10708     ArgChanged = true;
10709 
10710     // We have a pack expansion. Instantiate it.
10711     PackExpansionTypeLoc ExpansionTL = FromTL.castAs<PackExpansionTypeLoc>();
10712     TypeLoc PatternTL = ExpansionTL.getPatternLoc();
10713     SmallVector<UnexpandedParameterPack, 2> Unexpanded;
10714     SemaRef.collectUnexpandedParameterPacks(PatternTL, Unexpanded);
10715 
10716     // Determine whether the set of unexpanded parameter packs can and should
10717     // be expanded.
10718     bool Expand = true;
10719     bool RetainExpansion = false;
10720     Optional<unsigned> OrigNumExpansions =
10721         ExpansionTL.getTypePtr()->getNumExpansions();
10722     Optional<unsigned> NumExpansions = OrigNumExpansions;
10723     if (getDerived().TryExpandParameterPacks(ExpansionTL.getEllipsisLoc(),
10724                                              PatternTL.getSourceRange(),
10725                                              Unexpanded,
10726                                              Expand, RetainExpansion,
10727                                              NumExpansions))
10728       return ExprError();
10729 
10730     if (!Expand) {
10731       // The transform has determined that we should perform a simple
10732       // transformation on the pack expansion, producing another pack
10733       // expansion.
10734       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
10735 
10736       TypeLocBuilder TLB;
10737       TLB.reserve(From->getTypeLoc().getFullDataSize());
10738 
10739       QualType To = getDerived().TransformType(TLB, PatternTL);
10740       if (To.isNull())
10741         return ExprError();
10742 
10743       To = getDerived().RebuildPackExpansionType(To,
10744                                                  PatternTL.getSourceRange(),
10745                                                  ExpansionTL.getEllipsisLoc(),
10746                                                  NumExpansions);
10747       if (To.isNull())
10748         return ExprError();
10749 
10750       PackExpansionTypeLoc ToExpansionTL
10751         = TLB.push<PackExpansionTypeLoc>(To);
10752       ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10753       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10754       continue;
10755     }
10756 
10757     // Expand the pack expansion by substituting for each argument in the
10758     // pack(s).
10759     for (unsigned I = 0; I != *NumExpansions; ++I) {
10760       Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(SemaRef, I);
10761       TypeLocBuilder TLB;
10762       TLB.reserve(PatternTL.getFullDataSize());
10763       QualType To = getDerived().TransformType(TLB, PatternTL);
10764       if (To.isNull())
10765         return ExprError();
10766 
10767       if (To->containsUnexpandedParameterPack()) {
10768         To = getDerived().RebuildPackExpansionType(To,
10769                                                    PatternTL.getSourceRange(),
10770                                                    ExpansionTL.getEllipsisLoc(),
10771                                                    NumExpansions);
10772         if (To.isNull())
10773           return ExprError();
10774 
10775         PackExpansionTypeLoc ToExpansionTL
10776           = TLB.push<PackExpansionTypeLoc>(To);
10777         ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10778       }
10779 
10780       Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10781     }
10782 
10783     if (!RetainExpansion)
10784       continue;
10785 
10786     // If we're supposed to retain a pack expansion, do so by temporarily
10787     // forgetting the partially-substituted parameter pack.
10788     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
10789 
10790     TypeLocBuilder TLB;
10791     TLB.reserve(From->getTypeLoc().getFullDataSize());
10792 
10793     QualType To = getDerived().TransformType(TLB, PatternTL);
10794     if (To.isNull())
10795       return ExprError();
10796 
10797     To = getDerived().RebuildPackExpansionType(To,
10798                                                PatternTL.getSourceRange(),
10799                                                ExpansionTL.getEllipsisLoc(),
10800                                                NumExpansions);
10801     if (To.isNull())
10802       return ExprError();
10803 
10804     PackExpansionTypeLoc ToExpansionTL
10805       = TLB.push<PackExpansionTypeLoc>(To);
10806     ToExpansionTL.setEllipsisLoc(ExpansionTL.getEllipsisLoc());
10807     Args.push_back(TLB.getTypeSourceInfo(SemaRef.Context, To));
10808   }
10809 
10810   if (!getDerived().AlwaysRebuild() && !ArgChanged)
10811     return E;
10812 
10813   return getDerived().RebuildTypeTrait(E->getTrait(), E->getBeginLoc(), Args,
10814                                        E->getEndLoc());
10815 }
10816 
10817 template<typename Derived>
10818 ExprResult
10819 TreeTransform<Derived>::TransformArrayTypeTraitExpr(ArrayTypeTraitExpr *E) {
10820   TypeSourceInfo *T = getDerived().TransformType(E->getQueriedTypeSourceInfo());
10821   if (!T)
10822     return ExprError();
10823 
10824   if (!getDerived().AlwaysRebuild() &&
10825       T == E->getQueriedTypeSourceInfo())
10826     return E;
10827 
10828   ExprResult SubExpr;
10829   {
10830     EnterExpressionEvaluationContext Unevaluated(
10831         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10832     SubExpr = getDerived().TransformExpr(E->getDimensionExpression());
10833     if (SubExpr.isInvalid())
10834       return ExprError();
10835 
10836     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getDimensionExpression())
10837       return E;
10838   }
10839 
10840   return getDerived().RebuildArrayTypeTrait(E->getTrait(), E->getBeginLoc(), T,
10841                                             SubExpr.get(), E->getEndLoc());
10842 }
10843 
10844 template<typename Derived>
10845 ExprResult
10846 TreeTransform<Derived>::TransformExpressionTraitExpr(ExpressionTraitExpr *E) {
10847   ExprResult SubExpr;
10848   {
10849     EnterExpressionEvaluationContext Unevaluated(
10850         SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
10851     SubExpr = getDerived().TransformExpr(E->getQueriedExpression());
10852     if (SubExpr.isInvalid())
10853       return ExprError();
10854 
10855     if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getQueriedExpression())
10856       return E;
10857   }
10858 
10859   return getDerived().RebuildExpressionTrait(E->getTrait(), E->getBeginLoc(),
10860                                              SubExpr.get(), E->getEndLoc());
10861 }
10862 
10863 template <typename Derived>
10864 ExprResult TreeTransform<Derived>::TransformParenDependentScopeDeclRefExpr(
10865     ParenExpr *PE, DependentScopeDeclRefExpr *DRE, bool AddrTaken,
10866     TypeSourceInfo **RecoveryTSI) {
10867   ExprResult NewDRE = getDerived().TransformDependentScopeDeclRefExpr(
10868       DRE, AddrTaken, RecoveryTSI);
10869 
10870   // Propagate both errors and recovered types, which return ExprEmpty.
10871   if (!NewDRE.isUsable())
10872     return NewDRE;
10873 
10874   // We got an expr, wrap it up in parens.
10875   if (!getDerived().AlwaysRebuild() && NewDRE.get() == DRE)
10876     return PE;
10877   return getDerived().RebuildParenExpr(NewDRE.get(), PE->getLParen(),
10878                                        PE->getRParen());
10879 }
10880 
10881 template <typename Derived>
10882 ExprResult TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10883     DependentScopeDeclRefExpr *E) {
10884   return TransformDependentScopeDeclRefExpr(E, /*IsAddressOfOperand=*/false,
10885                                             nullptr);
10886 }
10887 
10888 template<typename Derived>
10889 ExprResult
10890 TreeTransform<Derived>::TransformDependentScopeDeclRefExpr(
10891                                                DependentScopeDeclRefExpr *E,
10892                                                bool IsAddressOfOperand,
10893                                                TypeSourceInfo **RecoveryTSI) {
10894   assert(E->getQualifierLoc());
10895   NestedNameSpecifierLoc QualifierLoc
10896   = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc());
10897   if (!QualifierLoc)
10898     return ExprError();
10899   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
10900 
10901   // TODO: If this is a conversion-function-id, verify that the
10902   // destination type name (if present) resolves the same way after
10903   // instantiation as it did in the local scope.
10904 
10905   DeclarationNameInfo NameInfo
10906     = getDerived().TransformDeclarationNameInfo(E->getNameInfo());
10907   if (!NameInfo.getName())
10908     return ExprError();
10909 
10910   if (!E->hasExplicitTemplateArgs()) {
10911     if (!getDerived().AlwaysRebuild() &&
10912         QualifierLoc == E->getQualifierLoc() &&
10913         // Note: it is sufficient to compare the Name component of NameInfo:
10914         // if name has not changed, DNLoc has not changed either.
10915         NameInfo.getName() == E->getDeclName())
10916       return E;
10917 
10918     return getDerived().RebuildDependentScopeDeclRefExpr(
10919         QualifierLoc, TemplateKWLoc, NameInfo, /*TemplateArgs=*/nullptr,
10920         IsAddressOfOperand, RecoveryTSI);
10921   }
10922 
10923   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
10924   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
10925                                               E->getNumTemplateArgs(),
10926                                               TransArgs))
10927     return ExprError();
10928 
10929   return getDerived().RebuildDependentScopeDeclRefExpr(
10930       QualifierLoc, TemplateKWLoc, NameInfo, &TransArgs, IsAddressOfOperand,
10931       RecoveryTSI);
10932 }
10933 
10934 template<typename Derived>
10935 ExprResult
10936 TreeTransform<Derived>::TransformCXXConstructExpr(CXXConstructExpr *E) {
10937   // CXXConstructExprs other than for list-initialization and
10938   // CXXTemporaryObjectExpr are always implicit, so when we have
10939   // a 1-argument construction we just transform that argument.
10940   if ((E->getNumArgs() == 1 ||
10941        (E->getNumArgs() > 1 && getDerived().DropCallArgument(E->getArg(1)))) &&
10942       (!getDerived().DropCallArgument(E->getArg(0))) &&
10943       !E->isListInitialization())
10944     return getDerived().TransformExpr(E->getArg(0));
10945 
10946   TemporaryBase Rebase(*this, /*FIXME*/ E->getBeginLoc(), DeclarationName());
10947 
10948   QualType T = getDerived().TransformType(E->getType());
10949   if (T.isNull())
10950     return ExprError();
10951 
10952   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10953       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
10954   if (!Constructor)
10955     return ExprError();
10956 
10957   bool ArgumentChanged = false;
10958   SmallVector<Expr*, 8> Args;
10959   {
10960     EnterExpressionEvaluationContext Context(
10961         getSema(), EnterExpressionEvaluationContext::InitList,
10962         E->isListInitialization());
10963     if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
10964                                     &ArgumentChanged))
10965       return ExprError();
10966   }
10967 
10968   if (!getDerived().AlwaysRebuild() &&
10969       T == E->getType() &&
10970       Constructor == E->getConstructor() &&
10971       !ArgumentChanged) {
10972     // Mark the constructor as referenced.
10973     // FIXME: Instantiation-specific
10974     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
10975     return E;
10976   }
10977 
10978   return getDerived().RebuildCXXConstructExpr(
10979       T, /*FIXME:*/ E->getBeginLoc(), Constructor, E->isElidable(), Args,
10980       E->hadMultipleCandidates(), E->isListInitialization(),
10981       E->isStdInitListInitialization(), E->requiresZeroInitialization(),
10982       E->getConstructionKind(), E->getParenOrBraceRange());
10983 }
10984 
10985 template<typename Derived>
10986 ExprResult TreeTransform<Derived>::TransformCXXInheritedCtorInitExpr(
10987     CXXInheritedCtorInitExpr *E) {
10988   QualType T = getDerived().TransformType(E->getType());
10989   if (T.isNull())
10990     return ExprError();
10991 
10992   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
10993       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
10994   if (!Constructor)
10995     return ExprError();
10996 
10997   if (!getDerived().AlwaysRebuild() &&
10998       T == E->getType() &&
10999       Constructor == E->getConstructor()) {
11000     // Mark the constructor as referenced.
11001     // FIXME: Instantiation-specific
11002     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11003     return E;
11004   }
11005 
11006   return getDerived().RebuildCXXInheritedCtorInitExpr(
11007       T, E->getLocation(), Constructor,
11008       E->constructsVBase(), E->inheritedFromVBase());
11009 }
11010 
11011 /// Transform a C++ temporary-binding expression.
11012 ///
11013 /// Since CXXBindTemporaryExpr nodes are implicitly generated, we just
11014 /// transform the subexpression and return that.
11015 template<typename Derived>
11016 ExprResult
11017 TreeTransform<Derived>::TransformCXXBindTemporaryExpr(CXXBindTemporaryExpr *E) {
11018   return getDerived().TransformExpr(E->getSubExpr());
11019 }
11020 
11021 /// Transform a C++ expression that contains cleanups that should
11022 /// be run after the expression is evaluated.
11023 ///
11024 /// Since ExprWithCleanups nodes are implicitly generated, we
11025 /// just transform the subexpression and return that.
11026 template<typename Derived>
11027 ExprResult
11028 TreeTransform<Derived>::TransformExprWithCleanups(ExprWithCleanups *E) {
11029   return getDerived().TransformExpr(E->getSubExpr());
11030 }
11031 
11032 template<typename Derived>
11033 ExprResult
11034 TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
11035                                                     CXXTemporaryObjectExpr *E) {
11036   TypeSourceInfo *T =
11037       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11038   if (!T)
11039     return ExprError();
11040 
11041   CXXConstructorDecl *Constructor = cast_or_null<CXXConstructorDecl>(
11042       getDerived().TransformDecl(E->getBeginLoc(), E->getConstructor()));
11043   if (!Constructor)
11044     return ExprError();
11045 
11046   bool ArgumentChanged = false;
11047   SmallVector<Expr*, 8> Args;
11048   Args.reserve(E->getNumArgs());
11049   {
11050     EnterExpressionEvaluationContext Context(
11051         getSema(), EnterExpressionEvaluationContext::InitList,
11052         E->isListInitialization());
11053     if (TransformExprs(E->getArgs(), E->getNumArgs(), true, Args,
11054                        &ArgumentChanged))
11055       return ExprError();
11056   }
11057 
11058   if (!getDerived().AlwaysRebuild() &&
11059       T == E->getTypeSourceInfo() &&
11060       Constructor == E->getConstructor() &&
11061       !ArgumentChanged) {
11062     // FIXME: Instantiation-specific
11063     SemaRef.MarkFunctionReferenced(E->getBeginLoc(), Constructor);
11064     return SemaRef.MaybeBindToTemporary(E);
11065   }
11066 
11067   // FIXME: We should just pass E->isListInitialization(), but we're not
11068   // prepared to handle list-initialization without a child InitListExpr.
11069   SourceLocation LParenLoc = T->getTypeLoc().getEndLoc();
11070   return getDerived().RebuildCXXTemporaryObjectExpr(
11071       T, LParenLoc, Args, E->getEndLoc(),
11072       /*ListInitialization=*/LParenLoc.isInvalid());
11073 }
11074 
11075 template<typename Derived>
11076 ExprResult
11077 TreeTransform<Derived>::TransformLambdaExpr(LambdaExpr *E) {
11078   // Transform any init-capture expressions before entering the scope of the
11079   // lambda body, because they are not semantically within that scope.
11080   typedef std::pair<ExprResult, QualType> InitCaptureInfoTy;
11081   SmallVector<InitCaptureInfoTy, 8> InitCaptureExprsAndTypes;
11082   InitCaptureExprsAndTypes.resize(E->explicit_capture_end() -
11083                                   E->explicit_capture_begin());
11084   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11085                                     CEnd = E->capture_end();
11086        C != CEnd; ++C) {
11087     if (!E->isInitCapture(C))
11088       continue;
11089     EnterExpressionEvaluationContext EEEC(
11090         getSema(), Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11091     ExprResult NewExprInitResult = getDerived().TransformInitializer(
11092         C->getCapturedVar()->getInit(),
11093         C->getCapturedVar()->getInitStyle() == VarDecl::CallInit);
11094 
11095     if (NewExprInitResult.isInvalid())
11096       return ExprError();
11097     Expr *NewExprInit = NewExprInitResult.get();
11098 
11099     VarDecl *OldVD = C->getCapturedVar();
11100     QualType NewInitCaptureType =
11101         getSema().buildLambdaInitCaptureInitialization(
11102             C->getLocation(), OldVD->getType()->isReferenceType(),
11103             OldVD->getIdentifier(),
11104             C->getCapturedVar()->getInitStyle() != VarDecl::CInit, NewExprInit);
11105     NewExprInitResult = NewExprInit;
11106     InitCaptureExprsAndTypes[C - E->capture_begin()] =
11107         std::make_pair(NewExprInitResult, NewInitCaptureType);
11108   }
11109 
11110   // Transform the template parameters, and add them to the current
11111   // instantiation scope. The null case is handled correctly.
11112   auto TPL = getDerived().TransformTemplateParameterList(
11113       E->getTemplateParameterList());
11114 
11115   // Transform the type of the original lambda's call operator.
11116   // The transformation MUST be done in the CurrentInstantiationScope since
11117   // it introduces a mapping of the original to the newly created
11118   // transformed parameters.
11119   TypeSourceInfo *NewCallOpTSI = nullptr;
11120   {
11121     TypeSourceInfo *OldCallOpTSI = E->getCallOperator()->getTypeSourceInfo();
11122     FunctionProtoTypeLoc OldCallOpFPTL =
11123         OldCallOpTSI->getTypeLoc().getAs<FunctionProtoTypeLoc>();
11124 
11125     TypeLocBuilder NewCallOpTLBuilder;
11126     SmallVector<QualType, 4> ExceptionStorage;
11127     TreeTransform *This = this; // Work around gcc.gnu.org/PR56135.
11128     QualType NewCallOpType = TransformFunctionProtoType(
11129         NewCallOpTLBuilder, OldCallOpFPTL, nullptr, Qualifiers(),
11130         [&](FunctionProtoType::ExceptionSpecInfo &ESI, bool &Changed) {
11131           return This->TransformExceptionSpec(OldCallOpFPTL.getBeginLoc(), ESI,
11132                                               ExceptionStorage, Changed);
11133         });
11134     if (NewCallOpType.isNull())
11135       return ExprError();
11136     NewCallOpTSI = NewCallOpTLBuilder.getTypeSourceInfo(getSema().Context,
11137                                                         NewCallOpType);
11138   }
11139 
11140   LambdaScopeInfo *LSI = getSema().PushLambdaScope();
11141   Sema::FunctionScopeRAII FuncScopeCleanup(getSema());
11142   LSI->GLTemplateParameterList = TPL;
11143 
11144   // Create the local class that will describe the lambda.
11145   CXXRecordDecl *Class
11146     = getSema().createLambdaClosureType(E->getIntroducerRange(),
11147                                         NewCallOpTSI,
11148                                         /*KnownDependent=*/false,
11149                                         E->getCaptureDefault());
11150   getDerived().transformedLocalDecl(E->getLambdaClass(), Class);
11151 
11152   // Build the call operator.
11153   CXXMethodDecl *NewCallOperator = getSema().startLambdaDefinition(
11154       Class, E->getIntroducerRange(), NewCallOpTSI,
11155       E->getCallOperator()->getEndLoc(),
11156       NewCallOpTSI->getTypeLoc().castAs<FunctionProtoTypeLoc>().getParams(),
11157       E->getCallOperator()->isConstexpr());
11158 
11159   LSI->CallOperator = NewCallOperator;
11160 
11161   for (unsigned I = 0, NumParams = NewCallOperator->getNumParams();
11162        I != NumParams; ++I) {
11163     auto *P = NewCallOperator->getParamDecl(I);
11164     if (P->hasUninstantiatedDefaultArg()) {
11165       EnterExpressionEvaluationContext Eval(
11166           getSema(),
11167           Sema::ExpressionEvaluationContext::PotentiallyEvaluatedIfUsed, P);
11168       ExprResult R = getDerived().TransformExpr(
11169           E->getCallOperator()->getParamDecl(I)->getDefaultArg());
11170       P->setDefaultArg(R.get());
11171     }
11172   }
11173 
11174   getDerived().transformAttrs(E->getCallOperator(), NewCallOperator);
11175   getDerived().transformedLocalDecl(E->getCallOperator(), NewCallOperator);
11176 
11177   // Introduce the context of the call operator.
11178   Sema::ContextRAII SavedContext(getSema(), NewCallOperator,
11179                                  /*NewThisContext*/false);
11180 
11181   // Enter the scope of the lambda.
11182   getSema().buildLambdaScope(LSI, NewCallOperator,
11183                              E->getIntroducerRange(),
11184                              E->getCaptureDefault(),
11185                              E->getCaptureDefaultLoc(),
11186                              E->hasExplicitParameters(),
11187                              E->hasExplicitResultType(),
11188                              E->isMutable());
11189 
11190   bool Invalid = false;
11191 
11192   // Transform captures.
11193   bool FinishedExplicitCaptures = false;
11194   for (LambdaExpr::capture_iterator C = E->capture_begin(),
11195                                  CEnd = E->capture_end();
11196        C != CEnd; ++C) {
11197     // When we hit the first implicit capture, tell Sema that we've finished
11198     // the list of explicit captures.
11199     if (!FinishedExplicitCaptures && C->isImplicit()) {
11200       getSema().finishLambdaExplicitCaptures(LSI);
11201       FinishedExplicitCaptures = true;
11202     }
11203 
11204     // Capturing 'this' is trivial.
11205     if (C->capturesThis()) {
11206       getSema().CheckCXXThisCapture(C->getLocation(), C->isExplicit(),
11207                                     /*BuildAndDiagnose*/ true, nullptr,
11208                                     C->getCaptureKind() == LCK_StarThis);
11209       continue;
11210     }
11211     // Captured expression will be recaptured during captured variables
11212     // rebuilding.
11213     if (C->capturesVLAType())
11214       continue;
11215 
11216     // Rebuild init-captures, including the implied field declaration.
11217     if (E->isInitCapture(C)) {
11218       InitCaptureInfoTy InitExprTypePair =
11219           InitCaptureExprsAndTypes[C - E->capture_begin()];
11220       ExprResult Init = InitExprTypePair.first;
11221       QualType InitQualType = InitExprTypePair.second;
11222       if (Init.isInvalid() || InitQualType.isNull()) {
11223         Invalid = true;
11224         continue;
11225       }
11226       VarDecl *OldVD = C->getCapturedVar();
11227       VarDecl *NewVD = getSema().createLambdaInitCaptureVarDecl(
11228           OldVD->getLocation(), InitExprTypePair.second, OldVD->getIdentifier(),
11229           OldVD->getInitStyle(), Init.get());
11230       if (!NewVD)
11231         Invalid = true;
11232       else {
11233         getDerived().transformedLocalDecl(OldVD, NewVD);
11234       }
11235       getSema().buildInitCaptureField(LSI, NewVD);
11236       continue;
11237     }
11238 
11239     assert(C->capturesVariable() && "unexpected kind of lambda capture");
11240 
11241     // Determine the capture kind for Sema.
11242     Sema::TryCaptureKind Kind
11243       = C->isImplicit()? Sema::TryCapture_Implicit
11244                        : C->getCaptureKind() == LCK_ByCopy
11245                            ? Sema::TryCapture_ExplicitByVal
11246                            : Sema::TryCapture_ExplicitByRef;
11247     SourceLocation EllipsisLoc;
11248     if (C->isPackExpansion()) {
11249       UnexpandedParameterPack Unexpanded(C->getCapturedVar(), C->getLocation());
11250       bool ShouldExpand = false;
11251       bool RetainExpansion = false;
11252       Optional<unsigned> NumExpansions;
11253       if (getDerived().TryExpandParameterPacks(C->getEllipsisLoc(),
11254                                                C->getLocation(),
11255                                                Unexpanded,
11256                                                ShouldExpand, RetainExpansion,
11257                                                NumExpansions)) {
11258         Invalid = true;
11259         continue;
11260       }
11261 
11262       if (ShouldExpand) {
11263         // The transform has determined that we should perform an expansion;
11264         // transform and capture each of the arguments.
11265         // expansion of the pattern. Do so.
11266         VarDecl *Pack = C->getCapturedVar();
11267         for (unsigned I = 0; I != *NumExpansions; ++I) {
11268           Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11269           VarDecl *CapturedVar
11270             = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11271                                                                Pack));
11272           if (!CapturedVar) {
11273             Invalid = true;
11274             continue;
11275           }
11276 
11277           // Capture the transformed variable.
11278           getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind);
11279         }
11280 
11281         // FIXME: Retain a pack expansion if RetainExpansion is true.
11282 
11283         continue;
11284       }
11285 
11286       EllipsisLoc = C->getEllipsisLoc();
11287     }
11288 
11289     // Transform the captured variable.
11290     VarDecl *CapturedVar
11291       = cast_or_null<VarDecl>(getDerived().TransformDecl(C->getLocation(),
11292                                                          C->getCapturedVar()));
11293     if (!CapturedVar || CapturedVar->isInvalidDecl()) {
11294       Invalid = true;
11295       continue;
11296     }
11297 
11298     // Capture the transformed variable.
11299     getSema().tryCaptureVariable(CapturedVar, C->getLocation(), Kind,
11300                                  EllipsisLoc);
11301   }
11302   if (!FinishedExplicitCaptures)
11303     getSema().finishLambdaExplicitCaptures(LSI);
11304 
11305   // Enter a new evaluation context to insulate the lambda from any
11306   // cleanups from the enclosing full-expression.
11307   getSema().PushExpressionEvaluationContext(
11308       Sema::ExpressionEvaluationContext::PotentiallyEvaluated);
11309 
11310   // Instantiate the body of the lambda expression.
11311   StmtResult Body =
11312       Invalid ? StmtError() : getDerived().TransformStmt(E->getBody());
11313 
11314   // ActOnLambda* will pop the function scope for us.
11315   FuncScopeCleanup.disable();
11316 
11317   if (Body.isInvalid()) {
11318     SavedContext.pop();
11319     getSema().ActOnLambdaError(E->getBeginLoc(), /*CurScope=*/nullptr,
11320                                /*IsInstantiation=*/true);
11321     return ExprError();
11322   }
11323 
11324   // Copy the LSI before ActOnFinishFunctionBody removes it.
11325   // FIXME: This is dumb. Store the lambda information somewhere that outlives
11326   // the call operator.
11327   auto LSICopy = *LSI;
11328   getSema().ActOnFinishFunctionBody(NewCallOperator, Body.get(),
11329                                     /*IsInstantiation*/ true);
11330   SavedContext.pop();
11331 
11332   return getSema().BuildLambdaExpr(E->getBeginLoc(), Body.get()->getEndLoc(),
11333                                    &LSICopy);
11334 }
11335 
11336 template<typename Derived>
11337 ExprResult
11338 TreeTransform<Derived>::TransformCXXUnresolvedConstructExpr(
11339                                                   CXXUnresolvedConstructExpr *E) {
11340   TypeSourceInfo *T =
11341       getDerived().TransformTypeWithDeducedTST(E->getTypeSourceInfo());
11342   if (!T)
11343     return ExprError();
11344 
11345   bool ArgumentChanged = false;
11346   SmallVector<Expr*, 8> Args;
11347   Args.reserve(E->arg_size());
11348   {
11349     EnterExpressionEvaluationContext Context(
11350         getSema(), EnterExpressionEvaluationContext::InitList,
11351         E->isListInitialization());
11352     if (getDerived().TransformExprs(E->arg_begin(), E->arg_size(), true, Args,
11353                                     &ArgumentChanged))
11354       return ExprError();
11355   }
11356 
11357   if (!getDerived().AlwaysRebuild() &&
11358       T == E->getTypeSourceInfo() &&
11359       !ArgumentChanged)
11360     return E;
11361 
11362   // FIXME: we're faking the locations of the commas
11363   return getDerived().RebuildCXXUnresolvedConstructExpr(
11364       T, E->getLParenLoc(), Args, E->getRParenLoc(), E->isListInitialization());
11365 }
11366 
11367 template<typename Derived>
11368 ExprResult
11369 TreeTransform<Derived>::TransformCXXDependentScopeMemberExpr(
11370                                              CXXDependentScopeMemberExpr *E) {
11371   // Transform the base of the expression.
11372   ExprResult Base((Expr*) nullptr);
11373   Expr *OldBase;
11374   QualType BaseType;
11375   QualType ObjectType;
11376   if (!E->isImplicitAccess()) {
11377     OldBase = E->getBase();
11378     Base = getDerived().TransformExpr(OldBase);
11379     if (Base.isInvalid())
11380       return ExprError();
11381 
11382     // Start the member reference and compute the object's type.
11383     ParsedType ObjectTy;
11384     bool MayBePseudoDestructor = false;
11385     Base = SemaRef.ActOnStartCXXMemberReference(nullptr, Base.get(),
11386                                                 E->getOperatorLoc(),
11387                                       E->isArrow()? tok::arrow : tok::period,
11388                                                 ObjectTy,
11389                                                 MayBePseudoDestructor);
11390     if (Base.isInvalid())
11391       return ExprError();
11392 
11393     ObjectType = ObjectTy.get();
11394     BaseType = ((Expr*) Base.get())->getType();
11395   } else {
11396     OldBase = nullptr;
11397     BaseType = getDerived().TransformType(E->getBaseType());
11398     ObjectType = BaseType->getAs<PointerType>()->getPointeeType();
11399   }
11400 
11401   // Transform the first part of the nested-name-specifier that qualifies
11402   // the member name.
11403   NamedDecl *FirstQualifierInScope
11404     = getDerived().TransformFirstQualifierInScope(
11405                                             E->getFirstQualifierFoundInScope(),
11406                                             E->getQualifierLoc().getBeginLoc());
11407 
11408   NestedNameSpecifierLoc QualifierLoc;
11409   if (E->getQualifier()) {
11410     QualifierLoc
11411       = getDerived().TransformNestedNameSpecifierLoc(E->getQualifierLoc(),
11412                                                      ObjectType,
11413                                                      FirstQualifierInScope);
11414     if (!QualifierLoc)
11415       return ExprError();
11416   }
11417 
11418   SourceLocation TemplateKWLoc = E->getTemplateKeywordLoc();
11419 
11420   // TODO: If this is a conversion-function-id, verify that the
11421   // destination type name (if present) resolves the same way after
11422   // instantiation as it did in the local scope.
11423 
11424   DeclarationNameInfo NameInfo
11425     = getDerived().TransformDeclarationNameInfo(E->getMemberNameInfo());
11426   if (!NameInfo.getName())
11427     return ExprError();
11428 
11429   if (!E->hasExplicitTemplateArgs()) {
11430     // This is a reference to a member without an explicitly-specified
11431     // template argument list. Optimize for this common case.
11432     if (!getDerived().AlwaysRebuild() &&
11433         Base.get() == OldBase &&
11434         BaseType == E->getBaseType() &&
11435         QualifierLoc == E->getQualifierLoc() &&
11436         NameInfo.getName() == E->getMember() &&
11437         FirstQualifierInScope == E->getFirstQualifierFoundInScope())
11438       return E;
11439 
11440     return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11441                                                        BaseType,
11442                                                        E->isArrow(),
11443                                                        E->getOperatorLoc(),
11444                                                        QualifierLoc,
11445                                                        TemplateKWLoc,
11446                                                        FirstQualifierInScope,
11447                                                        NameInfo,
11448                                                        /*TemplateArgs*/nullptr);
11449   }
11450 
11451   TemplateArgumentListInfo TransArgs(E->getLAngleLoc(), E->getRAngleLoc());
11452   if (getDerived().TransformTemplateArguments(E->getTemplateArgs(),
11453                                               E->getNumTemplateArgs(),
11454                                               TransArgs))
11455     return ExprError();
11456 
11457   return getDerived().RebuildCXXDependentScopeMemberExpr(Base.get(),
11458                                                      BaseType,
11459                                                      E->isArrow(),
11460                                                      E->getOperatorLoc(),
11461                                                      QualifierLoc,
11462                                                      TemplateKWLoc,
11463                                                      FirstQualifierInScope,
11464                                                      NameInfo,
11465                                                      &TransArgs);
11466 }
11467 
11468 template<typename Derived>
11469 ExprResult
11470 TreeTransform<Derived>::TransformUnresolvedMemberExpr(UnresolvedMemberExpr *Old) {
11471   // Transform the base of the expression.
11472   ExprResult Base((Expr*) nullptr);
11473   QualType BaseType;
11474   if (!Old->isImplicitAccess()) {
11475     Base = getDerived().TransformExpr(Old->getBase());
11476     if (Base.isInvalid())
11477       return ExprError();
11478     Base = getSema().PerformMemberExprBaseConversion(Base.get(),
11479                                                      Old->isArrow());
11480     if (Base.isInvalid())
11481       return ExprError();
11482     BaseType = Base.get()->getType();
11483   } else {
11484     BaseType = getDerived().TransformType(Old->getBaseType());
11485   }
11486 
11487   NestedNameSpecifierLoc QualifierLoc;
11488   if (Old->getQualifierLoc()) {
11489     QualifierLoc
11490     = getDerived().TransformNestedNameSpecifierLoc(Old->getQualifierLoc());
11491     if (!QualifierLoc)
11492       return ExprError();
11493   }
11494 
11495   SourceLocation TemplateKWLoc = Old->getTemplateKeywordLoc();
11496 
11497   LookupResult R(SemaRef, Old->getMemberNameInfo(),
11498                  Sema::LookupOrdinaryName);
11499 
11500   // Transform the declaration set.
11501   if (TransformOverloadExprDecls(Old, /*RequiresADL*/false, R))
11502     return ExprError();
11503 
11504   // Determine the naming class.
11505   if (Old->getNamingClass()) {
11506     CXXRecordDecl *NamingClass
11507       = cast_or_null<CXXRecordDecl>(getDerived().TransformDecl(
11508                                                           Old->getMemberLoc(),
11509                                                         Old->getNamingClass()));
11510     if (!NamingClass)
11511       return ExprError();
11512 
11513     R.setNamingClass(NamingClass);
11514   }
11515 
11516   TemplateArgumentListInfo TransArgs;
11517   if (Old->hasExplicitTemplateArgs()) {
11518     TransArgs.setLAngleLoc(Old->getLAngleLoc());
11519     TransArgs.setRAngleLoc(Old->getRAngleLoc());
11520     if (getDerived().TransformTemplateArguments(Old->getTemplateArgs(),
11521                                                 Old->getNumTemplateArgs(),
11522                                                 TransArgs))
11523       return ExprError();
11524   }
11525 
11526   // FIXME: to do this check properly, we will need to preserve the
11527   // first-qualifier-in-scope here, just in case we had a dependent
11528   // base (and therefore couldn't do the check) and a
11529   // nested-name-qualifier (and therefore could do the lookup).
11530   NamedDecl *FirstQualifierInScope = nullptr;
11531 
11532   return getDerived().RebuildUnresolvedMemberExpr(Base.get(),
11533                                                   BaseType,
11534                                                   Old->getOperatorLoc(),
11535                                                   Old->isArrow(),
11536                                                   QualifierLoc,
11537                                                   TemplateKWLoc,
11538                                                   FirstQualifierInScope,
11539                                                   R,
11540                                               (Old->hasExplicitTemplateArgs()
11541                                                   ? &TransArgs : nullptr));
11542 }
11543 
11544 template<typename Derived>
11545 ExprResult
11546 TreeTransform<Derived>::TransformCXXNoexceptExpr(CXXNoexceptExpr *E) {
11547   EnterExpressionEvaluationContext Unevaluated(
11548       SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
11549   ExprResult SubExpr = getDerived().TransformExpr(E->getOperand());
11550   if (SubExpr.isInvalid())
11551     return ExprError();
11552 
11553   if (!getDerived().AlwaysRebuild() && SubExpr.get() == E->getOperand())
11554     return E;
11555 
11556   return getDerived().RebuildCXXNoexceptExpr(E->getSourceRange(),SubExpr.get());
11557 }
11558 
11559 template<typename Derived>
11560 ExprResult
11561 TreeTransform<Derived>::TransformPackExpansionExpr(PackExpansionExpr *E) {
11562   ExprResult Pattern = getDerived().TransformExpr(E->getPattern());
11563   if (Pattern.isInvalid())
11564     return ExprError();
11565 
11566   if (!getDerived().AlwaysRebuild() && Pattern.get() == E->getPattern())
11567     return E;
11568 
11569   return getDerived().RebuildPackExpansion(Pattern.get(), E->getEllipsisLoc(),
11570                                            E->getNumExpansions());
11571 }
11572 
11573 template<typename Derived>
11574 ExprResult
11575 TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) {
11576   // If E is not value-dependent, then nothing will change when we transform it.
11577   // Note: This is an instantiation-centric view.
11578   if (!E->isValueDependent())
11579     return E;
11580 
11581   EnterExpressionEvaluationContext Unevaluated(
11582       getSema(), Sema::ExpressionEvaluationContext::Unevaluated);
11583 
11584   ArrayRef<TemplateArgument> PackArgs;
11585   TemplateArgument ArgStorage;
11586 
11587   // Find the argument list to transform.
11588   if (E->isPartiallySubstituted()) {
11589     PackArgs = E->getPartialArguments();
11590   } else if (E->isValueDependent()) {
11591     UnexpandedParameterPack Unexpanded(E->getPack(), E->getPackLoc());
11592     bool ShouldExpand = false;
11593     bool RetainExpansion = false;
11594     Optional<unsigned> NumExpansions;
11595     if (getDerived().TryExpandParameterPacks(E->getOperatorLoc(), E->getPackLoc(),
11596                                              Unexpanded,
11597                                              ShouldExpand, RetainExpansion,
11598                                              NumExpansions))
11599       return ExprError();
11600 
11601     // If we need to expand the pack, build a template argument from it and
11602     // expand that.
11603     if (ShouldExpand) {
11604       auto *Pack = E->getPack();
11605       if (auto *TTPD = dyn_cast<TemplateTypeParmDecl>(Pack)) {
11606         ArgStorage = getSema().Context.getPackExpansionType(
11607             getSema().Context.getTypeDeclType(TTPD), None);
11608       } else if (auto *TTPD = dyn_cast<TemplateTemplateParmDecl>(Pack)) {
11609         ArgStorage = TemplateArgument(TemplateName(TTPD), None);
11610       } else {
11611         auto *VD = cast<ValueDecl>(Pack);
11612         ExprResult DRE = getSema().BuildDeclRefExpr(
11613             VD, VD->getType().getNonLValueExprType(getSema().Context),
11614             VD->getType()->isReferenceType() ? VK_LValue : VK_RValue,
11615             E->getPackLoc());
11616         if (DRE.isInvalid())
11617           return ExprError();
11618         ArgStorage = new (getSema().Context) PackExpansionExpr(
11619             getSema().Context.DependentTy, DRE.get(), E->getPackLoc(), None);
11620       }
11621       PackArgs = ArgStorage;
11622     }
11623   }
11624 
11625   // If we're not expanding the pack, just transform the decl.
11626   if (!PackArgs.size()) {
11627     auto *Pack = cast_or_null<NamedDecl>(
11628         getDerived().TransformDecl(E->getPackLoc(), E->getPack()));
11629     if (!Pack)
11630       return ExprError();
11631     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), Pack,
11632                                               E->getPackLoc(),
11633                                               E->getRParenLoc(), None, None);
11634   }
11635 
11636   // Try to compute the result without performing a partial substitution.
11637   Optional<unsigned> Result = 0;
11638   for (const TemplateArgument &Arg : PackArgs) {
11639     if (!Arg.isPackExpansion()) {
11640       Result = *Result + 1;
11641       continue;
11642     }
11643 
11644     TemplateArgumentLoc ArgLoc;
11645     InventTemplateArgumentLoc(Arg, ArgLoc);
11646 
11647     // Find the pattern of the pack expansion.
11648     SourceLocation Ellipsis;
11649     Optional<unsigned> OrigNumExpansions;
11650     TemplateArgumentLoc Pattern =
11651         getSema().getTemplateArgumentPackExpansionPattern(ArgLoc, Ellipsis,
11652                                                           OrigNumExpansions);
11653 
11654     // Substitute under the pack expansion. Do not expand the pack (yet).
11655     TemplateArgumentLoc OutPattern;
11656     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11657     if (getDerived().TransformTemplateArgument(Pattern, OutPattern,
11658                                                /*Uneval*/ true))
11659       return true;
11660 
11661     // See if we can determine the number of arguments from the result.
11662     Optional<unsigned> NumExpansions =
11663         getSema().getFullyPackExpandedSize(OutPattern.getArgument());
11664     if (!NumExpansions) {
11665       // No: we must be in an alias template expansion, and we're going to need
11666       // to actually expand the packs.
11667       Result = None;
11668       break;
11669     }
11670 
11671     Result = *Result + *NumExpansions;
11672   }
11673 
11674   // Common case: we could determine the number of expansions without
11675   // substituting.
11676   if (Result)
11677     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11678                                               E->getPackLoc(),
11679                                               E->getRParenLoc(), *Result, None);
11680 
11681   TemplateArgumentListInfo TransformedPackArgs(E->getPackLoc(),
11682                                                E->getPackLoc());
11683   {
11684     TemporaryBase Rebase(*this, E->getPackLoc(), getBaseEntity());
11685     typedef TemplateArgumentLocInventIterator<
11686         Derived, const TemplateArgument*> PackLocIterator;
11687     if (TransformTemplateArguments(PackLocIterator(*this, PackArgs.begin()),
11688                                    PackLocIterator(*this, PackArgs.end()),
11689                                    TransformedPackArgs, /*Uneval*/true))
11690       return ExprError();
11691   }
11692 
11693   // Check whether we managed to fully-expand the pack.
11694   // FIXME: Is it possible for us to do so and not hit the early exit path?
11695   SmallVector<TemplateArgument, 8> Args;
11696   bool PartialSubstitution = false;
11697   for (auto &Loc : TransformedPackArgs.arguments()) {
11698     Args.push_back(Loc.getArgument());
11699     if (Loc.getArgument().isPackExpansion())
11700       PartialSubstitution = true;
11701   }
11702 
11703   if (PartialSubstitution)
11704     return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11705                                               E->getPackLoc(),
11706                                               E->getRParenLoc(), None, Args);
11707 
11708   return getDerived().RebuildSizeOfPackExpr(E->getOperatorLoc(), E->getPack(),
11709                                             E->getPackLoc(), E->getRParenLoc(),
11710                                             Args.size(), None);
11711 }
11712 
11713 template<typename Derived>
11714 ExprResult
11715 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmPackExpr(
11716                                           SubstNonTypeTemplateParmPackExpr *E) {
11717   // Default behavior is to do nothing with this transformation.
11718   return E;
11719 }
11720 
11721 template<typename Derived>
11722 ExprResult
11723 TreeTransform<Derived>::TransformSubstNonTypeTemplateParmExpr(
11724                                           SubstNonTypeTemplateParmExpr *E) {
11725   // Default behavior is to do nothing with this transformation.
11726   return E;
11727 }
11728 
11729 template<typename Derived>
11730 ExprResult
11731 TreeTransform<Derived>::TransformFunctionParmPackExpr(FunctionParmPackExpr *E) {
11732   // Default behavior is to do nothing with this transformation.
11733   return E;
11734 }
11735 
11736 template<typename Derived>
11737 ExprResult
11738 TreeTransform<Derived>::TransformMaterializeTemporaryExpr(
11739                                                   MaterializeTemporaryExpr *E) {
11740   return getDerived().TransformExpr(E->GetTemporaryExpr());
11741 }
11742 
11743 template<typename Derived>
11744 ExprResult
11745 TreeTransform<Derived>::TransformCXXFoldExpr(CXXFoldExpr *E) {
11746   Expr *Pattern = E->getPattern();
11747 
11748   SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11749   getSema().collectUnexpandedParameterPacks(Pattern, Unexpanded);
11750   assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11751 
11752   // Determine whether the set of unexpanded parameter packs can and should
11753   // be expanded.
11754   bool Expand = true;
11755   bool RetainExpansion = false;
11756   Optional<unsigned> NumExpansions;
11757   if (getDerived().TryExpandParameterPacks(E->getEllipsisLoc(),
11758                                            Pattern->getSourceRange(),
11759                                            Unexpanded,
11760                                            Expand, RetainExpansion,
11761                                            NumExpansions))
11762     return true;
11763 
11764   if (!Expand) {
11765     // Do not expand any packs here, just transform and rebuild a fold
11766     // expression.
11767     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11768 
11769     ExprResult LHS =
11770         E->getLHS() ? getDerived().TransformExpr(E->getLHS()) : ExprResult();
11771     if (LHS.isInvalid())
11772       return true;
11773 
11774     ExprResult RHS =
11775         E->getRHS() ? getDerived().TransformExpr(E->getRHS()) : ExprResult();
11776     if (RHS.isInvalid())
11777       return true;
11778 
11779     if (!getDerived().AlwaysRebuild() &&
11780         LHS.get() == E->getLHS() && RHS.get() == E->getRHS())
11781       return E;
11782 
11783     return getDerived().RebuildCXXFoldExpr(
11784         E->getBeginLoc(), LHS.get(), E->getOperator(), E->getEllipsisLoc(),
11785         RHS.get(), E->getEndLoc());
11786   }
11787 
11788   // The transform has determined that we should perform an elementwise
11789   // expansion of the pattern. Do so.
11790   ExprResult Result = getDerived().TransformExpr(E->getInit());
11791   if (Result.isInvalid())
11792     return true;
11793   bool LeftFold = E->isLeftFold();
11794 
11795   // If we're retaining an expansion for a right fold, it is the innermost
11796   // component and takes the init (if any).
11797   if (!LeftFold && RetainExpansion) {
11798     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11799 
11800     ExprResult Out = getDerived().TransformExpr(Pattern);
11801     if (Out.isInvalid())
11802       return true;
11803 
11804     Result = getDerived().RebuildCXXFoldExpr(
11805         E->getBeginLoc(), Out.get(), E->getOperator(), E->getEllipsisLoc(),
11806         Result.get(), E->getEndLoc());
11807     if (Result.isInvalid())
11808       return true;
11809   }
11810 
11811   for (unsigned I = 0; I != *NumExpansions; ++I) {
11812     Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(
11813         getSema(), LeftFold ? I : *NumExpansions - I - 1);
11814     ExprResult Out = getDerived().TransformExpr(Pattern);
11815     if (Out.isInvalid())
11816       return true;
11817 
11818     if (Out.get()->containsUnexpandedParameterPack()) {
11819       // We still have a pack; retain a pack expansion for this slice.
11820       Result = getDerived().RebuildCXXFoldExpr(
11821           E->getBeginLoc(), LeftFold ? Result.get() : Out.get(),
11822           E->getOperator(), E->getEllipsisLoc(),
11823           LeftFold ? Out.get() : Result.get(), E->getEndLoc());
11824     } else if (Result.isUsable()) {
11825       // We've got down to a single element; build a binary operator.
11826       Result = getDerived().RebuildBinaryOperator(
11827           E->getEllipsisLoc(), E->getOperator(),
11828           LeftFold ? Result.get() : Out.get(),
11829           LeftFold ? Out.get() : Result.get());
11830     } else
11831       Result = Out;
11832 
11833     if (Result.isInvalid())
11834       return true;
11835   }
11836 
11837   // If we're retaining an expansion for a left fold, it is the outermost
11838   // component and takes the complete expansion so far as its init (if any).
11839   if (LeftFold && RetainExpansion) {
11840     ForgetPartiallySubstitutedPackRAII Forget(getDerived());
11841 
11842     ExprResult Out = getDerived().TransformExpr(Pattern);
11843     if (Out.isInvalid())
11844       return true;
11845 
11846     Result = getDerived().RebuildCXXFoldExpr(
11847         E->getBeginLoc(), Result.get(), E->getOperator(), E->getEllipsisLoc(),
11848         Out.get(), E->getEndLoc());
11849     if (Result.isInvalid())
11850       return true;
11851   }
11852 
11853   // If we had no init and an empty pack, and we're not retaining an expansion,
11854   // then produce a fallback value or error.
11855   if (Result.isUnset())
11856     return getDerived().RebuildEmptyCXXFoldExpr(E->getEllipsisLoc(),
11857                                                 E->getOperator());
11858 
11859   return Result;
11860 }
11861 
11862 template<typename Derived>
11863 ExprResult
11864 TreeTransform<Derived>::TransformCXXStdInitializerListExpr(
11865     CXXStdInitializerListExpr *E) {
11866   return getDerived().TransformExpr(E->getSubExpr());
11867 }
11868 
11869 template<typename Derived>
11870 ExprResult
11871 TreeTransform<Derived>::TransformObjCStringLiteral(ObjCStringLiteral *E) {
11872   return SemaRef.MaybeBindToTemporary(E);
11873 }
11874 
11875 template<typename Derived>
11876 ExprResult
11877 TreeTransform<Derived>::TransformObjCBoolLiteralExpr(ObjCBoolLiteralExpr *E) {
11878   return E;
11879 }
11880 
11881 template<typename Derived>
11882 ExprResult
11883 TreeTransform<Derived>::TransformObjCBoxedExpr(ObjCBoxedExpr *E) {
11884   ExprResult SubExpr = getDerived().TransformExpr(E->getSubExpr());
11885   if (SubExpr.isInvalid())
11886     return ExprError();
11887 
11888   if (!getDerived().AlwaysRebuild() &&
11889       SubExpr.get() == E->getSubExpr())
11890     return E;
11891 
11892   return getDerived().RebuildObjCBoxedExpr(E->getSourceRange(), SubExpr.get());
11893 }
11894 
11895 template<typename Derived>
11896 ExprResult
11897 TreeTransform<Derived>::TransformObjCArrayLiteral(ObjCArrayLiteral *E) {
11898   // Transform each of the elements.
11899   SmallVector<Expr *, 8> Elements;
11900   bool ArgChanged = false;
11901   if (getDerived().TransformExprs(E->getElements(), E->getNumElements(),
11902                                   /*IsCall=*/false, Elements, &ArgChanged))
11903     return ExprError();
11904 
11905   if (!getDerived().AlwaysRebuild() && !ArgChanged)
11906     return SemaRef.MaybeBindToTemporary(E);
11907 
11908   return getDerived().RebuildObjCArrayLiteral(E->getSourceRange(),
11909                                               Elements.data(),
11910                                               Elements.size());
11911 }
11912 
11913 template<typename Derived>
11914 ExprResult
11915 TreeTransform<Derived>::TransformObjCDictionaryLiteral(
11916                                                     ObjCDictionaryLiteral *E) {
11917   // Transform each of the elements.
11918   SmallVector<ObjCDictionaryElement, 8> Elements;
11919   bool ArgChanged = false;
11920   for (unsigned I = 0, N = E->getNumElements(); I != N; ++I) {
11921     ObjCDictionaryElement OrigElement = E->getKeyValueElement(I);
11922 
11923     if (OrigElement.isPackExpansion()) {
11924       // This key/value element is a pack expansion.
11925       SmallVector<UnexpandedParameterPack, 2> Unexpanded;
11926       getSema().collectUnexpandedParameterPacks(OrigElement.Key, Unexpanded);
11927       getSema().collectUnexpandedParameterPacks(OrigElement.Value, Unexpanded);
11928       assert(!Unexpanded.empty() && "Pack expansion without parameter packs?");
11929 
11930       // Determine whether the set of unexpanded parameter packs can
11931       // and should be expanded.
11932       bool Expand = true;
11933       bool RetainExpansion = false;
11934       Optional<unsigned> OrigNumExpansions = OrigElement.NumExpansions;
11935       Optional<unsigned> NumExpansions = OrigNumExpansions;
11936       SourceRange PatternRange(OrigElement.Key->getBeginLoc(),
11937                                OrigElement.Value->getEndLoc());
11938       if (getDerived().TryExpandParameterPacks(OrigElement.EllipsisLoc,
11939                                                PatternRange, Unexpanded, Expand,
11940                                                RetainExpansion, NumExpansions))
11941         return ExprError();
11942 
11943       if (!Expand) {
11944         // The transform has determined that we should perform a simple
11945         // transformation on the pack expansion, producing another pack
11946         // expansion.
11947         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), -1);
11948         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11949         if (Key.isInvalid())
11950           return ExprError();
11951 
11952         if (Key.get() != OrigElement.Key)
11953           ArgChanged = true;
11954 
11955         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11956         if (Value.isInvalid())
11957           return ExprError();
11958 
11959         if (Value.get() != OrigElement.Value)
11960           ArgChanged = true;
11961 
11962         ObjCDictionaryElement Expansion = {
11963           Key.get(), Value.get(), OrigElement.EllipsisLoc, NumExpansions
11964         };
11965         Elements.push_back(Expansion);
11966         continue;
11967       }
11968 
11969       // Record right away that the argument was changed.  This needs
11970       // to happen even if the array expands to nothing.
11971       ArgChanged = true;
11972 
11973       // The transform has determined that we should perform an elementwise
11974       // expansion of the pattern. Do so.
11975       for (unsigned I = 0; I != *NumExpansions; ++I) {
11976         Sema::ArgumentPackSubstitutionIndexRAII SubstIndex(getSema(), I);
11977         ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
11978         if (Key.isInvalid())
11979           return ExprError();
11980 
11981         ExprResult Value = getDerived().TransformExpr(OrigElement.Value);
11982         if (Value.isInvalid())
11983           return ExprError();
11984 
11985         ObjCDictionaryElement Element = {
11986           Key.get(), Value.get(), SourceLocation(), NumExpansions
11987         };
11988 
11989         // If any unexpanded parameter packs remain, we still have a
11990         // pack expansion.
11991         // FIXME: Can this really happen?
11992         if (Key.get()->containsUnexpandedParameterPack() ||
11993             Value.get()->containsUnexpandedParameterPack())
11994           Element.EllipsisLoc = OrigElement.EllipsisLoc;
11995 
11996         Elements.push_back(Element);
11997       }
11998 
11999       // FIXME: Retain a pack expansion if RetainExpansion is true.
12000 
12001       // We've finished with this pack expansion.
12002       continue;
12003     }
12004 
12005     // Transform and check key.
12006     ExprResult Key = getDerived().TransformExpr(OrigElement.Key);
12007     if (Key.isInvalid())
12008       return ExprError();
12009 
12010     if (Key.get() != OrigElement.Key)
12011       ArgChanged = true;
12012 
12013     // Transform and check value.
12014     ExprResult Value
12015       = getDerived().TransformExpr(OrigElement.Value);
12016     if (Value.isInvalid())
12017       return ExprError();
12018 
12019     if (Value.get() != OrigElement.Value)
12020       ArgChanged = true;
12021 
12022     ObjCDictionaryElement Element = {
12023       Key.get(), Value.get(), SourceLocation(), None
12024     };
12025     Elements.push_back(Element);
12026   }
12027 
12028   if (!getDerived().AlwaysRebuild() && !ArgChanged)
12029     return SemaRef.MaybeBindToTemporary(E);
12030 
12031   return getDerived().RebuildObjCDictionaryLiteral(E->getSourceRange(),
12032                                                    Elements);
12033 }
12034 
12035 template<typename Derived>
12036 ExprResult
12037 TreeTransform<Derived>::TransformObjCEncodeExpr(ObjCEncodeExpr *E) {
12038   TypeSourceInfo *EncodedTypeInfo
12039     = getDerived().TransformType(E->getEncodedTypeSourceInfo());
12040   if (!EncodedTypeInfo)
12041     return ExprError();
12042 
12043   if (!getDerived().AlwaysRebuild() &&
12044       EncodedTypeInfo == E->getEncodedTypeSourceInfo())
12045     return E;
12046 
12047   return getDerived().RebuildObjCEncodeExpr(E->getAtLoc(),
12048                                             EncodedTypeInfo,
12049                                             E->getRParenLoc());
12050 }
12051 
12052 template<typename Derived>
12053 ExprResult TreeTransform<Derived>::
12054 TransformObjCIndirectCopyRestoreExpr(ObjCIndirectCopyRestoreExpr *E) {
12055   // This is a kind of implicit conversion, and it needs to get dropped
12056   // and recomputed for the same general reasons that ImplicitCastExprs
12057   // do, as well a more specific one: this expression is only valid when
12058   // it appears *immediately* as an argument expression.
12059   return getDerived().TransformExpr(E->getSubExpr());
12060 }
12061 
12062 template<typename Derived>
12063 ExprResult TreeTransform<Derived>::
12064 TransformObjCBridgedCastExpr(ObjCBridgedCastExpr *E) {
12065   TypeSourceInfo *TSInfo
12066     = getDerived().TransformType(E->getTypeInfoAsWritten());
12067   if (!TSInfo)
12068     return ExprError();
12069 
12070   ExprResult Result = getDerived().TransformExpr(E->getSubExpr());
12071   if (Result.isInvalid())
12072     return ExprError();
12073 
12074   if (!getDerived().AlwaysRebuild() &&
12075       TSInfo == E->getTypeInfoAsWritten() &&
12076       Result.get() == E->getSubExpr())
12077     return E;
12078 
12079   return SemaRef.BuildObjCBridgedCast(E->getLParenLoc(), E->getBridgeKind(),
12080                                       E->getBridgeKeywordLoc(), TSInfo,
12081                                       Result.get());
12082 }
12083 
12084 template <typename Derived>
12085 ExprResult TreeTransform<Derived>::TransformObjCAvailabilityCheckExpr(
12086     ObjCAvailabilityCheckExpr *E) {
12087   return E;
12088 }
12089 
12090 template<typename Derived>
12091 ExprResult
12092 TreeTransform<Derived>::TransformObjCMessageExpr(ObjCMessageExpr *E) {
12093   // Transform arguments.
12094   bool ArgChanged = false;
12095   SmallVector<Expr*, 8> Args;
12096   Args.reserve(E->getNumArgs());
12097   if (getDerived().TransformExprs(E->getArgs(), E->getNumArgs(), false, Args,
12098                                   &ArgChanged))
12099     return ExprError();
12100 
12101   if (E->getReceiverKind() == ObjCMessageExpr::Class) {
12102     // Class message: transform the receiver type.
12103     TypeSourceInfo *ReceiverTypeInfo
12104       = getDerived().TransformType(E->getClassReceiverTypeInfo());
12105     if (!ReceiverTypeInfo)
12106       return ExprError();
12107 
12108     // If nothing changed, just retain the existing message send.
12109     if (!getDerived().AlwaysRebuild() &&
12110         ReceiverTypeInfo == E->getClassReceiverTypeInfo() && !ArgChanged)
12111       return SemaRef.MaybeBindToTemporary(E);
12112 
12113     // Build a new class message send.
12114     SmallVector<SourceLocation, 16> SelLocs;
12115     E->getSelectorLocs(SelLocs);
12116     return getDerived().RebuildObjCMessageExpr(ReceiverTypeInfo,
12117                                                E->getSelector(),
12118                                                SelLocs,
12119                                                E->getMethodDecl(),
12120                                                E->getLeftLoc(),
12121                                                Args,
12122                                                E->getRightLoc());
12123   }
12124   else if (E->getReceiverKind() == ObjCMessageExpr::SuperClass ||
12125            E->getReceiverKind() == ObjCMessageExpr::SuperInstance) {
12126     if (!E->getMethodDecl())
12127       return ExprError();
12128 
12129     // Build a new class message send to 'super'.
12130     SmallVector<SourceLocation, 16> SelLocs;
12131     E->getSelectorLocs(SelLocs);
12132     return getDerived().RebuildObjCMessageExpr(E->getSuperLoc(),
12133                                                E->getSelector(),
12134                                                SelLocs,
12135                                                E->getReceiverType(),
12136                                                E->getMethodDecl(),
12137                                                E->getLeftLoc(),
12138                                                Args,
12139                                                E->getRightLoc());
12140   }
12141 
12142   // Instance message: transform the receiver
12143   assert(E->getReceiverKind() == ObjCMessageExpr::Instance &&
12144          "Only class and instance messages may be instantiated");
12145   ExprResult Receiver
12146     = getDerived().TransformExpr(E->getInstanceReceiver());
12147   if (Receiver.isInvalid())
12148     return ExprError();
12149 
12150   // If nothing changed, just retain the existing message send.
12151   if (!getDerived().AlwaysRebuild() &&
12152       Receiver.get() == E->getInstanceReceiver() && !ArgChanged)
12153     return SemaRef.MaybeBindToTemporary(E);
12154 
12155   // Build a new instance message send.
12156   SmallVector<SourceLocation, 16> SelLocs;
12157   E->getSelectorLocs(SelLocs);
12158   return getDerived().RebuildObjCMessageExpr(Receiver.get(),
12159                                              E->getSelector(),
12160                                              SelLocs,
12161                                              E->getMethodDecl(),
12162                                              E->getLeftLoc(),
12163                                              Args,
12164                                              E->getRightLoc());
12165 }
12166 
12167 template<typename Derived>
12168 ExprResult
12169 TreeTransform<Derived>::TransformObjCSelectorExpr(ObjCSelectorExpr *E) {
12170   return E;
12171 }
12172 
12173 template<typename Derived>
12174 ExprResult
12175 TreeTransform<Derived>::TransformObjCProtocolExpr(ObjCProtocolExpr *E) {
12176   return E;
12177 }
12178 
12179 template<typename Derived>
12180 ExprResult
12181 TreeTransform<Derived>::TransformObjCIvarRefExpr(ObjCIvarRefExpr *E) {
12182   // Transform the base expression.
12183   ExprResult Base = getDerived().TransformExpr(E->getBase());
12184   if (Base.isInvalid())
12185     return ExprError();
12186 
12187   // We don't need to transform the ivar; it will never change.
12188 
12189   // If nothing changed, just retain the existing expression.
12190   if (!getDerived().AlwaysRebuild() &&
12191       Base.get() == E->getBase())
12192     return E;
12193 
12194   return getDerived().RebuildObjCIvarRefExpr(Base.get(), E->getDecl(),
12195                                              E->getLocation(),
12196                                              E->isArrow(), E->isFreeIvar());
12197 }
12198 
12199 template<typename Derived>
12200 ExprResult
12201 TreeTransform<Derived>::TransformObjCPropertyRefExpr(ObjCPropertyRefExpr *E) {
12202   // 'super' and types never change. Property never changes. Just
12203   // retain the existing expression.
12204   if (!E->isObjectReceiver())
12205     return E;
12206 
12207   // Transform the base expression.
12208   ExprResult Base = getDerived().TransformExpr(E->getBase());
12209   if (Base.isInvalid())
12210     return ExprError();
12211 
12212   // We don't need to transform the property; it will never change.
12213 
12214   // If nothing changed, just retain the existing expression.
12215   if (!getDerived().AlwaysRebuild() &&
12216       Base.get() == E->getBase())
12217     return E;
12218 
12219   if (E->isExplicitProperty())
12220     return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12221                                                    E->getExplicitProperty(),
12222                                                    E->getLocation());
12223 
12224   return getDerived().RebuildObjCPropertyRefExpr(Base.get(),
12225                                                  SemaRef.Context.PseudoObjectTy,
12226                                                  E->getImplicitPropertyGetter(),
12227                                                  E->getImplicitPropertySetter(),
12228                                                  E->getLocation());
12229 }
12230 
12231 template<typename Derived>
12232 ExprResult
12233 TreeTransform<Derived>::TransformObjCSubscriptRefExpr(ObjCSubscriptRefExpr *E) {
12234   // Transform the base expression.
12235   ExprResult Base = getDerived().TransformExpr(E->getBaseExpr());
12236   if (Base.isInvalid())
12237     return ExprError();
12238 
12239   // Transform the key expression.
12240   ExprResult Key = getDerived().TransformExpr(E->getKeyExpr());
12241   if (Key.isInvalid())
12242     return ExprError();
12243 
12244   // If nothing changed, just retain the existing expression.
12245   if (!getDerived().AlwaysRebuild() &&
12246       Key.get() == E->getKeyExpr() && Base.get() == E->getBaseExpr())
12247     return E;
12248 
12249   return getDerived().RebuildObjCSubscriptRefExpr(E->getRBracket(),
12250                                                   Base.get(), Key.get(),
12251                                                   E->getAtIndexMethodDecl(),
12252                                                   E->setAtIndexMethodDecl());
12253 }
12254 
12255 template<typename Derived>
12256 ExprResult
12257 TreeTransform<Derived>::TransformObjCIsaExpr(ObjCIsaExpr *E) {
12258   // Transform the base expression.
12259   ExprResult Base = getDerived().TransformExpr(E->getBase());
12260   if (Base.isInvalid())
12261     return ExprError();
12262 
12263   // If nothing changed, just retain the existing expression.
12264   if (!getDerived().AlwaysRebuild() &&
12265       Base.get() == E->getBase())
12266     return E;
12267 
12268   return getDerived().RebuildObjCIsaExpr(Base.get(), E->getIsaMemberLoc(),
12269                                          E->getOpLoc(),
12270                                          E->isArrow());
12271 }
12272 
12273 template<typename Derived>
12274 ExprResult
12275 TreeTransform<Derived>::TransformShuffleVectorExpr(ShuffleVectorExpr *E) {
12276   bool ArgumentChanged = false;
12277   SmallVector<Expr*, 8> SubExprs;
12278   SubExprs.reserve(E->getNumSubExprs());
12279   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12280                                   SubExprs, &ArgumentChanged))
12281     return ExprError();
12282 
12283   if (!getDerived().AlwaysRebuild() &&
12284       !ArgumentChanged)
12285     return E;
12286 
12287   return getDerived().RebuildShuffleVectorExpr(E->getBuiltinLoc(),
12288                                                SubExprs,
12289                                                E->getRParenLoc());
12290 }
12291 
12292 template<typename Derived>
12293 ExprResult
12294 TreeTransform<Derived>::TransformConvertVectorExpr(ConvertVectorExpr *E) {
12295   ExprResult SrcExpr = getDerived().TransformExpr(E->getSrcExpr());
12296   if (SrcExpr.isInvalid())
12297     return ExprError();
12298 
12299   TypeSourceInfo *Type = getDerived().TransformType(E->getTypeSourceInfo());
12300   if (!Type)
12301     return ExprError();
12302 
12303   if (!getDerived().AlwaysRebuild() &&
12304       Type == E->getTypeSourceInfo() &&
12305       SrcExpr.get() == E->getSrcExpr())
12306     return E;
12307 
12308   return getDerived().RebuildConvertVectorExpr(E->getBuiltinLoc(),
12309                                                SrcExpr.get(), Type,
12310                                                E->getRParenLoc());
12311 }
12312 
12313 template<typename Derived>
12314 ExprResult
12315 TreeTransform<Derived>::TransformBlockExpr(BlockExpr *E) {
12316   BlockDecl *oldBlock = E->getBlockDecl();
12317 
12318   SemaRef.ActOnBlockStart(E->getCaretLocation(), /*Scope=*/nullptr);
12319   BlockScopeInfo *blockScope = SemaRef.getCurBlock();
12320 
12321   blockScope->TheDecl->setIsVariadic(oldBlock->isVariadic());
12322   blockScope->TheDecl->setBlockMissingReturnType(
12323                          oldBlock->blockMissingReturnType());
12324 
12325   SmallVector<ParmVarDecl*, 4> params;
12326   SmallVector<QualType, 4> paramTypes;
12327 
12328   const FunctionProtoType *exprFunctionType = E->getFunctionType();
12329 
12330   // Parameter substitution.
12331   Sema::ExtParameterInfoBuilder extParamInfos;
12332   if (getDerived().TransformFunctionTypeParams(
12333           E->getCaretLocation(), oldBlock->parameters(), nullptr,
12334           exprFunctionType->getExtParameterInfosOrNull(), paramTypes, &params,
12335           extParamInfos)) {
12336     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12337     return ExprError();
12338   }
12339 
12340   QualType exprResultType =
12341       getDerived().TransformType(exprFunctionType->getReturnType());
12342 
12343   auto epi = exprFunctionType->getExtProtoInfo();
12344   epi.ExtParameterInfos = extParamInfos.getPointerOrNull(paramTypes.size());
12345 
12346   QualType functionType =
12347     getDerived().RebuildFunctionProtoType(exprResultType, paramTypes, epi);
12348   blockScope->FunctionType = functionType;
12349 
12350   // Set the parameters on the block decl.
12351   if (!params.empty())
12352     blockScope->TheDecl->setParams(params);
12353 
12354   if (!oldBlock->blockMissingReturnType()) {
12355     blockScope->HasImplicitReturnType = false;
12356     blockScope->ReturnType = exprResultType;
12357   }
12358 
12359   // Transform the body
12360   StmtResult body = getDerived().TransformStmt(E->getBody());
12361   if (body.isInvalid()) {
12362     getSema().ActOnBlockError(E->getCaretLocation(), /*Scope=*/nullptr);
12363     return ExprError();
12364   }
12365 
12366 #ifndef NDEBUG
12367   // In builds with assertions, make sure that we captured everything we
12368   // captured before.
12369   if (!SemaRef.getDiagnostics().hasErrorOccurred()) {
12370     for (const auto &I : oldBlock->captures()) {
12371       VarDecl *oldCapture = I.getVariable();
12372 
12373       // Ignore parameter packs.
12374       if (isa<ParmVarDecl>(oldCapture) &&
12375           cast<ParmVarDecl>(oldCapture)->isParameterPack())
12376         continue;
12377 
12378       VarDecl *newCapture =
12379         cast<VarDecl>(getDerived().TransformDecl(E->getCaretLocation(),
12380                                                  oldCapture));
12381       assert(blockScope->CaptureMap.count(newCapture));
12382     }
12383     assert(oldBlock->capturesCXXThis() == blockScope->isCXXThisCaptured());
12384   }
12385 #endif
12386 
12387   return SemaRef.ActOnBlockStmtExpr(E->getCaretLocation(), body.get(),
12388                                     /*Scope=*/nullptr);
12389 }
12390 
12391 template<typename Derived>
12392 ExprResult
12393 TreeTransform<Derived>::TransformAsTypeExpr(AsTypeExpr *E) {
12394   llvm_unreachable("Cannot transform asType expressions yet");
12395 }
12396 
12397 template<typename Derived>
12398 ExprResult
12399 TreeTransform<Derived>::TransformAtomicExpr(AtomicExpr *E) {
12400   QualType RetTy = getDerived().TransformType(E->getType());
12401   bool ArgumentChanged = false;
12402   SmallVector<Expr*, 8> SubExprs;
12403   SubExprs.reserve(E->getNumSubExprs());
12404   if (getDerived().TransformExprs(E->getSubExprs(), E->getNumSubExprs(), false,
12405                                   SubExprs, &ArgumentChanged))
12406     return ExprError();
12407 
12408   if (!getDerived().AlwaysRebuild() &&
12409       !ArgumentChanged)
12410     return E;
12411 
12412   return getDerived().RebuildAtomicExpr(E->getBuiltinLoc(), SubExprs,
12413                                         RetTy, E->getOp(), E->getRParenLoc());
12414 }
12415 
12416 //===----------------------------------------------------------------------===//
12417 // Type reconstruction
12418 //===----------------------------------------------------------------------===//
12419 
12420 template<typename Derived>
12421 QualType TreeTransform<Derived>::RebuildPointerType(QualType PointeeType,
12422                                                     SourceLocation Star) {
12423   return SemaRef.BuildPointerType(PointeeType, Star,
12424                                   getDerived().getBaseEntity());
12425 }
12426 
12427 template<typename Derived>
12428 QualType TreeTransform<Derived>::RebuildBlockPointerType(QualType PointeeType,
12429                                                          SourceLocation Star) {
12430   return SemaRef.BuildBlockPointerType(PointeeType, Star,
12431                                        getDerived().getBaseEntity());
12432 }
12433 
12434 template<typename Derived>
12435 QualType
12436 TreeTransform<Derived>::RebuildReferenceType(QualType ReferentType,
12437                                              bool WrittenAsLValue,
12438                                              SourceLocation Sigil) {
12439   return SemaRef.BuildReferenceType(ReferentType, WrittenAsLValue,
12440                                     Sigil, getDerived().getBaseEntity());
12441 }
12442 
12443 template<typename Derived>
12444 QualType
12445 TreeTransform<Derived>::RebuildMemberPointerType(QualType PointeeType,
12446                                                  QualType ClassType,
12447                                                  SourceLocation Sigil) {
12448   return SemaRef.BuildMemberPointerType(PointeeType, ClassType, Sigil,
12449                                         getDerived().getBaseEntity());
12450 }
12451 
12452 template<typename Derived>
12453 QualType TreeTransform<Derived>::RebuildObjCTypeParamType(
12454            const ObjCTypeParamDecl *Decl,
12455            SourceLocation ProtocolLAngleLoc,
12456            ArrayRef<ObjCProtocolDecl *> Protocols,
12457            ArrayRef<SourceLocation> ProtocolLocs,
12458            SourceLocation ProtocolRAngleLoc) {
12459   return SemaRef.BuildObjCTypeParamType(Decl,
12460                                         ProtocolLAngleLoc, Protocols,
12461                                         ProtocolLocs, ProtocolRAngleLoc,
12462                                         /*FailOnError=*/true);
12463 }
12464 
12465 template<typename Derived>
12466 QualType TreeTransform<Derived>::RebuildObjCObjectType(
12467            QualType BaseType,
12468            SourceLocation Loc,
12469            SourceLocation TypeArgsLAngleLoc,
12470            ArrayRef<TypeSourceInfo *> TypeArgs,
12471            SourceLocation TypeArgsRAngleLoc,
12472            SourceLocation ProtocolLAngleLoc,
12473            ArrayRef<ObjCProtocolDecl *> Protocols,
12474            ArrayRef<SourceLocation> ProtocolLocs,
12475            SourceLocation ProtocolRAngleLoc) {
12476   return SemaRef.BuildObjCObjectType(BaseType, Loc, TypeArgsLAngleLoc,
12477                                      TypeArgs, TypeArgsRAngleLoc,
12478                                      ProtocolLAngleLoc, Protocols, ProtocolLocs,
12479                                      ProtocolRAngleLoc,
12480                                      /*FailOnError=*/true);
12481 }
12482 
12483 template<typename Derived>
12484 QualType TreeTransform<Derived>::RebuildObjCObjectPointerType(
12485            QualType PointeeType,
12486            SourceLocation Star) {
12487   return SemaRef.Context.getObjCObjectPointerType(PointeeType);
12488 }
12489 
12490 template<typename Derived>
12491 QualType
12492 TreeTransform<Derived>::RebuildArrayType(QualType ElementType,
12493                                          ArrayType::ArraySizeModifier SizeMod,
12494                                          const llvm::APInt *Size,
12495                                          Expr *SizeExpr,
12496                                          unsigned IndexTypeQuals,
12497                                          SourceRange BracketsRange) {
12498   if (SizeExpr || !Size)
12499     return SemaRef.BuildArrayType(ElementType, SizeMod, SizeExpr,
12500                                   IndexTypeQuals, BracketsRange,
12501                                   getDerived().getBaseEntity());
12502 
12503   QualType Types[] = {
12504     SemaRef.Context.UnsignedCharTy, SemaRef.Context.UnsignedShortTy,
12505     SemaRef.Context.UnsignedIntTy, SemaRef.Context.UnsignedLongTy,
12506     SemaRef.Context.UnsignedLongLongTy, SemaRef.Context.UnsignedInt128Ty
12507   };
12508   const unsigned NumTypes = llvm::array_lengthof(Types);
12509   QualType SizeType;
12510   for (unsigned I = 0; I != NumTypes; ++I)
12511     if (Size->getBitWidth() == SemaRef.Context.getIntWidth(Types[I])) {
12512       SizeType = Types[I];
12513       break;
12514     }
12515 
12516   // Note that we can return a VariableArrayType here in the case where
12517   // the element type was a dependent VariableArrayType.
12518   IntegerLiteral *ArraySize
12519       = IntegerLiteral::Create(SemaRef.Context, *Size, SizeType,
12520                                /*FIXME*/BracketsRange.getBegin());
12521   return SemaRef.BuildArrayType(ElementType, SizeMod, ArraySize,
12522                                 IndexTypeQuals, BracketsRange,
12523                                 getDerived().getBaseEntity());
12524 }
12525 
12526 template<typename Derived>
12527 QualType
12528 TreeTransform<Derived>::RebuildConstantArrayType(QualType ElementType,
12529                                                  ArrayType::ArraySizeModifier SizeMod,
12530                                                  const llvm::APInt &Size,
12531                                                  unsigned IndexTypeQuals,
12532                                                  SourceRange BracketsRange) {
12533   return getDerived().RebuildArrayType(ElementType, SizeMod, &Size, nullptr,
12534                                         IndexTypeQuals, BracketsRange);
12535 }
12536 
12537 template<typename Derived>
12538 QualType
12539 TreeTransform<Derived>::RebuildIncompleteArrayType(QualType ElementType,
12540                                           ArrayType::ArraySizeModifier SizeMod,
12541                                                  unsigned IndexTypeQuals,
12542                                                    SourceRange BracketsRange) {
12543   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr, nullptr,
12544                                        IndexTypeQuals, BracketsRange);
12545 }
12546 
12547 template<typename Derived>
12548 QualType
12549 TreeTransform<Derived>::RebuildVariableArrayType(QualType ElementType,
12550                                           ArrayType::ArraySizeModifier SizeMod,
12551                                                  Expr *SizeExpr,
12552                                                  unsigned IndexTypeQuals,
12553                                                  SourceRange BracketsRange) {
12554   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12555                                        SizeExpr,
12556                                        IndexTypeQuals, BracketsRange);
12557 }
12558 
12559 template<typename Derived>
12560 QualType
12561 TreeTransform<Derived>::RebuildDependentSizedArrayType(QualType ElementType,
12562                                           ArrayType::ArraySizeModifier SizeMod,
12563                                                        Expr *SizeExpr,
12564                                                        unsigned IndexTypeQuals,
12565                                                    SourceRange BracketsRange) {
12566   return getDerived().RebuildArrayType(ElementType, SizeMod, nullptr,
12567                                        SizeExpr,
12568                                        IndexTypeQuals, BracketsRange);
12569 }
12570 
12571 template <typename Derived>
12572 QualType TreeTransform<Derived>::RebuildDependentAddressSpaceType(
12573     QualType PointeeType, Expr *AddrSpaceExpr, SourceLocation AttributeLoc) {
12574   return SemaRef.BuildAddressSpaceAttr(PointeeType, AddrSpaceExpr,
12575                                           AttributeLoc);
12576 }
12577 
12578 template <typename Derived>
12579 QualType
12580 TreeTransform<Derived>::RebuildVectorType(QualType ElementType,
12581                                           unsigned NumElements,
12582                                           VectorType::VectorKind VecKind) {
12583   // FIXME: semantic checking!
12584   return SemaRef.Context.getVectorType(ElementType, NumElements, VecKind);
12585 }
12586 
12587 template <typename Derived>
12588 QualType TreeTransform<Derived>::RebuildDependentVectorType(
12589     QualType ElementType, Expr *SizeExpr, SourceLocation AttributeLoc,
12590     VectorType::VectorKind VecKind) {
12591   return SemaRef.BuildVectorType(ElementType, SizeExpr, AttributeLoc);
12592 }
12593 
12594 template<typename Derived>
12595 QualType TreeTransform<Derived>::RebuildExtVectorType(QualType ElementType,
12596                                                       unsigned NumElements,
12597                                                  SourceLocation AttributeLoc) {
12598   llvm::APInt numElements(SemaRef.Context.getIntWidth(SemaRef.Context.IntTy),
12599                           NumElements, true);
12600   IntegerLiteral *VectorSize
12601     = IntegerLiteral::Create(SemaRef.Context, numElements, SemaRef.Context.IntTy,
12602                              AttributeLoc);
12603   return SemaRef.BuildExtVectorType(ElementType, VectorSize, AttributeLoc);
12604 }
12605 
12606 template<typename Derived>
12607 QualType
12608 TreeTransform<Derived>::RebuildDependentSizedExtVectorType(QualType ElementType,
12609                                                            Expr *SizeExpr,
12610                                                   SourceLocation AttributeLoc) {
12611   return SemaRef.BuildExtVectorType(ElementType, SizeExpr, AttributeLoc);
12612 }
12613 
12614 template<typename Derived>
12615 QualType TreeTransform<Derived>::RebuildFunctionProtoType(
12616     QualType T,
12617     MutableArrayRef<QualType> ParamTypes,
12618     const FunctionProtoType::ExtProtoInfo &EPI) {
12619   return SemaRef.BuildFunctionType(T, ParamTypes,
12620                                    getDerived().getBaseLocation(),
12621                                    getDerived().getBaseEntity(),
12622                                    EPI);
12623 }
12624 
12625 template<typename Derived>
12626 QualType TreeTransform<Derived>::RebuildFunctionNoProtoType(QualType T) {
12627   return SemaRef.Context.getFunctionNoProtoType(T);
12628 }
12629 
12630 template<typename Derived>
12631 QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
12632                                                             Decl *D) {
12633   assert(D && "no decl found");
12634   if (D->isInvalidDecl()) return QualType();
12635 
12636   // FIXME: Doesn't account for ObjCInterfaceDecl!
12637   TypeDecl *Ty;
12638   if (auto *UPD = dyn_cast<UsingPackDecl>(D)) {
12639     // A valid resolved using typename pack expansion decl can have multiple
12640     // UsingDecls, but they must each have exactly one type, and it must be
12641     // the same type in every case. But we must have at least one expansion!
12642     if (UPD->expansions().empty()) {
12643       getSema().Diag(Loc, diag::err_using_pack_expansion_empty)
12644           << UPD->isCXXClassMember() << UPD;
12645       return QualType();
12646     }
12647 
12648     // We might still have some unresolved types. Try to pick a resolved type
12649     // if we can. The final instantiation will check that the remaining
12650     // unresolved types instantiate to the type we pick.
12651     QualType FallbackT;
12652     QualType T;
12653     for (auto *E : UPD->expansions()) {
12654       QualType ThisT = RebuildUnresolvedUsingType(Loc, E);
12655       if (ThisT.isNull())
12656         continue;
12657       else if (ThisT->getAs<UnresolvedUsingType>())
12658         FallbackT = ThisT;
12659       else if (T.isNull())
12660         T = ThisT;
12661       else
12662         assert(getSema().Context.hasSameType(ThisT, T) &&
12663                "mismatched resolved types in using pack expansion");
12664     }
12665     return T.isNull() ? FallbackT : T;
12666   } else if (auto *Using = dyn_cast<UsingDecl>(D)) {
12667     assert(Using->hasTypename() &&
12668            "UnresolvedUsingTypenameDecl transformed to non-typename using");
12669 
12670     // A valid resolved using typename decl points to exactly one type decl.
12671     assert(++Using->shadow_begin() == Using->shadow_end());
12672     Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
12673   } else {
12674     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
12675            "UnresolvedUsingTypenameDecl transformed to non-using decl");
12676     Ty = cast<UnresolvedUsingTypenameDecl>(D);
12677   }
12678 
12679   return SemaRef.Context.getTypeDeclType(Ty);
12680 }
12681 
12682 template<typename Derived>
12683 QualType TreeTransform<Derived>::RebuildTypeOfExprType(Expr *E,
12684                                                        SourceLocation Loc) {
12685   return SemaRef.BuildTypeofExprType(E, Loc);
12686 }
12687 
12688 template<typename Derived>
12689 QualType TreeTransform<Derived>::RebuildTypeOfType(QualType Underlying) {
12690   return SemaRef.Context.getTypeOfType(Underlying);
12691 }
12692 
12693 template<typename Derived>
12694 QualType TreeTransform<Derived>::RebuildDecltypeType(Expr *E,
12695                                                      SourceLocation Loc) {
12696   return SemaRef.BuildDecltypeType(E, Loc);
12697 }
12698 
12699 template<typename Derived>
12700 QualType TreeTransform<Derived>::RebuildUnaryTransformType(QualType BaseType,
12701                                             UnaryTransformType::UTTKind UKind,
12702                                             SourceLocation Loc) {
12703   return SemaRef.BuildUnaryTransformType(BaseType, UKind, Loc);
12704 }
12705 
12706 template<typename Derived>
12707 QualType TreeTransform<Derived>::RebuildTemplateSpecializationType(
12708                                                       TemplateName Template,
12709                                              SourceLocation TemplateNameLoc,
12710                                      TemplateArgumentListInfo &TemplateArgs) {
12711   return SemaRef.CheckTemplateIdType(Template, TemplateNameLoc, TemplateArgs);
12712 }
12713 
12714 template<typename Derived>
12715 QualType TreeTransform<Derived>::RebuildAtomicType(QualType ValueType,
12716                                                    SourceLocation KWLoc) {
12717   return SemaRef.BuildAtomicType(ValueType, KWLoc);
12718 }
12719 
12720 template<typename Derived>
12721 QualType TreeTransform<Derived>::RebuildPipeType(QualType ValueType,
12722                                                  SourceLocation KWLoc,
12723                                                  bool isReadPipe) {
12724   return isReadPipe ? SemaRef.BuildReadPipeType(ValueType, KWLoc)
12725                     : SemaRef.BuildWritePipeType(ValueType, KWLoc);
12726 }
12727 
12728 template<typename Derived>
12729 TemplateName
12730 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12731                                             bool TemplateKW,
12732                                             TemplateDecl *Template) {
12733   return SemaRef.Context.getQualifiedTemplateName(SS.getScopeRep(), TemplateKW,
12734                                                   Template);
12735 }
12736 
12737 template<typename Derived>
12738 TemplateName
12739 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12740                                             SourceLocation TemplateKWLoc,
12741                                             const IdentifierInfo &Name,
12742                                             SourceLocation NameLoc,
12743                                             QualType ObjectType,
12744                                             NamedDecl *FirstQualifierInScope,
12745                                             bool AllowInjectedClassName) {
12746   UnqualifiedId TemplateName;
12747   TemplateName.setIdentifier(&Name, NameLoc);
12748   Sema::TemplateTy Template;
12749   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12750                                        SS, TemplateKWLoc, TemplateName,
12751                                        ParsedType::make(ObjectType),
12752                                        /*EnteringContext=*/false,
12753                                        Template, AllowInjectedClassName);
12754   return Template.get();
12755 }
12756 
12757 template<typename Derived>
12758 TemplateName
12759 TreeTransform<Derived>::RebuildTemplateName(CXXScopeSpec &SS,
12760                                             SourceLocation TemplateKWLoc,
12761                                             OverloadedOperatorKind Operator,
12762                                             SourceLocation NameLoc,
12763                                             QualType ObjectType,
12764                                             bool AllowInjectedClassName) {
12765   UnqualifiedId Name;
12766   // FIXME: Bogus location information.
12767   SourceLocation SymbolLocations[3] = { NameLoc, NameLoc, NameLoc };
12768   Name.setOperatorFunctionId(NameLoc, Operator, SymbolLocations);
12769   Sema::TemplateTy Template;
12770   getSema().ActOnDependentTemplateName(/*Scope=*/nullptr,
12771                                        SS, TemplateKWLoc, Name,
12772                                        ParsedType::make(ObjectType),
12773                                        /*EnteringContext=*/false,
12774                                        Template, AllowInjectedClassName);
12775   return Template.get();
12776 }
12777 
12778 template<typename Derived>
12779 ExprResult
12780 TreeTransform<Derived>::RebuildCXXOperatorCallExpr(OverloadedOperatorKind Op,
12781                                                    SourceLocation OpLoc,
12782                                                    Expr *OrigCallee,
12783                                                    Expr *First,
12784                                                    Expr *Second) {
12785   Expr *Callee = OrigCallee->IgnoreParenCasts();
12786   bool isPostIncDec = Second && (Op == OO_PlusPlus || Op == OO_MinusMinus);
12787 
12788   if (First->getObjectKind() == OK_ObjCProperty) {
12789     BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12790     if (BinaryOperator::isAssignmentOp(Opc))
12791       return SemaRef.checkPseudoObjectAssignment(/*Scope=*/nullptr, OpLoc, Opc,
12792                                                  First, Second);
12793     ExprResult Result = SemaRef.CheckPlaceholderExpr(First);
12794     if (Result.isInvalid())
12795       return ExprError();
12796     First = Result.get();
12797   }
12798 
12799   if (Second && Second->getObjectKind() == OK_ObjCProperty) {
12800     ExprResult Result = SemaRef.CheckPlaceholderExpr(Second);
12801     if (Result.isInvalid())
12802       return ExprError();
12803     Second = Result.get();
12804   }
12805 
12806   // Determine whether this should be a builtin operation.
12807   if (Op == OO_Subscript) {
12808     if (!First->getType()->isOverloadableType() &&
12809         !Second->getType()->isOverloadableType())
12810       return getSema().CreateBuiltinArraySubscriptExpr(
12811           First, Callee->getBeginLoc(), Second, OpLoc);
12812   } else if (Op == OO_Arrow) {
12813     // -> is never a builtin operation.
12814     return SemaRef.BuildOverloadedArrowExpr(nullptr, First, OpLoc);
12815   } else if (Second == nullptr || isPostIncDec) {
12816     if (!First->getType()->isOverloadableType() ||
12817         (Op == OO_Amp && getSema().isQualifiedMemberAccess(First))) {
12818       // The argument is not of overloadable type, or this is an expression
12819       // of the form &Class::member, so try to create a built-in unary
12820       // operation.
12821       UnaryOperatorKind Opc
12822         = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12823 
12824       return getSema().CreateBuiltinUnaryOp(OpLoc, Opc, First);
12825     }
12826   } else {
12827     if (!First->getType()->isOverloadableType() &&
12828         !Second->getType()->isOverloadableType()) {
12829       // Neither of the arguments is an overloadable type, so try to
12830       // create a built-in binary operation.
12831       BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12832       ExprResult Result
12833         = SemaRef.CreateBuiltinBinOp(OpLoc, Opc, First, Second);
12834       if (Result.isInvalid())
12835         return ExprError();
12836 
12837       return Result;
12838     }
12839   }
12840 
12841   // Compute the transformed set of functions (and function templates) to be
12842   // used during overload resolution.
12843   UnresolvedSet<16> Functions;
12844   bool RequiresADL;
12845 
12846   if (UnresolvedLookupExpr *ULE = dyn_cast<UnresolvedLookupExpr>(Callee)) {
12847     Functions.append(ULE->decls_begin(), ULE->decls_end());
12848     // If the overload could not be resolved in the template definition
12849     // (because we had a dependent argument), ADL is performed as part of
12850     // template instantiation.
12851     RequiresADL = ULE->requiresADL();
12852   } else {
12853     // If we've resolved this to a particular non-member function, just call
12854     // that function. If we resolved it to a member function,
12855     // CreateOverloaded* will find that function for us.
12856     NamedDecl *ND = cast<DeclRefExpr>(Callee)->getDecl();
12857     if (!isa<CXXMethodDecl>(ND))
12858       Functions.addDecl(ND);
12859     RequiresADL = false;
12860   }
12861 
12862   // Add any functions found via argument-dependent lookup.
12863   Expr *Args[2] = { First, Second };
12864   unsigned NumArgs = 1 + (Second != nullptr);
12865 
12866   // Create the overloaded operator invocation for unary operators.
12867   if (NumArgs == 1 || isPostIncDec) {
12868     UnaryOperatorKind Opc
12869       = UnaryOperator::getOverloadedOpcode(Op, isPostIncDec);
12870     return SemaRef.CreateOverloadedUnaryOp(OpLoc, Opc, Functions, First,
12871                                            RequiresADL);
12872   }
12873 
12874   if (Op == OO_Subscript) {
12875     SourceLocation LBrace;
12876     SourceLocation RBrace;
12877 
12878     if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Callee)) {
12879         DeclarationNameLoc NameLoc = DRE->getNameInfo().getInfo();
12880         LBrace = SourceLocation::getFromRawEncoding(
12881                     NameLoc.CXXOperatorName.BeginOpNameLoc);
12882         RBrace = SourceLocation::getFromRawEncoding(
12883                     NameLoc.CXXOperatorName.EndOpNameLoc);
12884     } else {
12885       LBrace = Callee->getBeginLoc();
12886       RBrace = OpLoc;
12887     }
12888 
12889     return SemaRef.CreateOverloadedArraySubscriptExpr(LBrace, RBrace,
12890                                                       First, Second);
12891   }
12892 
12893   // Create the overloaded operator invocation for binary operators.
12894   BinaryOperatorKind Opc = BinaryOperator::getOverloadedOpcode(Op);
12895   ExprResult Result = SemaRef.CreateOverloadedBinOp(
12896       OpLoc, Opc, Functions, Args[0], Args[1], RequiresADL);
12897   if (Result.isInvalid())
12898     return ExprError();
12899 
12900   return Result;
12901 }
12902 
12903 template<typename Derived>
12904 ExprResult
12905 TreeTransform<Derived>::RebuildCXXPseudoDestructorExpr(Expr *Base,
12906                                                      SourceLocation OperatorLoc,
12907                                                        bool isArrow,
12908                                                        CXXScopeSpec &SS,
12909                                                      TypeSourceInfo *ScopeType,
12910                                                        SourceLocation CCLoc,
12911                                                        SourceLocation TildeLoc,
12912                                         PseudoDestructorTypeStorage Destroyed) {
12913   QualType BaseType = Base->getType();
12914   if (Base->isTypeDependent() || Destroyed.getIdentifier() ||
12915       (!isArrow && !BaseType->getAs<RecordType>()) ||
12916       (isArrow && BaseType->getAs<PointerType>() &&
12917        !BaseType->getAs<PointerType>()->getPointeeType()
12918                                               ->template getAs<RecordType>())){
12919     // This pseudo-destructor expression is still a pseudo-destructor.
12920     return SemaRef.BuildPseudoDestructorExpr(
12921         Base, OperatorLoc, isArrow ? tok::arrow : tok::period, SS, ScopeType,
12922         CCLoc, TildeLoc, Destroyed);
12923   }
12924 
12925   TypeSourceInfo *DestroyedType = Destroyed.getTypeSourceInfo();
12926   DeclarationName Name(SemaRef.Context.DeclarationNames.getCXXDestructorName(
12927                  SemaRef.Context.getCanonicalType(DestroyedType->getType())));
12928   DeclarationNameInfo NameInfo(Name, Destroyed.getLocation());
12929   NameInfo.setNamedTypeInfo(DestroyedType);
12930 
12931   // The scope type is now known to be a valid nested name specifier
12932   // component. Tack it on to the end of the nested name specifier.
12933   if (ScopeType) {
12934     if (!ScopeType->getType()->getAs<TagType>()) {
12935       getSema().Diag(ScopeType->getTypeLoc().getBeginLoc(),
12936                      diag::err_expected_class_or_namespace)
12937           << ScopeType->getType() << getSema().getLangOpts().CPlusPlus;
12938       return ExprError();
12939     }
12940     SS.Extend(SemaRef.Context, SourceLocation(), ScopeType->getTypeLoc(),
12941               CCLoc);
12942   }
12943 
12944   SourceLocation TemplateKWLoc; // FIXME: retrieve it from caller.
12945   return getSema().BuildMemberReferenceExpr(Base, BaseType,
12946                                             OperatorLoc, isArrow,
12947                                             SS, TemplateKWLoc,
12948                                             /*FIXME: FirstQualifier*/ nullptr,
12949                                             NameInfo,
12950                                             /*TemplateArgs*/ nullptr,
12951                                             /*S*/nullptr);
12952 }
12953 
12954 template<typename Derived>
12955 StmtResult
12956 TreeTransform<Derived>::TransformCapturedStmt(CapturedStmt *S) {
12957   SourceLocation Loc = S->getBeginLoc();
12958   CapturedDecl *CD = S->getCapturedDecl();
12959   unsigned NumParams = CD->getNumParams();
12960   unsigned ContextParamPos = CD->getContextParamPosition();
12961   SmallVector<Sema::CapturedParamNameType, 4> Params;
12962   for (unsigned I = 0; I < NumParams; ++I) {
12963     if (I != ContextParamPos) {
12964       Params.push_back(
12965              std::make_pair(
12966                   CD->getParam(I)->getName(),
12967                   getDerived().TransformType(CD->getParam(I)->getType())));
12968     } else {
12969       Params.push_back(std::make_pair(StringRef(), QualType()));
12970     }
12971   }
12972   getSema().ActOnCapturedRegionStart(Loc, /*CurScope*/nullptr,
12973                                      S->getCapturedRegionKind(), Params);
12974   StmtResult Body;
12975   {
12976     Sema::CompoundScopeRAII CompoundScope(getSema());
12977     Body = getDerived().TransformStmt(S->getCapturedStmt());
12978   }
12979 
12980   if (Body.isInvalid()) {
12981     getSema().ActOnCapturedRegionError();
12982     return StmtError();
12983   }
12984 
12985   return getSema().ActOnCapturedRegionEnd(Body.get());
12986 }
12987 
12988 } // end namespace clang
12989 
12990 #endif // LLVM_CLANG_LIB_SEMA_TREETRANSFORM_H
12991